ifstream运算符>>和错误处理

时间:2012-04-11 18:07:03

标签: c++ iostream

我想使用ifstream从命名管道中读取数据。我想使用它的运算符>>读取格式化数据(通常是int)。 但是,我对错误处理的工作方式有点困惑。

想象一下,我想读取一个int,但只有3个字节可用。错误位将被设置,但这3个字节会发生什么?它们会“消失”吗?它们会被放回流中以便以后提取吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

正如已经指出的那样,您无法通过istream读取二进制数据。 但是关于可用字节数的问题(因为你会 可能想要使用basic_ios<char>streambuf作为二进制文件 流):istreamostream使用streambuf作为实际内容 采购和下沉字节。并且streambuf通常缓冲: 过程是:如果一个字节在缓冲区中,则返回它,否则,尝试 重新加载缓冲区,等待直到重新加载完成,或者 最终失败了。如果确定失败,streambuf 返回文件末尾,终止输入; istream会 记住文件的结尾,而不是再尝试输入。所以,如果 您正在读取的类型需要四个字节,它将从中请求四个字节 streambuf,通常会等到这四个字节 那里。不会设置错误(因为没有错误);你会 只是不会从operator>>返回,直到这四个字节到达。

如果您实现自己的二进制流,我强烈建议 使用相同的模式;它将允许直接使用已经存在的 标准组件,如std::ios_base和(可能)std::filebuf, 并将为其他程序员提供他们熟悉的习语。 如果阻塞是一个问题,最简单的解决方案就是运行 在单独的线程中输入,通过消息队列或 相似的东西。 (Boost支持异步IO。这可以避免 线程,但在全球范围内要复杂得多,并且效果不佳 与古典流成语。)