c - 如何使用 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;
}
解决方案
我更喜欢
int c = fgetc(filehandle);
所以,我可以检查:
int c = fgetc(filehandle);
if (c == EOF) {
fclose(filehandle);
exit(0);
}
注意:对于 EOF,您也可以使用 '\0'。不要使用退出(0);在现代程序中。试着设计一个程序逻辑,只需要“return ERROR;” 或“返回成功;” 因为如果“exit”是嵌套的,你会遇到一些麻烦,而且你不知道源代码中的位置。因此,好主意是在部署工作之前进行“strace”和调试。
推荐阅读
- ios - 在不同部分的单元格中添加多个复选标记并将其状态保存在swift ios中
- javascript - 将数组发布到 ASP NET MVC 控制器
- excel - 无法从 Selenium VBA 中的下拉“日期选择器”(YYYY/MM/DD)中选择日历日期
- arrays - 我有一个 mongodb 查询,我想找到完全匹配的单词“Approved”
- symfony - 如何将两个单选按钮(RadioType)与 Symfony 5 链接?
- python - 如何从 python 列表中获取 5 个最接近的整数?
- node.js - 在 React 中发布数据 onClick
- mongodb - 如何在 MongoDB 聚合中添加自动递增字段?
- python - 在python中为多个变量分配多个值的问题
- python - 如何从 matpotlib 的子图中删除条形图?