我正在使用std::copy
將std::deque
中的對象複製到文件中。代碼工作正常,但我需要檢查複製是否成功,因此我需要設置標誌或拋出異常。如何在成功或失敗的情況下返回std :: copy的值?
我已經使用Google搜索,但無法找到解決方案如何檢查std::copy
是否已成功將值複製到文件中。
請問有人可以投下一盞燈。
我正在使用std::copy
將std::deque
中的對象複製到文件中。代碼工作正常,但我需要檢查複製是否成功,因此我需要設置標誌或拋出異常。如何在成功或失敗的情況下返回std :: copy的值?
我已經使用Google搜索,但無法找到解決方案如何檢查std::copy
是否已成功將值複製到文件中。
請問有人可以投下一盞燈。
如果寫入文件失敗,則會設置文件流的錯誤標誌 - 您可以在複製後檢查這些錯誤標記,也可以先調用exceptions
成員函數,以使其在出錯時引發異常。如果其他任何事情都失敗了,那麼就會拋出一個異常。
AFAIK std :: copy算法不檢查任何內容,只是迭代所有元素並將它們複製到輸出迭代器。這意味着你應該在輸出迭代器中提供足夠的空間,否則行爲是未指定的。
所以在你的情況下,你應該自己檢查輸出文件是否可寫等。 可能的方法之一檢查這我認爲使用錯誤標誌爲您使用的文件流,即複製後檢查您的ofstream
是good
(您可以使用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()));
當然你不能用'std :: ostream_iterator'做第二種方法,因爲它是一個輸出迭代器,'std :: distance'也不起作用。 – 2012-03-13 10:11:15
是的,你是對的。第二種方法只有在'output'也是輸入迭代器時纔有效。 – 2012-03-13 10:16:08
難道你只是檢查[流I/O狀態](http://en.cppreference.com/w/cpp/io/ios_base/iostate)? – 2012-03-13 09:54:19