如何确定文件是否为空?该文件由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}},但我认为可以在不多次打开和关闭文件的情况下执行此操作。
答案 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