使用fread读取文件内容出现乱码,求问题原因及解决方法
C语言读取文件乱码问题的原因及解决方法
核心原因
fread仅读取文件中的原始字节,不会自动为字符串添加终止符\0。而printf使用%s输出时,必须读取到\0才会停止,否则会继续读取内存中后续的随机垃圾数据,导致输出乱码。- 未检查
fopen的返回值,如果文件打开失败(如路径错误、权限不足),f_fd会是NULL,此时执行fread会触发未定义行为,同样可能导致乱码或程序崩溃。
修复后的代码
#include <stdio.h> #include <stdlib.h> int main(){ char* arr = malloc(64); if (arr == NULL) { perror("malloc failed"); return 1; } FILE* f_fd = fopen("file_txt", "r"); if (f_fd == NULL) { perror("fopen failed"); free(arr); return 1; } // 最多读取63字节,留1个位置存放字符串终止符 size_t read_len = fread(arr, 1, 63, f_fd); arr[read_len] = '\0'; // 手动添加终止符 printf("|%s|\n", arr); fclose(f_fd); free(arr); return 0; }
关键修复说明
- 增加
malloc和fopen的返回值检查,避免空指针操作引发的异常。 - 读取内容时预留1字节空间,手动添加
\0,保证printf能正确识别字符串的结束位置。 - 使用完文件和内存后,调用
fclose和free释放资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者user123454321
相关产品推荐
相关产品推荐

