如何在成功或失败的情况下返回std::copy的值

How to return value of std::copy in case of success or failure?

本文关键字:std 返回 copy 的值 情况下 成功 失败      更新时间:2023-10-16

我正在使用std::copystd::deque中的对象复制到一个文件中。代码运行良好,但我需要检查复制是否成功,因此我需要设置标志或抛出异常。

我在谷歌上搜索过,但找不到如何检查std::copy是否已成功将值复制到文件中的解决方案。

有人能把灯照一下吗?

如果写入文件失败,则会设置文件流的错误标志-您可以在复制后检查这些标志,也可以先调用exceptions成员函数,使其在出错时抛出异常。如果其他任何操作失败,则将引发异常。

AFAIK std::copy算法不检查任何内容,只遍历所有元素并将它们复制到输出迭代器。这意味着您应该自己在输出迭代器中提供足够的空间,否则行为是未指定的。

因此,在您的情况下,您应该自己检查输出文件是否可写,等等。。我认为检查这一点的一种可能方法是为您正在使用的文件流使用错误标志,即在复制后检查您的ofstream是否为good(您可以为此使用good()eof()fail()bad()函数)。

第二种方法是检查std::copy的返回值。当它将迭代器返回到目标范围的末尾(指向last的副本后面的元素)时,您可以计算std::copy的返回值和输出迭代器之间的差,并确保其等于deque的大小。例如(伪代码)

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

EDIT:第二种方法仅在output也是输入迭代器类型时有效,因此std::distance适用于它

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