我需要读取一个未知长度的整数序列,然后我需要找到其中最长的单调子序列。序列以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;
}
如果有人能够回答我的问题并解释我是否以及在哪里出错,我将非常感激。 我会感激任何帮助!
答案 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
}