2011-12-02 55 views
2

提供複製文件的「標準」方法,例如通過C++。現在使用rdbuf()和運算符在C++中複製流時出錯<<

ifstream ins; 
ofstream out s; 
// I've omitted the opening of those stream, since it is not important for the following question. 

s << ins.rdbuf(); 

,問題是,上面的線可能會失敗,並且在某些情況下,尤其是我要談的,是沒有辦法,我發現就知道出事了。

例如,假設輸入流實際上是一個坐在遠程NAS機器上的大文件。 現在,可能會有連接錯誤導致文件句柄無效。 試圖模擬這個,我使用了一個大文件,在調試器中,我停在這一行,找到句柄,然後繼續調試器,然後強制關閉文件句柄(通過sysinternals套件的進程管理器)。

結果是:行結束,文件未被正確複製,有時完全不復制,有時只有部分文件被關閉。 與運營商< <和rdbuf()的文檔相矛盾,沒有設置錯誤/失敗狀態,也沒有拋出異常。

我只能注意到,當試圖關閉輸入流時,會引發異常。

有沒有人有這樣的現象?! 無論如何檢查/測試這是否正確完成?

Regards,

回答

1

流在錯誤報告方面臭名昭着的糟糕。在這個 的情況下,你所能做的就是在輸出流上檢查badbit; 標準要求<<運營商吸收所有例外情況,如果它們發生,則設置 badbit。顯然,這並不告訴你 錯誤是由於輸入錯誤還是輸出錯誤。

通常,如果您使用大多數 編譯器附帶的實現,則無論如何都不會有輸入錯誤報告。對於 大部分,除非事情近年來發生了變化,否則filebuf的實現 會像輸入文件結束一樣處理輸入錯誤。

如果您需要更好的錯誤報告,我想你堅持 實現自己的streambuf(不是真的很困難),這 跟蹤的各種錯誤的;然後您可以在傳輸收到的錯誤後詢問streambuf

+0

「_treat錯誤輸入完全像file_結束」是cfront iostream傳統? – curiousguy

+0

@curiousguy我懷疑它比那更進一步。對於我見過的大多數使用FILE *的程序來說,這或多或少都是標準做法。 (這是爲了輸入,對於輸出,仔細的程序會在關閉之後檢查是否沒有錯誤發生。) –

+0

在舊的時代,甚至還有一種方式讓流緩衝區指示讀取失敗,而不是EOF? – curiousguy