[英]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_size
到struct _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.