我想使用ifstream从命名管道中读取数据。我想使用它的运算符>>读取格式化数据(通常是int)。 但是,我对错误处理的工作方式有点困惑。
想象一下,我想读取一个int,但只有3个字节可用。错误位将被设置,但这3个字节会发生什么?它们会“消失”吗?它们会被放回流中以便以后提取吗?
谢谢,
答案 0 :(得分:1)
正如已经指出的那样,您无法通过istream
读取二进制数据。
但是关于可用字节数的问题(因为你会
可能想要使用basic_ios<char>
和streambuf
作为二进制文件
流):istream
和ostream
使用streambuf
作为实际内容
采购和下沉字节。并且streambuf
通常缓冲:
过程是:如果一个字节在缓冲区中,则返回它,否则,尝试
重新加载缓冲区,等待直到重新加载完成,或者
最终失败了。如果确定失败,streambuf
返回文件末尾,终止输入; istream
会
记住文件的结尾,而不是再尝试输入。所以,如果
您正在读取的类型需要四个字节,它将从中请求四个字节
streambuf
,通常会等到这四个字节
那里。不会设置错误(因为没有错误);你会
只是不会从operator>>
返回,直到这四个字节到达。
如果您实现自己的二进制流,我强烈建议
使用相同的模式;它将允许直接使用已经存在的
标准组件,如std::ios_base
和(可能)std::filebuf
,
并将为其他程序员提供他们熟悉的习语。
如果阻塞是一个问题,最简单的解决方案就是运行
在单独的线程中输入,通过消息队列或
相似的东西。 (Boost支持异步IO。这可以避免
线程,但在全球范围内要复杂得多,并且效果不佳
与古典流成语。)