读取文本文件到动态数组代码异常:输出乱码问题求助
代码错误分析与修复
核心问题与解决要点
- 路径转义错误:Windows路径中的反斜杠
\需转义为\\,否则编译器会将\U、\C等解析为无效转义序列,导致文件路径识别失败。原路径应修改为"C:\\Users\\varga\\CLionProjects\\untitled3\\subor.txt"。 - 文件打开失败未终止程序:
fopen返回NULL时,仅打印错误却继续执行后续代码,会触发空指针操作的未定义行为。需在打印错误后调用exit(EXIT_FAILURE)终止程序。 - 字符统计逻辑错误:第一个循环中,每次
getc读取字符后又调用fgetc,相当于跳过一个字符,导致统计的total仅为实际字符数的一半,同时丢失大量内容。需删除多余的fgetc(file),直接对读取到的字符计数。 - 内容读取逻辑错误:第二个循环同样重复读取,
getc判断EOF后用fgetc读取下一个字符存入数组,最终数组只存储原文件中每隔一个的字符,造成内容混乱。应直接将getc读取的字符存入数组。 - 字符串结束符错误:
string[index - 1] = "\0";中,"\0"是字符串指针,不能赋值给char变量,需改用字符常量'\0'。同时malloc需分配total + 1字节空间(预留结束符位置),避免越界写入。 getc返回值类型错误:getc返回值为int类型(包含EOF的-1值),用char存储会导致ASCII值为0xFF的字符被误判为EOF,提前终止读取。需将c的类型改为int。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main() { FILE* file = fopen("C:\\Users\\varga\\CLionProjects\\untitled3\\subor.txt", "r"); if (file == NULL) { printf("Error opening file\n"); exit(EXIT_FAILURE); } size_t total = 0; int c; while ((c = getc(file)) != EOF) { total++; } char *string = malloc(total + 1); if (string == NULL) { printf("Memory allocation failed\n"); fclose(file); exit(EXIT_FAILURE); } rewind(file); size_t index = 0; while ((c = getc(file)) != EOF) { string[index] = (char)c; index++; } string[index] = '\0'; fclose(file); printf("File contents: \n\n"); printf("%s\n", string); free(string); return 0; }
内容的提问来源于stack exchange,提问作者wictor33
相关产品推荐
相关产品推荐

