首页 > 解决方案 > 如何使用 fread() 检测文件的结尾,然后在读取二进制文件时完成循环?(不要使用feof)——C语言

问题描述

我正在编写一个读取二进制文件的代码,分别读取每个结构字段,打印出结果,然后在文件读取结束时停止。

仅供参考 - 二进制文件包含多个具有相同结构字段的记录

我可以弄清楚如何使用 feof 来做到这一点。但是,我想只使用 fread() 函数(没有 feof)来运行这段代码。我被告知要找到 fread 返回值来检测文件的结尾,但我正在努力如何去做。

如果有其他方法可以做到这一点,请帮助我。下面是代码

#define MAX_CT 11
#include<stdio.h>
#include<stdlib.h>

//struct variables
struct test
{
    short int a;
    double b;
    short int c;
    int d;
    float e;
    unsigned short f;
    unsigned char g;
    double h;
    unsigned long i;
    short int j;
    char k;
    int l;
    int m;
    int n;
    char o[MAX_CT];
    char p;
    double q;
};

int main(int argc, char **argv)
{
    struct test a1;
    
    FILE *fp;
    
        //Input Checking Error
        if (argc < 2) {
                fprintf(stderr, "Usage: %s input_file\n", argv[0]);
                exit(1);
        }
    
        //binary file to open for reading
        fp = fopen(argv[1], "rb");
    
        //File Checking Error
        if (fp == NULL){fprintf(stderr, "Cannot open the file %s\n", 
                        argv[1]);
                        exit(1);
        }
    
    //Print the field names
    printf("a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q \n");
    
    //Allocate values into struct using fread
    
    while(1) 
    {
        fread(&a1.a, sizeof(a1.a), 1, fp);
        fread(&a1.b, sizeof(a1.b), 1, fp);
        fread(&a1.c, sizeof(a1.c), 1, fp);
        fread(&a1.d, sizeof(a1.d), 1, fp);
        fread(&a1.e, sizeof(a1.e), 1, fp);
        fread(&a1.f, sizeof(a1.f), 1, fp);
        fread(&a1.g, sizeof(a1.g), 1, fp);
        fread(&a1.h, sizeof(a1.h), 1, fp);
        fread(&a1.i, sizeof(a1.i), 1, fp);
        fread(&a1.j, sizeof(a1.j), 1, fp);
        fread(&a1.k, sizeof(a1.k), 1, fp);
        fread(&a1.l, sizeof(a1.l), 1, fp);
        fread(&a1.m, sizeof(a1.m), 1, fp);
        fread(&a1.n, sizeof(a1.n), 1, fp);
        fread(&a1.o, sizeof(a1.o), 1, fp);
        fread(&a1.p, sizeof(a1.p), 1, fp);
        fread(&a1.q, sizeof(a1.q), 1, fp); 
        
        //if file reading reaches the end, stop the loop 
        //(without feof, is there any other way to finish the loop using fread()????

        if(feof(fp)){
            break;
        }
        
    //Print results
    printf("%d, %f, %i, %d, %f, %d, %d, %f, %lu, %i, %i, %i, %i, %x, %s, %c, %f\n", a1.a, a1.b, 
           a1.c, a1.d, a1.e, a1.f, a1.g, a1.h, a1.i, a1.j, a1.k, a1.l, a1.m, a1.n, a1.o, a1.p, 
           a1.q);
    
    }
    
    //close the file
    fclose(fp);
        
    return 0;
}

标签: c

解决方案


我更喜欢

int c = fgetc(filehandle);

所以,我可以检查:

int c = fgetc(filehandle);
if (c == EOF) {
  fclose(filehandle);
  exit(0);
}

注意:对于 EOF,您也可以使用 '\0'。不要使用退出(0);在现代程序中。试着设计一个程序逻辑,只需要“return ERROR;” 或“返回成功;” 因为如果“exit”是嵌套的,你会遇到一些麻烦,而且你不知道源代码中的位置。因此,好主意是在部署工作之前进行“strace”和调试。


推荐阅读