如何为多个fptg_*.txt文本文件分别维护独立的读取位置?
解决方案
核心问题为所有文件共用了同一个偏移量存储变量,导致偏移量串用,只需为每个文件单独维护专属的读取偏移量即可,同步修复原代码中资源泄漏、脏数据读取的问题。
核心修改点
- 将原单一
pos变量改为偏移量数组,每个下标对应一个文件的专属读取位置,初始值全部设为0 - 修正
fseek的定位模式为SEEK_SET,每次打开文件后从文件起始位置跳转至上次记录的偏移,逻辑更严谨 - 增加
fgets、sscanf的返回值判断,避免读到文件末尾或格式错误行时读取脏数据 - 补充
fclose调用,避免文件描述符资源泄漏
修改后完整代码
#include <stdio.h> #define MAX_LINE_LENGTH 1024 // 可根据实际文件行长度调整 int main(int argc, char **argv) { char line[MAX_LINE_LENGTH] = {0}; int src, dest; int rollnumber; double gentime; int i; // 偏移数组,下标1对应fptg_1.txt,下标2对应fptg_2.txt,初始值均为0 unsigned long pos[3] = {0}; FILE *file; double Time; for (Time = 12.0; Time < 60.0; Time += 12.0) { for (i = 1; i <= 2; i++) { char to_open[32]; snprintf(to_open, sizeof(to_open), "fptg_%d.txt", i); printf("\n\nFPTG_%d.txt\n", i); if ((file = fopen(to_open, "r")) == NULL) { perror("fopen失败"); break; } // 跳转到当前文件的上次读取位置 fseek(file, pos[i], SEEK_SET); // 判断是否成功读到行 if (fgets(line, sizeof(line), file) == NULL) { printf("已到达文件末尾\n"); fclose(file); continue; } int parse_ret = sscanf(line, "%d %d %d %lf", &rollnumber, &src, &dest, &gentime); printf("%s", line); printf("%d\n", parse_ret); // 仅当成功解析到全部4个字段时做后续处理 if (parse_ret == 4) { printf("gentime=%.1f\n", gentime); // 保存当前文件的最新偏移 pos[i] = ftell(file); if (gentime < Time) { printf("ok\n"); printf("Time=%0.1f\n", Time); } } fclose(file); } } return 0; }
内容的提问来源于stack exchange,提问作者wajaap
相关产品推荐
相关产品推荐

