std::ifstream::operator>> 不能将0xABCD翻译成短文吗?
std::ifstream::operator>> cannot translate 0xABCD into a short?
我正在尝试读取一个二进制文件,该文件是一系列字节和长度以小端序格式编码的。
我曾假设我可以使用ios::binary模式打开的ifstream,但显然我不能:当我尝试读取long时,它会设置failbit并抛出异常。
我不明白它为什么这样做。
这是我的代码:
std::string fname = (
boost::format(
(
boost::filesystem::initial_path()
/ "maps"
/ "w%02d.map"
)
.string()
)
% mapNum
)
.str();
if (!boost::filesystem::exists(fname))
throw std::runtime_error("No such map " + fname + "!");
std::ifstream file;
file.exceptions(std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit);
file.open(fname, std::ios::in | std::ios::binary);
char header[4];
file.read(header, 4);
if (!(header[0] == '!' && header[1] == 'I' && header[2] == 'D' && header[3] == '!'))
throw std::runtime_error(fname + " is not a valida map file!");
unsigned short int RLEWtag = 0;
file >> RLEWtag;
这些是文件的前10个字节:21 49 44 21 CD AB 40 00 40 00
如果它很重要,我在64位Windows 7上的VS2010中运行它。
您正在使用格式化的输入(即流提取操作符,operator>>
),它期望文本数据;相反,您需要使用un格式化的输入,就像您读取标题一样:
unsigned short RLEWtag;
char buf[2];
file.read(buf, 2);
std::memcpy(&RLEWtag, buf, 2);
或者,更简洁地(感谢@KerrekSB),
unsigned short RLEWtag;
file.read(reinterpret_cast<char*>(&RLEWtag), 2);
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从不同线程使用int64的不同字节安全吗
- 正在查找文档以获得PS4平台的C++中的设备信息
- C/C++编译器通常会删除重复的库吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 你能重载对象变量名本身返回的内容吗
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有人能分解一下这个c++模板的语法吗
- std::原子加载和存储都需要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 有人可以详细解释这个回文代码是如何工作的吗?
- 我可以将艾根·莱文伯格·马夸特与线性方程和常数雅可比矩阵一起使用吗?
- 有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗
- 有libXrandr API文档吗?
- 捕获A4大小的文档.OpenCV可以在Android中做到这一点吗?
- org是c++ 11标准文档的官方网站吗?
- 我可以从 MFC 中的另一个文档访问一个文档的数据吗