繁体   English   中英

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

[英]C++ cin numbers ignores first line?

我遇到了一个非常奇怪的问题。 我可以在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

为什么第一行错了? 我也尝试过从循环中读取第一行。 另外,如果我用cin > p替换ss > 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

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

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

因此,修复:假设没有BOM,则保存文件-假设BOM假设正确。

干杯,……

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

我怀疑您编写了自己的getline() ,该错误在那里。 InputStreams有一个getline(char*, int) ,我怀疑您在第一个参数中string.begin() ,而在后面的参数中包含了Some Other Number。

不要那样做

程序应该做的就是将输入复制到输出中(给出此代码和输入)。 即使在“有效”的线路上也没有这样做。

我在这里看到了许多经验不足的程序员的“签名”。 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;
}

很有可能,由于我认为getline()的错误,您很快就会看到“ Failed at line:0 included:”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM