2010-11-19 59 views
1

我遇到了一个非常奇怪的问题。我可以在我的win7笔记本电脑以及ubuntu机器上重现。C++ cin数字忽略第一行?

我有一个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 
+1

也许你的'test.txt'文件中有些东西 - 可能用十六进制编辑器来查看它?当我使用GCC 4.5.1(MinGW)或VS2010进行编译/运行时,我收到了'test.txt'(不含空格)的内容。 – 2010-11-19 22:42:37

+0

我想你的test.txt(或者不是数字的)开头有一个空行。 – 2010-11-19 22:49:36

+0

格式字符串更好! – Svisstack 2010-11-19 22:53:54

回答

1

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

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

因此,解决方法:保存没有BOM的文件 - 假设BOM假设是正确的。

干杯&心连心,

0

你的代码看起来没什么问题,如果我是你,我会仔细检查输入文件:你确定没有空第一行,或第1行开头的一些非数字字符?

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; 
} 

机会,你会看到“失败的行:含0:”出了大门,因我认为是您的getline()中存在一个错误。