在C++中,每個流具有bad
位:什麼可能導致流進入「壞」狀態?
,該標誌由操作設置時,同時讀出或寫入數據,通常導致流的完整性的喪失發生錯誤的流執行。
什麼會導致流 「失去誠信」,進入bad
狀態?這與fail
狀態不同,當輸入流嘗試將值存儲到不能接受所述值的變量(例如試圖將字符串存儲到整數變量中)時最常發生這種情況。
請注意,此問題是c++ file bad bit的更一般形式,它是特定於文件輸入流的;這個問題不是完全重複的,因爲它一般適用於輸入和輸出流。
在C++中,每個流具有bad
位:什麼可能導致流進入「壞」狀態?
,該標誌由操作設置時,同時讀出或寫入數據,通常導致流的完整性的喪失發生錯誤的流執行。
什麼會導致流 「失去誠信」,進入bad
狀態?這與fail
狀態不同,當輸入流嘗試將值存儲到不能接受所述值的變量(例如試圖將字符串存儲到整數變量中)時最常發生這種情況。
請注意,此問題是c++ file bad bit的更一般形式,它是特定於文件輸入流的;這個問題不是完全重複的,因爲它一般適用於輸入和輸出流。
標準庫集badbit在下列情況下:
插入到輸出流中通過
put()
或write()
失敗任何 原因。插入由
operator<<
,std::put_money
或std::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?
「底層I/O操作中的例外」聽起來很不錯。畢竟,iostreams的目的是擴展,所以完全可以想象,一些用戶提供的實現拋出更深層次的異常。 –
「intent」用於「badbit」發出實際輸入/輸出錯誤的信號。然而,'std :: streambuf'的接口不允許這樣做,它要麼返回一個'char'或'EOF'。如果從'std :: filebuf'('read'返回Posix下的'-1')時出現輸入錯誤,我希望'std :: filebuf'拋出一個異常,因爲它沒有其他方法通知錯誤。 –
看看在Apache C++ Standard Library User's Guide。那裏列出了兩個可能導致badbit的原因。我引述:
內存不足:沒有可用來創建緩衝存儲器,或緩衝液具有其他原因大小0(如被設置在流外),或流不能用於分配內存其擁有內部數據。
基礎流緩衝器拋出異常:流緩衝器可能會失去其完整性,如在存儲器不足,或者代碼轉換故障,或來自外部裝置的不可恢復的讀錯誤。流緩衝區可以通過拋出異常來指示完整性的丟失,該異常由流捕獲並導致將badbit設置爲流的狀態。
也許是遇到無效多字節序列的多字節編碼流? –
@KerrekSB,可能會設置'fail'位,而不是'bad'位,因爲流可以通過'ios :: clear()'和'ios :: ignore()'來恢復。這僅僅是無效輸入的情況;我不認爲這會導致溪流失去誠信。 – bwDraco