gpt4 book ai didi

c++ - 使用 rdbuf() 和运算符 << 在 C++ 中复制流时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:51 25 4
gpt4 key购买 nike

复制文件的“标准”方式是,例如通过 C++。

ifstream ins;
ofstream out s;
// I've omitted the opening of those stream, since it is not important for the following question.

s << ins.rdbuf();

现在,问题是上面的行可能会失败,并且在某些情况下,尤其是我将要讨论的情况,我无法发现哪里出了问题。

例如,假设输入流实际上是远程 NAS 机器上的一个大文件。现在,可能会出现连接错误,导致文件句柄无效。为了模拟这个,我使用了一个大文件,在调试器中我停在这一行,找到句柄,然后继续调试器,然后强行关闭文件句柄(通过 sysinternals 套件的进程资源管理器)。

结果是:该行结束了,文件没有被正确复制,有时根本没有复制,有时只有部分文件被关闭。与 operator<< 和 rdbuf() 的文档相矛盾,没有错误/失败状态的设置,也没有抛出异常。

我唯一能注意到的是,当试图关闭输入流时,出现了异常。

有没有人有同样的现象?!无论如何要检查/测试它是否正确完成?

问候,

最佳答案

Streams 在错误报告方面是出了名的糟糕。在这个情况下,您所能做的就是检查 badbit在输出流上;这标准要求 <<运算符吸收所有异常,设置badbit如果它们发生。显然,这并没有告诉你错误是由于输入错误还是输出错误。

通常,如果您使用的是大多数编译器,无论如何都不会报告输入错误。为了大多数情况下,除非近年来情况有所改变,否则实现的 filebuf将输入错误与文件末尾完全一样。

如果你需要更好的错误报告,我想你被困住了实现你自己的 streambuf (不是真的很难),其中跟踪各种错误;然后你可以问 streambuf传输后它收到了什么错误。

关于c++ - 使用 rdbuf() 和运算符 << 在 C++ 中复制流时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8355148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com