逐字节读取二进制istream

时间:2011-04-01 12:44:01

标签: c++ binaryfiles istream

我试图使用ifstream逐字节读取二进制文件。我之前使用像get()之类的istream方法一次读取二进制文件的整个块而没有问题。但是我目前的任务有助于逐字节地进行,并依靠io系统中的缓冲来提高效率。问题是我似乎比我应该更快地到达文件的末尾几个字节。所以我写了以下测试程序:

#include <iostream>
#include <fstream>

int main() {
    typedef unsigned char uint8;
    std::ifstream source("test.dat", std::ios_base::binary);
    while (source) {
        std::ios::pos_type before = source.tellg();
        uint8 x;
        source >> x;
        std::ios::pos_type after = source.tellg();
        std::cout << before << ' ' << static_cast<int>(x) << ' '
                  << after << std::endl;
    }
    return 0;
}

这会转储test.dat的内容,每行一个字节,显示前后的文件位置。

果然,如果我的文件碰巧有两个字节的序列0x0D-0x0A(对应于回车和换行),则会跳过这些字节。

  • 我以二进制模式打开了流。不应该阻止它解释行分隔符吗?
  • 提取操作员总是使用文本模式吗?
  • 从二进制istream逐字节读取的正确方法是什么?

Windows上的MSVC ++ 2008。

5 个答案:

答案 0 :(得分:18)

&gt;&gt;提取器用于格式化输入;他们跳过白色空间(通过 默认)。对于单字符无格式输入,您可以使用 istream::get()(返回int,如果读取失败则返回EOF,或者 范围[0,UCHAR_MAX])或istream::get(char&)中的值(放置 在参数中读取的字符,返回转换为的内容 bool,如果读取成功则为true,如果失败则为false。

答案 1 :(得分:5)

有一个read()成员函数,您可以在其中指定字节数。

答案 2 :(得分:4)

为什么使用格式化提取而不是.read()

答案 3 :(得分:4)

source.get()

会给你一个字节。它是无格式的输入功能。 运营商GT;&GT;是格式化的输入函数,可能意味着跳过空格字符。

答案 4 :(得分:2)

正如其他人提到的,你应该使用istream::read()。但是,如果必须使用格式化提取,请考虑std::noskipws