You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:40