1

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

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

谢谢,

4

1 回答 1

1

正如已经指出的那样,您无法通过istream. 但是关于可用字节数问题(因为您可能希望使用basic_ios<char>andstreambuf用于您的二进制流):istreamostream使用 astreambuf来实际获取和接收字节。通常缓冲区:过程是:如果streambuf一个字节在缓冲区中,则返回它,否则,尝试重新加载缓冲区,等待重新加载完成,或者最终失败。如果最终失败,则streambuf 返回文件结尾,并终止输入;istream将记住文件的结尾,不再尝试任何输入。因此,如果您正在读取的类型需要四个字节,它将从streambuf, 并且通常会等到这四个字节在那里。不会设置错误(因为没有错误);operator>>在这四个字节到达之前,您根本不会从那里返回。

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

于 2012-04-11T18:37:04.170 回答