C语言while循环读取文件时如何正确判断EOF避免数据丢失
解决fscanf循环读取时的EOF判断问题
你的问题根源在于用了两个独立的fscanf调用——一个读数据,一个专门检测EOF,这会导致每次循环里实际执行了两次读取操作,自然就跳过了一半的数据。
正确的做法是把用于读取数据的fscanf直接作为while循环的判断条件,因为fscanf的返回值有两个关键情况:
- 返回成功读取并赋值的变量个数(比如你读3个字段,成功的话返回3)
- 当遇到EOF或者读取失败时,返回
EOF
这样一来,每次循环只执行一次读取操作,既完成了数据读取,又能在遇到EOF时自动终止循环,完美解决丢数据的问题。
举个具体的代码例子(假设你的患者结构体是这样的):
typedef struct Patient { int id; char name[50]; int age; struct Patient *next; } Patient; // 链表头节点 Patient *head = NULL; FILE *fp = fopen("patients.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return 1; } Patient *temp; int id, age; char name[50]; // 核心:把fscanf放在while条件里 while (fscanf(fp, "%d %s %d", &id, name, &age) != EOF) { // 分配内存创建新节点 temp = (Patient*)malloc(sizeof(Patient)); if (temp == NULL) { perror("Failed to allocate memory"); fclose(fp); return 1; } // 给结构体赋值 temp->id = id; strcpy(temp->name, name); temp->age = age; temp->next = NULL; // 插入链表(这里假设是尾插法,你可以根据自己的需求调整) if (head == NULL) { head = temp; } else { Patient *current = head; while (current->next != NULL) { current = current->next; } current->next = temp; } } fclose(fp);
额外提醒几个注意点:
- 一定要检查
fopen和malloc的返回值,避免空指针错误 - 如果你的数据格式里有空格(比如患者姓名是全名,带空格),
%s就不适用了,得换成%[^\n]这类格式符,同时要注意处理换行符的问题 - 循环结束后记得关闭文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

