繁体   English   中英

C ++循环读取输入

[英]C++ while loop reading input

我提交了该程序,并且运行良好,但是我的老师说,即使我得到正确的答案,我的while循环还是有问题。 有任何提示或帮助吗?

当到达文件末尾并且第43行的read无效时,在while循环中会发生什么? 程序的结构方式虽然看不到问题,但确实存在。 应该重组while循环来解决这个问题。

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
    ifstream inputfile;

    char choice;


    int NumberOfIntegers = 0,
        SumOfIntegers = 0,
        Average = 0 ,
        LargestValue,
        SmallestValue,
        integer;

    inputfile.open("random.txt");

    if(!inputfile)
    {
        cout << "the file could not be open" << endl;
    }


    inputfile >> integer;

    //initialize smallest and largest
    SmallestValue = integer;
    LargestValue = integer;

    while(inputfile)
    {
        NumberOfIntegers++;
        SumOfIntegers = SumOfIntegers + integer;

        inputfile >> integer;
        if( integer > LargestValue || integer < SmallestValue)
        {

            if ( integer > LargestValue)
                LargestValue = integer;

            else 
                SmallestValue = integer;
        }
    }

    if(NumberOfIntegers > 0 )
    {
        Average = SumOfIntegers / NumberOfIntegers;
    }

    //closing input file
    inputfile.close();

    do
    {
        //Display Menu
        cout << "Make a selection from the list" << endl;
        cout << "A.   Get the largest Value" << endl;
        cout << "B.   Get the smallest Value" << endl;
        cout << "C.   Get the sum of the values" << endl;
        cout << "D.   Get the average of the values" << endl;
        cout << "E.   Get the number of values entered" << endl;
        cout << "F.   End this program" << endl << endl;

        cout << "Enter your choice -->  ";
        cin >> choice;

        cout << endl;

        switch (choice)
        {
        case 'a':
        case 'A': cout << "The largest value is " << LargestValue << endl;
            break;

        case 'b':
        case 'B': cout << "The smallest value is " << SmallestValue << endl;
            break;

        case 'c':
        case 'C': cout << "The sum of the values entered is " << SumOfIntegers << endl;
            break;

        case 'd':
        case 'D': cout << "The average of the values entered is " << Average << endl;
            break;

        case 'e':
        case 'E': cout << "The number of values entered is " << NumberOfIntegers << endl;
            break;

        case 'f':
        case 'F': cout << "Program ending" << endl << endl;
                cin.ignore();
                cout << "\n\nPress Enter to end -->  ";
                cin.ignore();
                return 0;


        default: 
            cout << choice << " is an invalid value. " << endl;

        }

        cout << endl;

    } while( choice != 'f' || choice != 'F');


    return 0;

}

我看到的“问题”是您在阅读之后和处理之前不检查流的bool值。 为此,应将read作为条件放入while循环中。

if( ! inputfile >> integer )
{
    // error code (no integer in file)
    exit(0);
}

LargestValue = integer;
SmallestValue = integer;
NumberOfIntegers++;
SumOfIntegers = SumOfIntegers + integer;

while( inputfile >> integer )
{
    NumberOfIntegers++;
    SumOfIntegers = SumOfIntegers + integer;

    //inputfile >> integer;
    if( integer > LargestValue || integer < SmallestValue)
    {

        if ( integer > LargestValue)
            LargestValue = integer;

        else 
            SmallestValue = integer;
    }
}

在这种情况下,结果应与您的程序相同,因为如果inputfile >> integer失败,我认为integer会保持与以前相同的值,因此不会影响LargestValueSmallestValue 然后检查流,这样不会更新NumberOfIntegersSumOfIntegers ,这是正确的。 程序唯一给出未定义结果(对于LargestValueSmallestValue )的时间是,如果文件不是以整数开头的,只需检查第一次读取并适当地处理它,即可解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM