[英]C File Manipulation via shell execution of “cat”
[編輯]-答案如下所述,我應該使用fclose而不是close。
C庫的system()
函數對我來說出乎意料。 錯誤的一個玩具示例如下。
我有一個包含三行數據的數據文件“ file_2.txt”
file 2 line 1
file 2 line 2
file 2 line 3
以下C程序將此數據附加到文件_1.txt(該程序內置的文件)中
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE *fname = fopen("file_1.txt","w");
fprintf(fname,"file 1 line 1\n");
fprintf(fname,"file 1 line 2\n");
fprintf(fname,"file 1 line 3\n");
fprintf(fname,"file 1 line 4\n");
fprintf(fname,"file 1 line 5\n");
close(fname);
system("cat file_2.txt >> file_1.txt");
system("cat file_1.txt");
}
我希望輸出是
file 1 line 1
file 1 line 2
file 1 line 3
file 1 line 4
file 1 line 5
file 2 line 1
file 2 line 2
file 2 line 3
但我只是得到
file 2 line 1
file 2 line 2
file 2 line 3
file_1.txt的行發生了什么情況?
使用fclose(fname)
而不是close(fname)
。 close()
函數需要一個文件描述符 ,它是一個整數,而不是FILE *
。 您需要使用fclose()
函數來關閉使用fopen()
打開的文件。
fprintf()
是一個libC函數,它將緩沖層置於系統調用write()
前面。 使用fprintf()
添加數據時,它可能會存儲在用戶空間緩沖區中,直到有足夠的數據為止,因此值得進行系統調用。 通過調用close()
系統調用,可以在操作系統級別關閉文件,而libC沒有機會刷新與文件關聯的緩沖區中的所有未完成數據。
編輯 :此外, fclose()
將FILE指針作為參數,而close()
需要一個文件句柄號,因此在您的程序中close()
實際上試圖關閉垃圾,然后程序結束,而沒有給libC一個等待數據的機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.