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

C++统计文件单词和元音的程序两个while循环仅一个生效问题

问题原因

第一个while (inFile >> word)会持续读取文件内容直到文件末尾,此时文件流inFile的eofbit(文件结束标志)会被置为有效状态,同时文件读取指针也停在了文件末尾。第二个while(inFile.get(letter))执行时,流处于错误状态会直接返回false,所以元音统计逻辑永远不会执行,只能拿到第一个循环的统计结果。

解决方案

方案1:重置文件流状态+复位读取指针

适合确实需要分两次处理文件的场景,在第一个while循环结束后添加两行代码重置文件流即可:

while (inFile >> word) {
    words++;
}
// 新增以下两行
inFile.clear(); // 清除流的所有错误标志,包括eof结束标志
inFile.seekg(0, ios::beg); // 将文件读取指针移动到文件起始位置

while(inFile.get(letter)){
    // 原有元音统计逻辑不变
}

方案2:优化为单次遍历完成统计(更高效)

不需要读取两次文件,直接在读取单词的循环中同时统计元音,删掉第二个while循环即可,修改后的核心逻辑:

while (inFile >> word) {
    words++;
    // 遍历当前单词的每个字符统计元音
    for (char c : word) {
        if (c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i'|| c == 'I' || c == 'o' || c == 'O' || c == 'u' || c == 'U') {
            vowels++;
        }
    }
}

额外优化建议

最好新增文件打开成功的判断,避免文件不存在、权限不足等问题导致的无意义统计:

inFile.open("lorem.txt");
// 新增判断逻辑
if (!inFile.is_open()) {
    cout << "文件打开失败,请检查lorem.txt路径是否正确" << endl;
    return 1;
}

内容的提问来源于stack exchange,提问作者Welt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:03