我试图使用 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。