我目前有代码读取4行,我希望能够改变它直到EOF或我的MAX const int值。我无法让EOF工作正常,并且想知道如何更改我的代码才能完成此任务?
提前致谢
#include <stdio.h>
struct record{
char name[2];
int arrival_time;
int job_length;
int job_priority;
};
const int MAX = 40;
int main(void)
{
struct record jobs[MAX];
int i = 0;
int j;
FILE *f = fopen("data.dat","rb");
while (fscanf(f, "%s %d %d %d", &jobs[i].name, &jobs[i].arrival_time,
&jobs[i].job_length, &jobs[i].job_priority) == 4 && i < MAX)
i++;
for (j = 0; j < i; j++)
printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time,
jobs[j].job_length, jobs[j].job_priority);
fclose(f);
return(0);
}
答案 0 :(得分:5)
像
这样的东西while (fscanf(f, " %s ", &etc) != EOF) {
}
然后使用feof(f)
检查是fscanf
错误还是实际EOF
。
答案 1 :(得分:2)
您的代码似乎符合您的要求,但:
char name[2];
名称可能超过1个字符。
FILE *f = fopen("data.dat","rb");
您似乎在阅读文本("r"
)文件,而非二进制文件("rb"
)。
&jobs[i].name
应为jobs[i].name
答案 2 :(得分:1)
您需要更改while()
循环中测试的顺序 - 您必须在调用i < MAX
之前测试fscanf()
,否则您可能会多次调用它(你应该在没有jobs[i].name
到&
的情况下通过fscanf
):
while (i < MAX && fscanf(f, "%s %d %d %d", jobs[i].name, &jobs[i].arrival_time,
&jobs[i].job_length, &jobs[i].job_priority) == 4)
答案 3 :(得分:1)
过时的,我会这样编码:
for(i=0 ; i<MAX ; ++i) {
fscanf(f, "%s %d %d %d", &jobs[i].name, &jobs[i].arrival_time,
&jobs[i].job_length, &jobs[i].job_priority);
if(ferror(f) || feof(f)) break;
}
关键点是,据我所知,如果不尝试读取文件,您将不知道文件即将结束。这就是为什么我在读取数据后检查feof()和ferror()的原因。 在循环结束时,变量i包含读取数据的数量