【问题标题】:C++ cin numbers ignores first line?C++ cin 数字忽略第一行?
【发布时间】:2010-11-20 07:07:34
【问题描述】:

我遇到了一个非常奇怪的问题。我可以在我的 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 &lt; 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 &gt; p 替换ss &gt; 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

【问题讨论】:

  • 也许你的test.txt 文件中有一些奇怪的东西——也许用十六进制编辑器看看?当我使用 GCC 4.5.1 (MinGW) 或 VS2010 编译/运行时,我得到了 test.txt(不带空格)的内容。
  • 我认为你的 test.txt 的开头有一个空行(或者不是数字的东西)。

标签: c++ input cout cin


【解决方案1】:

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

第二、第三、第四行等。好的,因为您正在为每一行创建新的istringstream 对象,因此不保留前一行的错误模式。

所以,修正:在没有 BOM 的情况下保存文件——假设 BOM 假设是正确的。

干杯,

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我怀疑你写了自己的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;
      }
      

      很有可能,由于我认为您的 getline() 中存在错误,您将看到“FAILED at line: 0 contains:”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-05
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多