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

如何为多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:54:02