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

