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
相关产品推荐
相关产品推荐

