C语言读取文件时行首字符丢失及行不全问题求助
问题排查与修复方案
我来帮你拆解这两个异常的核心原因,其实都是同一处代码问题导致的:
1. 首字符丢失的根源
你在lireFichier函数里添加的fgetc(f)完全是多余的,而且会直接破坏文件指针的定位:
fgets读取一行内容时,会把换行符\n也包含到缓冲区中,读取完成后,文件指针已经自动移动到下一行的第一个字符位置。- 这时候调用
fgetc(f),会直接读取下一行的首字符并丢弃,导致下一次fgets从首字符的下一个位置开始读,自然就丢失了第一行之后所有行的首字符。
2. system_1.phl无法完整读取的原因
同样是这个多余的fgetc(f)在搞鬼:
- 哈希值文件的每行结构和密码文件一致,这个额外的
fgetc会不断跳过每行的首字符,甚至可能让文件指针提前跳到文件末尾,导致后续fgets读取失败,看起来就像是“无法完整读取”。
修复后的代码
首先移除多余的fgetc(f),另外建议你把fgets读取到的换行符替换成字符串结束符\0,避免后续处理(比如哈希对比)时受到换行符干扰:
修正后的lireFichier函数
#include <string.h> // 需要引入strcspn的头文件 void lireFichier(FILE *f, unsigned char (*resultats)[32]) { int i = 0; if(f){ // 加i<10避免数组越界,因为你只定义了10个元素的数组 while(i < 10 && fgets((char*)resultats[i], sizeof(resultats[i]), f) != NULL) { // 快速定位换行符并替换为字符串结束符 resultats[i][strcspn((char*)resultats[i], "\n")] = '\0'; printf("%s\n", resultats[i]); i++; } } }
补充注意事项
- 确保两个文件的每行内容长度都不超过31个字符(你的数组是32位,需要留一个位置给
\0),如果有更长的行,fgets会自动截断,也会引发读取异常。 - 检查文件末尾是否有多余空行,如果不需要处理空行,可以在循环里加判断,跳过空内容的行。
内容的提问来源于stack exchange,提问作者user9772676
相关产品推荐
相关产品推荐

