如何用C++函数实现文件字符串搜索并解决行号累加问题?
解决行号累加错误的问题
问题根源很明确:FileLine是全局变量,每次调用CountInFile时不会自动重置为0,导致行号持续累加。下面提供两种实用的解决办法:
方法一:调用函数时重置全局变量
在CountInFile函数开头添加重置逻辑,让每次文件搜索都从行号1开始计数:
int CountInFile(string S) { FileLine = 0; // 重置行号计数器 ifstream in("DataFile.txt"); while (getline(in, Line)) { FileLine++; if (Line.find(S, 0) != string::npos) { cout << "Found " << S << " at line " << FileLine << "\n"; } } in.close(); // 把close移到return之前,否则永远执行不到 return 0; }
方法二:用局部变量替代全局变量(更推荐)
全局变量容易引发状态混乱,把FileLine改成函数内的局部变量,每次调用函数都会重新初始化,彻底避免累加问题:
#include <iostream> #include <fstream> #include <iomanip> #include <string> using namespace std; string Line; // 仅保留必要的全局变量 int CountInFile(string S) { ifstream in("DataFile.txt"); int FileLine = 0; // 局部变量,每次调用都会从0开始计数 while (getline(in, Line)) { FileLine++; if (Line.find(S, 0) != string::npos) { cout << "Found " << S << " at line " << FileLine << "\n"; } } return 0; // ifstream对象离开作用域时会自动关闭文件,无需手动调用close() } int main() { CountInFile("Computer Science"); CountInFile("Programming"); CountInFile("C++"); CountInFile("COSC"); CountInFile("computer"); }
顺便提个细节:原代码里的in.close();写在return 0;之后,永远不会被执行。实际上ifstream会在对象销毁时自动关闭文件,所以可以直接删掉这条语句,或者把它移到return之前。
内容的提问来源于stack exchange,提问作者PatPatis
相关产品推荐
相关产品推荐

