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
相关产品推荐
相关产品推荐

