簡體   English   中英

如何確定文件是否為空?

[英]How can I determine if a file is empty?

如何確定文件是否為空? 該文件由Windows平台上運行的C程序打開。 我想以追加模式打開文件,如果為空,首先打印一個標題。

// Open CSV & write header
report_csv = fopen("SNR.csv", "a+");
if (!report_csv) {
    fprintf(stderr, "Unable to open CSV output file...");
    return -1;
}
if (!ftell(report_csv)) {
    fprintf(report_csv, "Column A;Column B;Column C\n");
}
// ... print data to file
fclose(report_csv);

如果文件不為空,我期望ftell返回當前文件大小,這是因為上面的代碼是循環的。

但是, ftell始終返回0並且標題被多次打印。

我知道我可以用r fopen它並使用fseek / ftell / fclose然后用a+再次fopen它,但我認為可以在不打開和關閉文件的情況下多次執行此操作。

實際上,當在附加模式下fopen文件時,文件指針最初位於文件的開頭。 一旦你寫東西或使用fseek ,它就會移動到它的末尾。

我只需要添加fseek(report_csv, 0, SEEK_END); 在我的if (!ftell(report_csv))之前if (!ftell(report_csv))

我們來看看吧。
代碼

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *test;
    size_t size;
    char buf[100];

    /* Truncate file */
    test = fopen("test", "w");
    if (!test) {
        fprintf(stderr, "Cannot open file `test`!\n");
        return 1;
    }

    /* Write something */
    fprintf(test, "Something. ");
    fclose(test);

    /* Open in append */
    test = fopen("test", "a+");
    if (!test) {
        fprintf(stderr, "Cannot open `test` in append mode!\n");
        return 1;
    }

    /* Try to get the file size */
    size = ftell(test);
    printf("File pointer is: %d\n", size);
    fseek(test, 0, SEEK_END);
    size = ftell(test);
    printf("After `fseek(test, 0, SEEK_END)`, the file pointer is: %d\n", size);

    /* Append */
    fprintf(test, "And that. ");
    fclose(test);

    /* Same without fseek */
    test = fopen("test", "a+");
    if (!test) {
        fprintf(stderr, "Cannot open `test` in append mode!\n");
        return 1;
    }
    fprintf(test, "Hello! ");
    size = ftell(test);
    printf("File size is now: %d\n", size);
    fclose(test);

    /* Try to read */
    test = fopen("test", "r");
    if (!test) {
        fprintf(stderr, "Unable to open `test` for reading!\n");
        return 1;
    }
    printf("File contents:\n\t");
    while (test && !feof(test)) {
        fgets(buf, sizeof(buf), test);
        printf("%s", buf);
    }

    /* Cleanup & exit */
    fclose(test);
    printf("\n\nExiting.\n");

    return 0;
}

輸出

File pointer is: 0
After `fseek(test, 0, SEEK_END)`, the file pointer is: 11
File size is now: 28
File contents:
        Something. And that. Hello!

Exiting.

使用a+模式使用fopen打開文件時,將在文件末尾執行所有寫入操作。 您可以將內部指針重新定位到文件中的任何位置以進行讀取,但寫入操作會將其移回文件末尾。 用於讀取的初始指針位置位於文件的開頭。

所以你需要在你的FILE指針上調用一個fseek(pFile, 0, SEEK_END)

您可以調用_stat()並將值st_sizestruct _stat (您不需要打開該文件)。
sys/types.h聲明,后跟sys/stat.h
我不懂Windows編程,但它可以幫到你: http//msdn.microsoft.com/en-us/library/14h5k7ff.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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