我试图使用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(对应于回车和换行),则会跳过这些字节。
Windows上的MSVC ++ 2008。
答案 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
。