输入文件含空行时,读取测验分数的数组为何多复制一个值?
问题分析与解决方案
你的代码核心问题在于混合使用getline和>>读取输入,导致输入缓冲区处理混乱,再加上循环逻辑的漏洞,遇到空行时会重复写入最后一个有效分数。之前用line.empty()检测空行却出错,是因为没正确跳过空行后继续读取,反而中断了后续有效数据的处理。
问题拆解
- 循环初始条件
quizzesread == 0让程序跳过第一次getline直接进入循环,第一次读取后,后续getline会读取残留的换行符,导致line为空。 - 遇到空行时,
infile >> input会自动跳过空白去读下一个数字,但如果文件末尾是空行,>>读取会失败,此时input保留上一次的值,程序依然将其存入数组,造成重复。 - 没有检查
infile >> input的成功状态,即使读取失败(比如空行后无数据),依然执行存入数组的操作。
修正后的代码
提供两种可行的修正方案:
方案一:逐行读取并处理(推荐,精准控制空行)
#include <sstream> // 需要包含该头文件实现字符串转整数 //Attempting to build an array of up to twelve quiz scores. int buildQuizArray(int quizArray[], string nameofile){ ifstream infile(nameofile); int quizzesread = 0; if (!infile.is_open()){ cout << "\n" << nameofile << " did not open\n"; exit(-1); } std::string line; while (quizzesread < 12 && getline(infile, line)) { // 跳过空行 if (line.empty()) { continue; } // 尝试将字符串转为整数 std::istringstream iss(line); int input; if (iss >> input) { // 转换成功才存入数组 quizArray[quizzesread] = input; quizzesread++; } // 若转换失败(如行内非数字),可选择跳过或报错 } infile.close(); return quizzesread; }
方案二:直接用>>读取(自动跳过空白,代码更简洁)
//Attempting to build an array of up to twelve quiz scores. int buildQuizArray(int quizArray[], string nameofile){ ifstream infile(nameofile); int quizzesread = 0; int input; if (!infile.is_open()){ cout << "\n" << nameofile << " did not open\n"; exit(-1); } // >> 自动跳过所有空白(空格、换行、空行),读取成功且未存满12个则继续 while (quizzesread < 12 && infile >> input) { quizArray[quizzesread] = input; quizzesread++; } infile.close(); return quizzesread; }
关键说明
- 方案一能精准处理每一行内容,遇到非数字行也可灵活跳过,适合对输入格式要求严格的场景。
- 方案二更简洁,利用
>>自动跳过空白的特性,通过检查读取状态避免写入无效数据。 - 你之前用
line.empty()出错,是因为没使用continue跳过空行,反而可能直接终止了循环,导致后续有效数据未被处理。
内容的提问来源于stack exchange,提问作者M1sf1re
相关产品推荐
相关产品推荐

