C++统计文本中"au"出现次数的程序仅识别第一行问题求助
为什么我的C++程序只统计文本第一行的"au"出现次数?
让我来帮你排查这个问题——你的程序只统计第一行的核心原因是循环条件用错了,再加上读取字符的方式不够稳妥。咱们一步步拆解:
问题出在哪?
while (!in.eof())是个常见陷阱
EOF(文件结束)标志只有在你尝试读取超出文件末尾的时候才会被触发。也就是说,当你读到文件最后一个字符时,eof()还会返回false,这时候进入循环执行in.get(t)和in.get(t1),第二个读取操作会直接失败,但程序还是会执行判断逻辑,不仅产生无效判断,还可能导致流状态异常,让后续读取直接终止——这就是为什么你的程序只统计了第一行就停了。双字符读取容易丢字符或出错误
你每次循环读两个字符,如果文件总字符数是奇数,最后一次读取第二个字符必然失败,此时t1的值是未定义的;而且你完全没检查每次get()是否成功,一旦某次读取失败(比如遇到特殊字符或流错误),整个统计就直接中断了。
修复后的代码
我调整了读取逻辑,改成跟踪前一个字符的方式,同时修复了循环条件的问题,还加了文件打开检查:
#include <iostream> #include <fstream> using namespace std; int countAu(); int main(){ cout << countAu() << endl; return 0; } int countAu() { ifstream in("duom.txt"); // 先确认文件能正常打开 if (!in.is_open()) { cerr << "无法打开目标文件!" << endl; return 0; } char prevChar; char currChar; int count = 0; // 先读取第一个字符,初始化前一个字符的变量 if (in.get(prevChar)) { // 把读取操作直接作为循环条件,读取成功才进入循环 while (in.get(currChar)) { // 检查当前字符和前一个字符是否组成"au" if (prevChar == 'a' && currChar == 'u') { count++; } // 更新前一个字符,准备下一轮判断 prevChar = currChar; } } in.close(); return count; }
修复的关键点
- 可靠的循环条件:
while (in.get(currChar))直接判断读取是否成功,读取失败(到文件末尾或出错)就立刻终止循环,完全避开了eof()的陷阱。 - 单字符跟踪逻辑:每次只读一个字符,通过对比当前字符和前一个字符来统计"au",不会遗漏任何可能的组合,哪怕是跨两行的情况(比如第一行末尾是'a',第二行开头是'u'也能被统计到)。
- 文件打开检查:避免文件不存在或权限不足时的无效操作,给用户明确的错误提示。
内容的提问来源于stack exchange,提问作者Tauras Paliokas
相关产品推荐
相关产品推荐

