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

C语言从文件读取字符串时出现乱码问题求助

解决文件读取后字符串乱码的问题

我来帮你分析下代码里的问题,以及怎么修复:

核心问题分析

你的代码出现乱码主要有两个关键原因:

  • char类型无法正确判断EOF:fgetc()返回的是int类型,EOF的定义是-1。如果用char存储返回值,当系统中char是有符号类型时,-1会被转换成0xFF(一个合法的字符值),导致循环无法正确终止,最后把EOF也当成字符存进了字符串里。
  • 字符串缺少终止符\0:C语言中的字符串必须以\0作为结束标志,printf("%s")会一直读取内存直到遇到\0。你的代码没有添加这个终止符,所以打印时会读到字符串后面的随机内存内容,也就是你看到的乱码。

修复后的代码示例

#include <stdio.h>
#include <stdlib.h>

// 补全myRealloc的合理实现
char* myRealloc(char* array, int size) {
    char* temp = (char*)realloc(array, size * sizeof(char));
    if (temp == NULL) {
        // 内存分配失败的容错处理
        free(array);
        perror("realloc failed");
        exit(EXIT_FAILURE);
    }
    return temp;
}

int main() {
    const char* file = "your_file.txt"; // 替换成你的目标文件名
    int size = 0;
    int ch; // 这里必须用int类型存储fgetc的返回值!
    char* content = NULL;
    FILE* fs = fopen(file, "r");
    
    // 一定要检查文件是否成功打开
    if (fs == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 调整循环逻辑:先读取字符,再判断是否为EOF
    while ((ch = fgetc(fs)) != EOF) {
        size++;
        content = myRealloc(content, size);
        content[size - 1] = (char)ch; // 确认是有效字符再转换为char
    }

    // 给字符串添加终止符,需要额外分配一个字节的空间
    size++;
    content = myRealloc(content, size);
    content[size - 1] = '\0';

    printf("%s", content);

    // 记得释放内存和关闭文件,避免资源泄漏
    free(content);
    fclose(fs);

    return EXIT_SUCCESS;
}

额外的优化建议

  • 减少频繁realloc的开销:如果文件较大,每次循环都调用realloc会影响性能。可以先通过fseek和ftell获取文件大小,一次性分配足够的内存;或者每次扩容时按倍数增长(比如每次翻倍),降低内存分配的次数。
  • 容错处理要到位:内存分配、文件打开这些操作都可能失败,一定要加上错误处理逻辑,避免程序崩溃或出现诡异的行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:17:36