2012-04-11 109 views
1

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

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

感谢,

+3

'operator >>'不会读取一个(四字节,或其他)二进制整数。它将读取整数的文本表示。 – 2012-04-11 18:09:47

+0

嗯,我想这解决了我的问题...任何关于如何手动处理的建议?如果read()没有读取至少4个字节,我可以使用putback()方法稍后再试一次吗?如果是这样,手动创建我的int使用这4个字节? – Xaqq 2012-04-11 18:17:28

+1

事实上,这就是'格式化'在这种情况下的含义。如果你想读取_binary_数据,那就是'无格式输入'。 – ildjarn 2012-04-11 18:17:41

回答

1

正如已经指出的那样,你不能在一个istream读取二进制数据。 但关于可用的字节发行数量(因为你 可能想使用basic_ios<char>streambuf为您的二进制 流):istreamostream使用streambuf的实际 采购和下沉的字节。而streambuf正常缓冲区: 程序是:如果一个字节的缓冲区,返回它,否则,尽量 重新加载缓存,等待直到重装完成后,或 决定性失败。如果确定失败,则返回文件结尾,并终止输入; istream将 记住文件的结尾,而不是尝试任何更多的输入。因此,如果您正在读取的 类型需要四个字节,它将请求 streambuf中的四个字节,并且通常会一直等到这四个字节为 那里。没有错误将被设置(因为没有错误);你会 只是不会从operator>>返回,直到这四个字节到达。

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