为什么我的代码不会在屏幕上打印任何内容? (C ++)

时间:2014-10-12 20:49:16

标签: c++ loops text-files

我正在使用包含一组数据的文件:

x values    y values
20.00       0
20.02       15
20.04       27
20.06       39
20.08       54
20.10       65
20.12       75

该程序应该计算曲线下面积。在这部分中,我将对前6个y-y集进行此操作。我找到该区域的算法是每个梯形的总和,对于这些约束,它应该只有5个梯形。每个梯形的定义如下:A = 0.5(base-base_0)*(height + height_0)。

这是我的代码:

int main()
{
    ifstream infile;
    double AreaCurve = 0.0, NumberTraps = 0.0, height, height_0, base, base_0, AreaTrap;

    infile.open("xydata.dat");

    cin.ignore(20, '2');
    while (NumberTraps < 6)
    {
        infile >> base_0;
        infile >> height_0;
        infile >> base;
        infile >> height;
        AreaTrap = 0.5 * (base - base_0) * (height + height_0);
        AreaCurve += AreaTrap;
        NumberTraps++;
    }

    cout << "The area under the curve is: " << setprecision(4) << AreaCurve << endl;

    infile.close();

    return 0;
}

编译程序时,没有任何内容打印到屏幕上。我不确定为什么会发生这种情况,但我相信它可能与包含cin.ignore函数的代码行中的错误有关(我无法编辑数据,我需要跳过这一行读取:&#34; x值\ t \ ty值&#34;)

2 个答案:

答案 0 :(得分:0)

删除第cin.ignore(20, '2');行。

此行将使您的程序等待用户输入,直到他们输入二十2秒或输入不同的字符。

您不应该阅读此计划中的任何用户输入,您的输入数据来自infile

您需要添加代码才能忽略infile的第一行。一个简单的方法是string s; getline(infile, s);

你的程序的主循环也有一个逻辑错误。你一次读两行并考虑到梯形,但是你忽略了那个之后的梯形。 (所以你只计算了大约一半的梯形)。

最后,您应该在处理该梯形之前检查输入是否成功:

if ( !infile )
    break;

答案 1 :(得分:0)

要忽略infile流的第一行(无论其长度如何),您需要:

infile.ignore( numeric_limits<streamsize>::max(), '\n' ) ;

注意,这需要<limits>标题。

您无需忽略第一个&#39; 2&#39;。对于初学者来说,第一个x值总是必须以&#39; 2&#39;开头,但更有用的是std::istream::operator>> (double&);跳过包含行尾的空格。

此代码还存在其他问题,例如尝试读取文件包含的更多值,错误的集成算法以及没有对有效流进行错误检查。考虑:

infile.ignore( numeric_limits<streamsize>::max(), '\n' ) ;

infile >> base_0;
infile >> height_0;

while( infile.good() )
{
    infile >> base;
    infile >> height;

    if( infile.good() )
    {
        AreaTrap = 0.5 * (base - base_0) * (height + height_0);
        AreaCurve += AreaTrap;

        base_0 = base ;
        height_0 = height ;
    }
}