2010-11-19 104 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()中存在一個錯誤。