在C语言中检查文件是否为空

3

我想检查我的文本文件是否包含数据。如果文件包含数据,我想读取它。我的问题是我不知道在if语句中应该写什么条件。 提示:我尝试使用fseek和ftell函数,但没有任何效果。 我想知道为什么在if语句中的这个条件不能正常工作?

    FILE *fptr;
  if(ftell(fptr)!=0){   //check if the file is not empty.
    if ( !( fptr = fopen( "saving.txt", "r" ))){
        printf( "File could not be opened to retrieve your data from it.\n" );
    }
    else{
        while ( !feof( fptr ) ){
            fscanf( fptr, "%f\n", &p.burst_time );
            AddProcess(&l,p.burst_time);
        }
        fclose( fptr );
    }
   }

1
https://dev59.com/oHVD5IYBdhLWcg3wWKPc - Iłya Bursov
3个回答

6

它无法工作是因为您首先需要使用fopen并fseek到结尾:

FILE *fptr;
if ( !( fptr = fopen( "saving.txt", "r" ))){
    printf( "File could not be opened to retrieve your data from it.\n" );
}
else {
    fseek(fptr, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(fptr);
    if (len > 0) {  //check if the file is empty or not.
        rewind(fptr);
        while ( !feof( fptr ) ){
            fscanf( fptr, "%f\n", &p.burst_time );
            AddProcess(&l,p.burst_time);
        }
    }
    fclose( fptr );
}

它在判断文件是否为空方面表现良好,但对于从文件中读取数据有影响。它使得fscanf读取到类似垃圾的内容。当我移除这些代码行时,从文件中读取就正常了: fseek(fptr, 0, SEEK_END); unsigned long len = (unsigned long)ftell(fptr); if (len > 0) { //检查文件是否为空。 请帮助我。 - Hossam Atef El-Esseily
很遗憾,它还没有工作。 - Hossam Atef El-Esseily
请编写完整的正确代码。 - Hossam Atef El-Esseily
我测试了代码,它可以处理只包含浮点数的文件。因此,请发布您文件的内容。 - h3n
我的文件之前的代码:fseek(fptr, 0, SEEK_END); unsigned long len = (unsigned long)ftell(fptr); if (len > 0) { //检查文件是否为空。结果为:1.000000之后的代码为:1.000000 3772238817795027700000000000000000.000000 - Hossam Atef El-Esseily
显示剩余2条评论

3
调用 ftell() 函数不能告诉你文件的大小,它只能告诉你文件位置指针的当前值。当你第一次打开文件时,文件位置指针的初始值为0。
使用 sys/stat.h 并调用 st_size 成员的值,如果其值为0,则表示文件为空。
所以基本上,
#include <sys/stat.h>
char* filename; //I'm assuming this was defined somewhere earlier in your code
FILE *fptr;
struct stat fileStat;
stat(filename, &fileStat)

if( fileStat.st_size !=0 ){   //check if the file is not empty.
    if ( !( fptr = fopen( "saving.txt", "r" ))){
        printf( "File could not be opened to retrieve your data from it.\n" );
    }
    else{
        while ( !feof( fptr ) ){
            fscanf( fptr, "%f\n", &p.burst_time );
            AddProcess(&l,p.burst_time);
        }
    fclose( fptr );
}

希望这能帮到你。


FILE *fptr; if ( !( fptr = fopen( "saving.txt", "r" ))){ printf( "无法打开文件以检索数据。\n" ); } else { fseek(fptr, 0, SEEK_END); unsigned long len = (unsigned long)ftell(fptr); if (len > 0) { //检查文件是否为空。 rewind(fptr); while ( !feof( fptr ) ){ fscanf( fptr, "%f\n", &p.burst_time ); AddProcess(&l,p.burst_time); } } fclose( fptr ); } 它告诉我文件是否为空,但它会影响从文件中读取。这会导致fscanf读取类似垃圾的内容。 - Hossam Atef El-Esseily

1
你可以使用 fseek 到文件末尾,然后检查 ftell 是否返回 0
bool isEmpty(FILE *file){
    long savedOffset = ftell(file);
    fseek(file, 0, SEEK_END);

    if (ftell(file) == 0){
        return true;
    }

    fseek(file, savedOffset, SEEK_SET);
    return false;
}

或者您可以使用sys/stat.h并调用st_size结构成员的值:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main (int argc, char *argv[]) {
   if (argc != 2) {
   return EXIT_FAILURE;
   }

   const char *filename = argv[1];
   struct stat st;

   if (stat(filename, &st) != 0) {
       return EXIT_FAILURE;
   }
   fprintf(stdout, "file size: %zd\n", st.st_size);
   return EXIT_SUCCESS;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接