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

C语言编程:如何实现每次进入while循环时读取文本文件的下一行

问题修复方案

你当前代码的核心问题是文件打开操作放在了Time循环的内层,每一轮时间片迭代都会重新打开对应编号的文本文件,文件指针会自动重置到文件开头,自然就会重复读取之前已经处理过的行。

具体修改要点

  • 提前打开所有需要用到的文件,用数组保存每个文件对应的文件指针,全程复用同一个指针即可。C标准库的文件指针会自动记录上次读取的位置,下次调用fscanf就会从下一行开始读,不需要额外处理偏移
  • 调整fscanf的执行顺序,避免跳过符合条件的首行数据
  • 所有逻辑执行完成后统一关闭文件,避免资源泄漏

修正后代码示例

// 提前定义文件指针数组,对应i=5/6/7三个文件
FILE *fr_arr[3];
int insertedpackets[8] = {0}; // 确保计数变量初始化
int rollnumber, src, dest;
double gentime, Time;
int i;

// 先打开所有需要的文件,放在循环最外层
for(i=5;i<8;i++){
    char to_open[32];
    snprintf(to_open,32, "fptg_%d.txt", i);
    if ((fr_arr[i-5] = fopen(to_open, "r")) == NULL) {
        fr_arr[i-5] = NULL;
    }
}

// 原时间片循环
for(Time=0.0;Time<200;Time=Time+12.0) {
    for(i=5;i<8;i++){
        FILE *fr = fr_arr[i-5];
        // 文件打开失败/已经插满10条就跳过
        if(fr == NULL || insertedpackets[i] >= 10) {
            continue;
        }
        printf("i=%d\n", i);

        // 接续上次的位置读取
        while(fscanf(fr, "%d %d %d %lf",&rollnumber, &src, &dest, &gentime) == 4) {
            if(gentime >= Time) {
                // 不满足时间条件,将指针回退到当前行开头,下次循环继续判断
                // 因为你每行格式固定,直接回退固定长度即可,也可以用变量缓存当前行数据避免倒回指针
                fseek(fr, -30, SEEK_CUR); 
                break;
            }
            // 符合条件就插入
            printf ("-------------TIMESLOT-------------\n");
            printf("time: %.1f\n",Time);
            insert(rollnumber,src,dest,gentime); 
            insertedpackets[i]++;
            printf("insertedpackets[%d]:%d\n\n", i, insertedpackets[i]); 
            printf ("----------list till now-----------\n");
            display();
            printf ("----------------------------------\n\n\n\n");
            if(insertedpackets[i] >= 10) {
                break;
            }
        }
    }
}

// 最后统一关闭文件
for(i=0;i<3;i++){
    if(fr_arr[i] != NULL) {
        fclose(fr_arr[i]);
    }
}

补充说明

fscanf会自动跳过换行、空格等空白符,你不需要把整行读为字符串,直接按格式读4个元素即可,完全符合你的需求。

内容的提问来源于stack exchange,提问作者wajaap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:03