如何在成功或失败的情况下返回std::copy的值
How to return value of std::copy in case of success or failure?
我正在使用std::copy
将std::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()));
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何获取std::result_of函数的返回类型
- 架构决策:返回std::future还是提供回调
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 使用std::mt19937从字符串中返回一个随机单词
- 如何使用std::min和std::less返回对象
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 返回一个带有 std::move 的对象并链接函数
- 推导 std::vector::back() 的返回类型
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?
- 如何从 std::thread 返回值
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何从 std::vector 搜索和返回项目
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?