C++自定义函数中使用for循环读取文件报错问题求助
问题根因
- 全局变量
linesOfFile属于未显式初始化的全局整型,默认值为0。你在全局作用域直接执行string *fileContent = new string[linesOfFile];时,linesOfFile还未被赋值为实际文件行数,此时申请的数组长度为0。后续在readFile中向这个长度为0的数组写入内容,属于典型的堆内存越界访问,直接导致程序崩溃。 - 额外逻辑问题:你当前
lineCounter的行数统计逻辑是错误的:用>>运算符读取的是空白符分隔的单词,不是文件的行;且do-while(!file.eof())的写法会多统计一次内容,最后会把eof触发的无效读入也算成一行。
修复方案
快速适配原有逻辑
- 删掉全局作用域的
string *fileContent = new string[linesOfFile];语句,只保留string *fileContent;的指针声明。 - 在
main函数中调用完lineCounter拿到有效行数后,再执行内存申请:
lineCounter(pathToFile); cout << linesOfFile; fileContent = new string[linesOfFile]; // 此时linesOfFile已经是有效数值 readFile(pathToFile);
更安全的优化方案
建议直接用std::vector<std::string>代替手动管理的动态数组,无需提前统计行数,也不需要手动释放内存,代码更简洁不易出错:
- 删掉
linesOfFile、fileContent全局变量,替换为vector<string> fileContent; - 不需要单独的
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
相关产品推荐
相关产品推荐

