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

C++自定义函数中使用for循环读取文件报错问题求助

问题根因
  • 全局变量linesOfFile属于未显式初始化的全局整型,默认值为0。你在全局作用域直接执行string *fileContent = new string[linesOfFile];时,linesOfFile还未被赋值为实际文件行数,此时申请的数组长度为0。后续在readFile中向这个长度为0的数组写入内容,属于典型的堆内存越界访问,直接导致程序崩溃。
  • 额外逻辑问题:你当前lineCounter的行数统计逻辑是错误的:用>>运算符读取的是空白符分隔的单词,不是文件的行;且do-while(!file.eof())的写法会多统计一次内容,最后会把eof触发的无效读入也算成一行。
修复方案

快速适配原有逻辑

  1. 删掉全局作用域的string *fileContent = new string[linesOfFile];语句,只保留string *fileContent;的指针声明。
  2. 在main函数中调用完lineCounter拿到有效行数后,再执行内存申请:
lineCounter(pathToFile);
cout << linesOfFile;
fileContent = new string[linesOfFile]; // 此时linesOfFile已经是有效数值
readFile(pathToFile);

更安全的优化方案

建议直接用std::vector<std::string>代替手动管理的动态数组,无需提前统计行数,也不需要手动释放内存,代码更简洁不易出错:

  1. 删掉linesOfFile、fileContent全局变量,替换为vector<string> fileContent;
  2. 不需要单独的lineCounter函数,直接在读取文件时逐行存入vector即可,示例代码:
void readFile(string pathToFile)
{
    ifstream file(pathToFile);
    string line;
    if (file.is_open())
    {
        while(getline(file, line))
        {
            fileContent.push_back(line);
        }
        file.close();
    }
    else
        cout << "A critical error occurred" << endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:36:03