C ++ cin数字忽略了第一行?

时间:2010-11-19 22:33:37

标签: c++ input cout cin

我遇到了一个非常奇怪的问题。我可以在我的win7笔记本电脑和ubuntu机器上重现。

我有一个像这样的C ++程序:

#include <string>
#include <sstream>
#include <iostream>
using namespace std;

int main() {
  for (int i = 0; i < 9; i++) {
    string line;
    getline(cin, line);
    stringstream ss(line);

    for (int j = 0; j < 9; j++) {
      int p = 8;
      ss >> p;
      cout << p;
    }
    cout << endl;
  }
  return 0;
}

现在,如果我编译它,使用./a.out < test.txt运行它text.txt包含:

1 2 3 4 5 6 7 8 9
2 2 3 4 5 6 7 8 9
3 2 3 4 5 6 7 8 9
4 2 3 4 5 6 7 8 9
5 2 3 4 5 6 7 8 9
6 2 3 4 5 6 7 8 9
7 2 3 4 5 6 7 8 9
8 2 3 4 5 6 7 8 9
9 2 3 4 5 6 7 8 9

它将输出(不含空格):

8 8 8 8 8 8 8 8 8
2 2 3 4 5 6 7 8 9
3 2 3 4 5 6 7 8 9
4 2 3 4 5 6 7 8 9
5 2 3 4 5 6 7 8 9
6 2 3 4 5 6 7 8 9
7 2 3 4 5 6 7 8 9
8 2 3 4 5 6 7 8 9
9 2 3 4 5 6 7 8 9

为什么第一行错了?我也试过读出循环的第一行。 另外,如果我用ss > p替换cin > p,我只会得到一个满是8的输出表。

这没有任何意义!!

好的,你们是对的。一些奇怪的东西作为我的输入文件的第一个字符:

od -c test.txt
0000000 357 273 277   2       0       5       0       0       7       0
0000020       0       6  \n   4       0       0       9       6       0
0000040       0       2       0  \n   0       0       0       0       8

3 个答案:

答案 0 :(得分:1)

这是数据的问题(因为代码看起来不错)。很可能你已经使用带有BOM的UTF-8编码保存了你的文本文件。 UTF-8 BOM在文件开头是三个字节,尝试将它们解释为十进制数字规范将失败。

第二,第三,第四行等等。确定,因为您要为每一行创建新的istringstream对象,因此不保留上一行的错误模式。

所以,修复:保存没有BOM的文件 - 假设BOM假设是正确的。

干杯&amp;第h。,

答案 1 :(得分:0)

你的代码对我来说似乎很好,如果我是你,我会仔细检查输入文件:你确定第一行没有空的第一行或者一些非数字字符吗?

答案 2 :(得分:0)

我怀疑你编写了自己的getline(),并且存在错误。 InputStreams有一个getline(char*, int),我怀疑你把string.begin()填入第一个参数,而其他数字填入后者。

不要那样做。

您的所有程序都应该将输入复制到输出(给定此代码和输入)。它也没有这样做,即使是在“工作”的路线上也是如此。

我在这里看到一些不那么有经验的程序员'签名'。 1)变量名称过短(for循环计数器外),“ss”和“p” 2)魔术错误编号(8),特别是不能从数据中脱颖而出的错误编号。 3)“使用”

1和3都暗示缺乏打字速度,因此经验......尽管你的1k +声誉(主要基于提问......情况变得更加清晰)。

我会改写这样的东西:

int curDig;
curLine >> curDig;
if (curLine.good()) {
  cout << curDig;
} else {
  cout << "FAILED at line: " << lineIdx << " containing: " << line << std::endl;
}

很可能,你会看到“FAILED at line:0包含:”,因为我认为你getline()中存在错误。