c++ while循环读取输入

file io - C++ while loop reading input

本文关键字:输入 读取 循环 while c++      更新时间:2023-10-16

我提交了这个程序,它工作得很好,但是我的老师说我的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 << "nnPress 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)的唯一情况是,如果文件不是以整数开头,只需检查第一次读取并适当处理它,这将被修复。