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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:37