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

fgetc()操作FILE流出现异常字符丢失问题求助

问题根源

你遇到的字符丢失问题,核心原因是**getchar()函数的行为**——它默认从stdin读取字符,和你传入函数的FILE* in参数完全无关。

看你提供的最小复现代码:

  • 在next_struct和get_struct_c里,你用getchar()做EOF检查,但这个函数不管你传入的是diff(也就是你的changes指针),都会直接从标准输入stdin读字符。这就导致每次调用这两个函数,都会额外消耗stdin里的一个字符,两次调用就丢失2个。
  • 注释掉EOF检查后,getchar()不再执行,自然就不会消耗stdin的字符了。
解决方案

把代码里的getchar()替换成fgetc(in),用传入的文件指针来读取,这样就只会从你指定的changes(也就是diff)流里读取,不会影响stdin:

修改后的next_struct函数:

int next_struct(MYSTRUCT *s, FILE *in) {
    int current_c = fgetc(in);
    int eof_check= current_c;

    // 替换getchar()为fgetc(in)
    if ((eof_check = fgetc(in)) != EOF) {
        //do stuff here
    }
    else {
        return EOF;
    }

    //do more stuff

    return 0;
}

修改后的get_struct_c函数:

int get_struct_c(MYSTRUCT *s, FILE *in) {
    int c = fgetc(in);
    int eof_check2= c;
    // 同样替换为fgetc(in)
    if ((eof_check2 = fgetc(in)) != EOF) {
        //do stuff
    }
    else {
        return EOF;
    }

    return character;
}
额外注意事项
  • 你代码里while (!feof(diff))的写法是C语言常见错误:feof只有在已经尝试读取并失败后才会置位,容易导致最后一次循环重复执行或处理错误。建议改成用读取函数的返回值判断循环结束,比如:
    while (next_struct(s,diff) == 0) {
        hunk_c = get_struct_c(s,diff);
        read_c = fgetc(in);
        fprintf(stderr, "%c\n", read_c);
    }
    
  • fgetc返回的是int类型(需容纳EOF这个特殊值),不要直接赋值给char类型变量,避免出现判断错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:20