一行一行计算文件:EOF 重复最后一个数字(不能使用break语句)

3

这应该是一个非常简单的程序。我的问题是最后一个数字重复了,我完全理解这一点,因为在回到循环并读取数字之前,EOF没有被达到,那时已经太晚了。我可以通过做类似于“如果(!fileIn)break;count ++”这样的事情来解决这个问题,在for循环中放置“fileIn >> num”(如果(count > 1),我会进入计算平均值、输出总数、平均值等的最后一个代码块)。唯一的问题是我的教授不想在这个程序中使用break,所以我只是想看看如何解决它。

谢谢。

输入文件:

346 130 982 90 656 117 595

415 948 126 4 558 571 87

42 360 412 721 463 47 119

441 190 985 214 509 2 571

77 81 681 651 995 93 74

310 9 995 561 92 14 288

466 664 892 8 766 34 639

151 64 98 813 67 834 369

#include <iostream>
#include <fstream>

using namespace std;

const int NumPerLine = 7;

int main()
{

int num = 0;
int total = 0;
float average = 0;
int min = 0;
int max = 0;

ifstream fileIn;

fileIn.open("File2.txt");
ofstream fileOut("Output.txt");

if (!fileIn) {

cout << "/nError opening file...Closing program. n";
exit(1);
}

while (fileIn) {

cout << endl;

int total = 0;
int count = 0;

for (int k = 0; k < NumPerLine; k++) {

    fileIn >> num;

    if (k == 0) {
    max = num;
    min = num;
    }

    total += num;
    cout << num << " ";
    fileOut << num << " ";

    if (num > max)
    max = num;

    if (num < min)
    min = num;

}

average = total / NumPerLine;

cout << "/n/nTotal is " << total << "." << endl;
cout << "Average is " << average << "." << endl;
cout << "Lowest number is " << min << endl;
cout << "Largest number is " << max << endl;

fileOut << "/n/nTotal is " << total << "." << endl;
fileOut << "Average is " << average << "." << endl;
fileOut << "Lowest number is " << min << endl;
fileOut << "Largest number is " << max << endl << endl;
}


fileIn.close();
fileOut.close();

cout << "/nData has been processed, and copied to the file, " Output.txt "." << endl << endl;

return 0;
}

1
谢谢大家!!同时,感谢那位告诉我将while循环改为while(!fileIn.eof())的人,尽管他后来删除了回答。这是最快和最简单的解决方法 - 为了以后我知道,有人能告诉我为什么它会在while(fileIn)之前到达文件结尾吗? - user2411290
你的教授似乎在宣扬一种与IT行业常规实践不符的“无拘无束”的信条。他不应该这样做。 - user207421
2个回答

1

不必使用while循环,可以使用do/while(特别是因为需要进行非空检查):

do {

cout << endl;

int total = 0;
int count = 0;

for (int k = 0; k < NumPerLine; k++) {

    fileIn >> num;

    if (k == 0) {
    max = num;
    min = num;
    }

    total += num;
    cout << num << " ";
    fileOut << num << " ";

    if (num > max)
    max = num;

    if (num < min)
    min = num;

} while(fileIn);

由于检查发生在输入被处理之后而不是在读取和处理之间,所以更改没有帮助:必须在读取值之后并在处理之前进行检查。 - Dietmar Kühl
@DietmarKühl,我想你是指需要在for循环的第一次读取后进行检查,我错了吗?我同意应该进行检查,但我只是想展示用do/while替换while时我的意思。 - jcm
在执行任何与结果相关的操作之前,您还需要在读取后之前进行检查:流无法知道线程是否成功。但是,它将知道读取是否成功。 - Dietmar Kühl

1
在尝试读取流后,始终检查流的状态:如果输入失败,则将流置于故障模式(即设置了 std::ios_base::failbit),并将流转换为false。请注意保留html标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接