簡體   English   中英

通過“ cat”的shell執行C文件操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM