求助:C++中ifstream读取文本文件最后一个字符串重复两次的问题
问题分析与修复方案
嘿,我一眼就发现你代码里的问题啦!你遇到的最后一个单词被重复读取两次、计数多1的情况,是因为循环条件和读取操作的顺序搞反了。
问题根源
你原来的循环逻辑是这样的:
while (infile) { infile >> str1; cout << str1 << endl; count++; }
这里的while (infile)判断的是上一次读取操作后流的状态,而不是即将执行的读取是否会成功。当程序读到文件最后一个单词words.之后,下一次执行infile >> str1时,因为已经到了文件末尾,读取会失败,但这时候你还是会执行cout << str1 << endl; count++;——而str1里还存着上一次读取的words.,所以就会重复输出,count也多算了1。
修复方案一:把读取操作放到循环条件中
这是C++处理文件读取最常用的正确写法,直接把infile >> str1作为循环条件,这样只有当读取成功时,才会进入循环体执行输出和计数:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream infile; string str1; string filename; int count; cout << "enter a file name: "; cin >> filename; while (filename != "quit") { infile.open(filename.c_str()); if (!infile) { cout << "Couldn't open file." << endl; } else { count = 0; // 核心修改:将读取操作放入循环条件,读取成功才进入循环 while (infile >> str1) { cout << str1 << endl; count++; } infile.close(); cout << count << endl; } cout << "enter a filename: "; cin >> filename; } }
修复方案二:读取后检查流状态
如果你想保留原来的循环结构,也可以在读取后立即检查流是否有效,只有有效时才执行后续操作:
// ... 其他代码不变 count = 0; while (infile) { infile >> str1; // 读取后检查是否成功,失败则跳出循环 if (!infile) break; cout << str1 << endl; count++; } // ... 其他代码不变
用你的示例文件测试的话,修改后的程序会正确输出7个单词,count结果为7,不会再重复最后一个单词啦。
内容的提问来源于stack exchange,提问作者user2913891
相关产品推荐
相关产品推荐

