gpt4 book ai didi

c++ - 逐字节读取二进制 istream

转载 作者:IT老高 更新时间:2023-10-28 21:55:37 31 4
gpt4 key购买 nike

我试图使用 ifstream 逐字节读取二进制文件。我之前使用过像 get() 这样的 istream 方法来一次读取二进制文件的整个 block 而没有问题。但我目前的任务是逐字节进行,并依靠 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。

最佳答案

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

关于c++ - 逐字节读取二进制 istream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513532/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com