C语言写入文件的文本为何变为中文乱码?新手技术求助
问题分析与解决
你的代码存在两处核心问题,同时中文乱码源于编码不匹配,以下是具体修复方案:
代码中的明显错误
- 第二次调用
fopen读文件时,未将返回的文件指针赋值给fptr,后续用写模式的指针读取属于未定义行为,会导致读取异常。 - 写入文件后未关闭或刷新缓冲区就直接读取,内存中的数据可能还未同步到磁盘,读取结果不可靠。
中文乱码的本质与修复
Windows环境下,默认文件编码为GBK,而控制台或代码中常用UTF-8编码,两者不匹配就会出现乱码。以下是修复后的完整代码:
#include <stdio.h> #include<stdlib.h> int main() { // 以UTF-8编码打开文件写入 FILE *fptr = fopen("C:\\Users\\USER\\Downloads\\text.txt", "w,ccs=UTF-8"); if (fptr == NULL) { perror("打开文件失败"); return 1; } // 写入中文与英文内容 fprintf(fptr, "你好,世界\nHello World\n"); fclose(fptr); // 关闭文件确保数据写入磁盘 // 以UTF-8编码打开文件读取 fptr = fopen("C:\\Users\\USER\\Downloads\\text.txt", "r,ccs=UTF-8"); if (fptr == NULL) { perror("打开文件失败"); return 1; } char input[100]; while (fgets(input, 100, fptr) != NULL) { printf("%s", input); } fclose(fptr); return 0; }
关键修复点
- 强制指定编码:在
fopen的模式参数后添加,ccs=UTF-8,让文件以UTF-8编码读写,统一编码避免乱码。 - 正确管理文件指针:每次打开文件后检查指针是否为空,切换读写模式时必须重新赋值指针并关闭旧指针。
- 添加错误处理:用
perror输出文件打开失败的原因,方便排查问题。
额外提示
如果控制台输出中文仍乱码,可在代码开头添加system("chcp 65001");,将控制台编码切换为UTF-8,与文件编码保持一致。
内容的提问来源于stack exchange,提问作者deon junior
相关产品推荐
相关产品推荐

