You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:02