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

输入文件含空行时,读取测验分数的数组为何多复制一个值?

问题分析与解决方案

你的代码核心问题在于混合使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:21:01