在C ++中发现/检查序列的结尾

时间:2014-03-13 12:09:30

标签: c++ input stream sequence eof

我需要读取一个未知长度的整数序列,然后我需要找到其中最长的单调子序列。序列以EOF符号结尾,其元素用空格分隔。 我现在并没有真正困扰找到后续序列的麻烦,我想确保以正确的方式读取序列中的元素。下面是一个应该完成这项工作的代码,但是我现在还不能解决这个问题。

#include <iostream>
using namespace std;

int main()
{
    int sum=0;
    int a=0;
    cout << "Give me a number: ";

     // while (!fin.eof()) {
           while (cin >> a) {

    cin >> a;
    sum +=a;
    cout << "Sum is: " <<sum << endl;



         /* Thats the place where whole magic is supposed to happen.
         I'm really confused however, because after entering i.e. 2 3 4 2 4 
         and pressing <Enter> five times shows an answer "The sum is  <proper sum>"
         and the answer "The final sum is: ... " doesn't show at all.
         */

    }
    cout << "final sum is : " << sum;

    cout << "Hello world!" << endl;
    return 0;
}

如果有人能够回答我的问题并解释我是否以及在哪里出错,我将非常感激。 我会感激任何帮助!

2 个答案:

答案 0 :(得分:0)

嗯,对于其中一个,你似乎正在检查fin的状态,但是你永远不会打开那个文件而你从来没有读过它。我猜你打算在任何地方使用std::cin,或在任何地方使用fin;我会坚持std::cin,但fin会以同样的方式工作。

问题是您首先检查文件结尾,然后阅读并使用数据。这意味着如果读取失败,则不会告诉您这一点。而不是

while (std::cin) {
    std::cin >> a;
    sum += a;
}

使用

while (std::cin >> a) {
    sum += a;
}

这仍然会执行检查,但读取之后,这意味着如果读取失败,则不会进入循环体,也不要使用(废话)数据

fin案例看起来大致相同:

std::ifstream fin("mydata.txt");
while (fin >> a) {
    sum += a;
}

请注意,无需明确检查是否到达文件末尾;检查流的状态将捕获该错误,以及由于无法解析数字而导致的任何错误。相反,我们做了

while (fin >> a, !fin.eof())

这将正确处理您读取整个文件的情况,但如果它包含除数字之外的其他内容,则无限循环。

答案 1 :(得分:0)

首先,确定您是从文件(fin)还是程序的输入(std::cin)中读取。目前,您正在阅读另一个并查看另一个eof

如果您正在阅读该文件,那么您需要打开它。否则,请移除fin以避免混淆。

然后你应该在尝试阅读之后检查eof(和其他错误条件),并在之前使用结果检查

while (std::cin >> a) {  // or `fin`, if that's where you're reading from
    // your code using 'a' here
}