C++ - 函数在尝试忽略同一行时读取同一行两次

C++ - function reads the same line twice when trying to ignore it

本文关键字:一行 读取 两次 C++ 函数      更新时间:2023-10-16

我必须创建一个复杂的程序来从文件中读取 3 个值,计算平均值,然后将其输出到文件中,所有这些都使用不同的函数,并且从文件中获取输入的函数需要单独调用 3 次,没有花哨的东西。我每次将变量递增 1,并相应地输入并跳过行。 使用 ignore() 直到换行符时,它似乎可以很好地获得前 2 个输入,但是当使用它两次跳过前 2 个输入并获取第三个输入时,它似乎再次获得第二个输入并使用它来计算平均值。例如,我得到 5,7 和 10 的平均值为 6.3~,而它应该是 7.3~。我两次使用忽略直到换行符做错了什么吗?我已经包含了我的主函数和两个相关函数的代码。

int main() {
    double input_1, input_2, input_3;
    double average;
    int count = 1;
    ifstream infile;
    ofstream outfile;
    infile.open("infile.txt");
    outfile.open("outfile.txt");
    input_1 = get_input(infile, count);
    count = count+1;
    input_2 = get_input(infile, count);
    count=count+1;
    input_3 = get_input(infile, count);
    average = calculate_avg(input_1, input_2, input_3);
    output_to_file(average, outfile);
    infile.close();
    outfile.close();
    return 0;
}

double get_input(ifstream& infile,  int number) {
    double input_value;
    if (number == 1) {
        infile >> input_value;
    }
    else if (number == 2)
    {
        infile.ignore (100, 'n');
        infile >> input_value;
    }
    else if (number == 3)
    {
        infile.ignore (100, 'n');
        infile.ignore (100, 'n');
        infile >> input_value;
    }
    return input_value;
}

double calculate_avg(double val_1, double val_2, double val_3){
    double avg;
    avg = (val_1 + val_2 + val_3)/3;
    return avg;
}

std::fstream::ignore将从输入流中提取和丢弃字符,因此 100 不是最佳选择

为了"没有花哨的东西",在get_input()中使用以下

infile.seekg(0); // rewind
if (number == 1) {
    infile >> input_value;
}
else if (number == 2)
{
    infile >> input_value;
    infile >> input_value;
}
else if (number == 3)
{
    infile >> input_value;
    infile >> input_value;
    infile >> input_value;
}
return input_value; //only the last read value

将函数get_input写为:

double get_input(ifstream& infile,  int number) {
    double input_value;
    infile >> input_value;
    infile.ignore (1, 'n');
    return input_value;
}

将起作用,因为您打开了文件,然后依次读取它,因此在读取数字 - 内部指针位于符号之后,您不必跳过几行,只需跳过n符号