8

如何确定文件是否为空?该文件由在 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并且标题被打印多次。

我知道我可以fopen使用r并使用fseek//然后再次使用ftell,但我认为可以在不多次打开和关闭文件的情况下执行此操作。fclosefopena+

4

3 回答 3

6

实际上,当fopen以追加模式读取文件时,文件指针最初位于文件的开头。一旦你写了一些东西或使用它,它就会移动到它的末尾fseek

我只需要fseek(report_csv, 0, SEEK_END);在我的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.
于 2012-06-13T13:41:11.387 回答
2

fopen使用with模式打开文件时a+,所有的写入操作都将在文件末尾执行。您可以将内部指针重新定位到文件中的任何位置以进行读取,但写入操作会将其移回文件末尾。读取的初始指针位置在文件的开头。

所以你需要fseek(pFile, 0, SEEK_END)在你的FILE指针上调用一个。

于 2012-06-13T13:50:42.947 回答
1

您可以调用_stat()并将值st_size放入struct _stat(您不需要打开文件)。
sys/types.h后面声明sys/stat.h
我不知道 Windows 编程,但它可以帮助你:http: //msdn.microsoft.com/en-us/library/14h5k7ff.aspx

于 2012-06-13T13:34:39.790 回答