2012-03-20 84 views
2

我上的Visual C++ 2010cin.getline設置開始字符串的「 0」

char c[10]; 
cin.get(&c[0],5); 
cin.get(&c[2],4); 
cout << c << endl; 

運行此片的代碼,如果我喂「123456789」到cin,所述cout子句將打印「 12567「,這是我預期的結果。

但如果我寫:

char c[10]; 
cin.getline(&c[0],5); 
cin.getline(&c[2],4); 
cout<< c <<endl; 

和飼料相同的字符串,它只會告訴我 「12」,其中c == { '1', '2', '\ 0',」 4','\ 0'}

根據documentation,cin.get和cin.getline的區別在於cin.get不會像cin.getline那樣丟棄delim字符,所以我不知道爲什麼會發生。任何人都可以給我提示嗎?

+4

您不能使用I/O函數而不檢查它們的返回值。 – 2012-03-20 22:49:41

+1

eofbit,badbit等是什麼樣的? – 01100110 2012-03-20 22:53:25

+0

@ user1200129是的,我檢查了三位,「失敗位」是真的,但我不知道爲什麼。 – ziyuang 2012-03-20 23:17:31

回答

4

發生了什麼事情是,如果basic_iostream::getline()達到要讀取的字符數限制(streamsize參數減1),它會停止讀取,然後在它讀取的數據之後放置一個空字符。它還在流上設置failbit

所以假設流具有"123456789"準備好讀,當你調用cin.get(&c[0],5)陣列將得到{'1','2','3','4','\0'}通過4放入元素0。並且在流上設置了failbit

現在,當您撥打cin.get(&c[2],4)時,failbit已在流上設置,因此不會讀取任何內容。 getline()調用除了在索引2處將終止空值放入數組(即使沒有從流中讀取任何數據,getline()將放置空字符 - 即使非讀取是因爲failbit)。所以數組現在看起來像:

{'1','2','\0','4','\0'} 

您鏈接到文檔中提到這一點:

如果函數停止讀取,因爲達到這個尺寸,failbit內部標誌設置。

getline()做了很多,所以很容易錯過這個細節。

+0

謝謝@MichaelBurr我現在明白了邏輯。 'streamsize'參數具有緩衝區大小的默認含義。一旦達到,就不應再讀取任何內容,程序員必須先處理該情況。 – ziyuang 2012-03-21 00:50:45