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

时间:2013-10-21 18:13:44

标签: c++ ifstream ignore

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

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;
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

将函数get_input写为:

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

因为你打开文件然后读取它所以会工作,因此在你读取数字后 - 内部指针位于\ n符号,你不必跳过几行,你只需要跳过\n符号