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

使用fread读取文件后printf输出出现未知字符的问题求助

问题原因及解决方法

你遇到的乱码问题确实出在printf("%s")的使用上,核心原因是:

  • 当fread读满缓冲区(4字节)时,chunks数组里没有C字符串必需的终止符'\0'——你虽然在每次循环开头用memset清空了数组,但fread会覆盖掉数组的全部4个字节,此时chunks不是合法的字符串。
  • printf("%s")会从数组起始位置一直读取内存,直到碰到'\0',这就会读到数组之外的随机内存,导致乱码。

下面给出两种简单的解决方法:

方法1:预留终止符位置

每次读取时少读1个字节,把最后一个位置留给'\0',确保chunks是合法字符串:

f = fopen(host_filename2, "r");

char chunks[4];
int size;
do {
    size = fread(chunks, 1, sizeof chunks - 1, f); // 最多读3个字节
    if (size <= 0) break;
    chunks[size] = '\0'; // 手动添加字符串终止符
    printf("%s", chunks);
} while (size == sizeof chunks - 1); 

fclose(f);

方法2:指定输出长度

不用依赖字符串终止符,直接告诉printf要输出的字符长度,或者用fwrite直接输出:

f = fopen(host_filename2, "r");

char chunks[4];
int size;
do {
    size = fread(chunks, 1, sizeof chunks, f);
    if (size <= 0) break;
    printf("%.*s", size, chunks); // 通过.*指定输出size个字符
    // 也可以用fwrite替代printf:fwrite(chunks, 1, size, stdout);
} while (size == sizeof chunks); 

fclose(f);

额外提醒:如果你的文件是二进制文件,建议用"rb"模式打开(即fopen(host_filename2, "rb")),避免文本模式下的换行符转换等潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:50:20