如何确定文件是否为空?

时间:2012-06-13 13:06:41

标签: c file-io

如何确定文件是否为空?该文件由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 / fclose / fopen然后使用{{再次a+ 1}},但我认为可以在不多次打开和关闭文件的情况下执行此操作。

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

因此,您需要在fseek(pFile, 0, SEEK_END)指针上调用FILE

答案 2 :(得分:1)

您可以致电_stat()并将st_size值转换为struct _stat(您不需要打开该文件)。
sys/types.h中声明后跟{{ 1}}
我不了解Windows编程,但它可以帮助您:http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx