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

