C++程序搜索文本文件字符串时占用资源过高无响应如何解决?
问题产生原因
- 未判断文件打开状态:如果
FileToRead.txt不存在、路径错误或者程序无读取权限,ifFile会直接处于无效状态,后续getline调用会持续失败,strLineToRead内容不会更新,循环条件永远满足,直接进入死循环,占用大量CPU资源导致程序无响应。 - 循环未加流有效性判断:即使文件打开成功,如果遍历完整个文件都没有找到目标字符串
blabla,getline读取到文件末尾(EOF)后会持续返回失败,strLineToRead会停留在最后一行的内容,只要最后一行没有目标串,循环就会一直执行,进入死循环。
解决方法
- 打开文件后先判断流的有效性,确认文件打开成功再执行后续读取逻辑。
- 修改循环条件,将
getline的返回值作为循环判断的前置条件,保证读取失败(比如到文件末尾)时直接退出循环。 - 循环结束后追加判断逻辑,确认是找到目标串退出还是遍历完整个文件未找到退出,做对应处理。
修正后代码示例
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string strLineToRead; ifstream ifFile; ifFile.open("FileToRead.txt"); // 校验文件是否打开成功 if (!ifFile.is_open()) { cout << "文件打开失败,请检查路径和权限" << endl; return 1; } bool isFound = false; // 循环同时校验读取是否正常、是否未匹配到目标串 while (getline(ifFile, strLineToRead)) { if (strLineToRead.find("blabla") != string::npos) { isFound = true; break; } } ifFile.close(); if (isFound) { cout << "匹配到目标字符串,所在行内容:" << strLineToRead << endl; } else { cout << "遍历完整个文件,未找到目标字符串" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Ignacio Ponseti
相关产品推荐
相关产品推荐

