gpt4 book ai didi

c - 如何使用 fread() 检测文件结尾然后在读取二进制文件时完成循环? (不要使用feof)——C语言

转载 作者:行者123 更新时间:2023-12-05 08:13:20 25 4
gpt4 key购买 nike

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

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

我可以弄清楚如何使用 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;
}

最佳答案

我更喜欢

int c = fgetc(filehandle);

所以,我可以检查:

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

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

关于c - 如何使用 fread() 检测文件结尾然后在读取二进制文件时完成循环? (不要使用feof)——C语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69112181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com