2012-03-13 70 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

相关问题