C++读取二进制文件时0b字节无法正常读取的原因问询
问题原因
你遇到的0x0b字节丢失问题,核心原因是误用了**格式化输入运算符>>**读取二进制文件:
- 即使你给
std::ifstream指定了std::ios::binary标识,这个标识的作用仅为禁用换行符\r\n和\n的自动转换,不会改变格式化输入函数的默认行为。 >>运算符默认会自动跳过所有ASCII空白字符,0x0b对应的是垂直制表符,属于标准定义的空白字符范畴,因此会被直接过滤,不会读取到变量a中。
修复方法
把读取逻辑替换为无格式的字节读取接口即可,比如用std::ifstream::get()方法,修改后的核心代码如下:
#include <iostream> #include <fstream> #include <iomanip> int main() { std::ifstream myFile ("input.bin", std::ios::in | std::ios::binary); if (myFile.is_open()) { std::cout << "File is open!\n"; unsigned char a; int i = 0; // 替换为get方法,无格式读取单个字节,不会跳过任何字符 while(myFile.get(reinterpret_cast<char&>(a))) { std::cout << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)a; i++; if (i%2==0) { if(i%16==0) std::cout << "\n"; else std::cout << "\t"; } } } myFile.close(); return 0; }
修改后所有字节包括0x0b都会被正常读取打印。
内容的提问来源于stack exchange,提问作者Mobi Zaman
相关产品推荐
相关产品推荐

