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

标签 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 > pcin > 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 假设是正确的。

干杯,

关于C++ cin 数字忽略第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229969/

相关文章:

javascript - 如何验证和包装输入的错误消息?

c++ - 使用 C++ 将 XMacro 结构打印到控制台

c++ - 如何使 cout 表现为二进制模式?

C++ 对象内存管理

c++ - 使用 C++ 的代码块中的链接器错误问题

c++ - 模板函数无法识别由 auto 变量引用的 lambda

c++ - sleep 语句在 C++ 中无法正常工作

c++ - sendto 和 recvfrom 在同一个程序中?

python - 特殊字符显示为问号

Android:在自定义键盘上添加 imageButton