2012-08-28 60 views
9

在C++中,每個流具有bad位:什麼可能導致流進入「壞」狀態?

,該標誌由操作設置時,同時讀出或寫入數據,通常導致流的完整性的喪失發生錯誤的流執行。

Source

什麼會導致流 「失去誠信」,進入bad狀態?這與fail狀態不同,當輸入流嘗試將值存儲到不能接受所述值的變量(例如試圖將字符串存儲到整數變量中)時最常發生這種情況。

請注意,此問題是c++ file bad bit的更一般形式,它是特定於文件輸入流的;這個問題不是完全重複的,因爲它一般適用於輸入和輸出流。

+0

也許是遇到無效多字節序列的多字節編碼流? –

+0

@KerrekSB,可能會設置'fail'位,而不是'bad'位,因爲流可以通過'ios :: clear()'和'ios :: ignore()'來恢復。這僅僅是無效輸入的情況;我不認爲這會導致溪流失去誠信。 – bwDraco

回答

13

根據cppreference.com

標準庫集badbit在下列情況下:

  • 插入到輸出流中通過put()write()失敗任何 原因。

  • 插入由operator<<std::put_moneystd::put_time輸出流,從而無法完成輸出 流的末尾達到(小面的格式化輸出功能,諸如 num_put::put()money_put::put(),返回迭代iter這樣 該iter.failed()==true

  • 流被構造成具有一個空指針爲rdbuf(),或 putback()/unget()被名爲o吶流與空rdbuf(),或傳遞給operator<<(basic_streambuf*)

  • rdbuf()->sputbackc()rdbuf()->sungetc()返回traits::eof()putback() or unget()`

  • rdbuf()->pubsync()返回-1至sync()一個 空指針,到flush(),或至 ostream::sentry的析構函數unitbuf

  • 異常拋出duri任何成員函數 的相關流緩衝區(例如, sbumpc()xsputn()sgetc()overflow()等)

  • 例外是iword()pword()拋出(例如std::bad_alloc


這可能是一個更有理由選擇cppreference.com超過www.cpluplus.com,請參閱: What's wrong with cplusplus.com?

+3

「底層I/O操作中的例外」聽起來很不錯。畢竟,iostreams的目的是擴展,所以完全可以想象,一些用戶提供的實現拋出更深層次的異常。 –

+1

「intent」用於「badbit」發出實際輸入/輸出錯誤的信號。然而,'std :: streambuf'的接口不允許這樣做,它要麼返回一個'char'或'EOF'。如果從'std :: filebuf'('read'返回Posix下的'-1')時出現輸入錯誤,我希望'std :: filebuf'拋出一個異常,因爲它沒有其他方法通知錯誤。 –

1

看看在Apache C++ Standard Library User's Guide。那裏列出了兩個可能導致badbit的原因。我引述:

內存不足:沒有可用來創建緩衝存儲器,或緩衝液具有其他原因大小0(如被設置在流外),或流不能用於分配內存其擁有內部數據。

基礎流緩衝器拋出異常:流緩衝器可能會失去其完整性,如在存儲器不足,或者代碼轉換故障,或來自外部裝置的不可恢復的讀錯誤。流緩衝區可以通過拋出異常來指示完整性的丟失,該異常由流捕獲並導致將badbit設置爲流的狀態。

相關問題