我试图使用 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。
std::noskipws
。 - James Kanze