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

时间:2011-12-02 10:47:43

标签: c++ filestream

“标准”提供了复制文件的方法,例如通过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套件的process-explorer)。

结果是:行完成,文件未正确复制,有时根本不复制,有时只关闭文件的一部分。 与运算符&lt;&lt;&lt;&lt;&rdbuf()的文档相矛盾,没有设置错误/失败状态,也没有抛出异常。

我唯一能注意到的是,在尝试关闭输入流时,会引发异常。

有没有人这么相同的现象?! 无论如何都要检查/测试这个是否正确完成?

此致

1 个答案:

答案 0 :(得分:1)

Streams在错误报告方面非常糟糕。在这 例如,你所能做的就是检查输出流上的badbit;该 标准要求<<运算符吸收所有异常,设置 badbit如果发生的话。显然,这并没有告诉你 错误是由输入错误还是输出错误引起的。

通常,如果您正在使用最常见的实现 编译器,无论如何都不会报告输入错误。为了 大多数情况下,除非近年来情况发生变化,否则实施 filebuf将输入错误视为文件末尾。

如果您需要更好的错误报告,我认为您一直坚持 实现你自己的streambuf(不是很困难),哪个 跟踪各种错误;然后你可以问streambuf 转移后收到的错误。