2012-03-13 35 views
6

我正在使用std::copystd::deque中的對象複製到文件中。代碼工作正常,但我需要檢查複製是否成功,因此我需要設置標誌或拋出異常。如何在成功或失敗的情況下返回std :: copy的值?

我已經使用Google搜索,但無法找到解決方案如何檢查std::copy是否已成功將值複製到文件中。

請問有人可以投下一盞燈。

+3

難道你只是檢查[流I/O狀態](http://en.cppreference.com/w/cpp/io/ios_base/iostate)? – 2012-03-13 09:54:19

回答

5

如果寫入文件失敗,則會設置文件流的錯誤標誌 - 您可以在複製後檢查這些錯誤標記,也可以先調用exceptions成員函數,以使其在出錯時引發異常。如果其他任何事情都失敗了,那麼就會拋出一個異常。

2

AFAIK std :: copy算法不檢查任何內容,只是迭代所有元素並將它們複製到輸出迭代器。這意味着你應該在輸出迭代器中提供足夠的空間,否則行爲是未指定的。

所以在你的情況下,你應該自己檢查輸出文件是否可寫等。 可能的方法之一檢查這我認爲使用錯誤標誌爲您使用的文件流,即複製後檢查您的ofstreamgood(您可以使用good(),eof()fail()bad()函數)。第二種方法是檢查返回值std::copy。由於它將迭代器返回到目標範圍的末尾(它指向最後一個副本之後的元素),因此可以計算出std::copy的返回值與輸出迭代器之間的差異,並確保其等於您的deque。例如。 (僞)

OutputIterator result = std::copy(input.begin(), input.end(), output); 
assert(result - output == input.end() - input.begin()); 

編輯:第二種方法只適用時output也輸入迭代器類型,所以std::distance爲它工作。這將是更正確的寫:

assert(std::distance(output, result) == std::distance(input.begin(), input.end())); 
+0

當然你不能用'std :: ostream_iterator'做第二種方法,因爲它是一個輸出迭代器,'std :: distance'也不起作用。 – 2012-03-13 10:11:15

+0

是的,你是對的。第二種方法只有在'output'也是輸入迭代器時纔有效。 – 2012-03-13 10:16:08

相關問題