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

C++读取文本行存入char**字符串数组时重复输出最后一行问题

问题根因

所有行输出重复最后一行的核心错误是没有做字符串内容拷贝,仅将数组指针指向了临时字符串的内部地址:

  • 构造函数里你确实提前为100行文本各分配了200字节的存储内存,但读取循环里的readBuffer[i] = (char*)tmpString.c_str();操作直接覆盖了readBuffer[i]原本指向已分配内存的指针,既造成了内存泄漏,也让所有数组成员都指向了同一个地址——也就是std::string类型成员tmpString的内部字符存储区。
  • getline每次读取新行时,只会覆盖tmpString内部存储的内容,不会改变它的内存起始地址。等整个读取循环结束,tmpString里存的就是文件最后一行的内容,此时所有readBuffer的指针都指向这块存着最后一行内容的内存,打印自然全是重复的最后一行。
  • 代码另外还有两个隐藏问题:一是文件打开失败的分支没有写返回值,属于未定义行为;二是打印循环用了i <= 5的边界,会访问下标为5的无效内存,容易触发乱码或崩溃。
修复方法

不要直接修改readBuffer[i]的指针指向,而是将读取到的字符串内容拷贝到提前分配好的内存中,修改后的读取逻辑参考:

// 提前引入字符串拷贝函数需要的头文件
#include <cstring>

char** FileReader::ReadFile(const char* filename)
{
    int i = 0;
    File.open(filename);

    if (File.is_open())
    {
        while (getline(File, tmpString))
        {
            // 用strncpy限制拷贝长度,避免单行太长超过200字节的分配上限造成溢出
            strncpy(readBuffer[i], tmpString.c_str(), 199);
            // 手动补字符串结束符
            readBuffer[i][199] = '\0';
            i++;
            // 加边界判断,防止行数超过提前分配的100行上限造成数组越界
            if (i >= 100) {
                break;
            }
        }
        // 读取完成后记得关闭文件句柄
        File.close();
        return readBuffer;
    }
    // 文件打开失败时返回空指针,避免未定义行为
    return nullptr;
}

打印时调整循环边界,5行内容对应下标0到4,不要越界访问:

for (int i = 0; i < 5; i++)
{
    cout << fileCpy[i] << endl;
}

提示:纯C++场景下更推荐直接用std::vector<std::string>存储读取到的行内容,不需要手动管理内存分配释放,从根源上避免指针指向错误、内存泄漏、缓冲区溢出这类问题。

内容的提问来源于stack exchange,提问作者SNO。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:39:50