首页 > 解决方案 > C++ 文件 IO - ASCII 值而不是二进制值

问题描述

我想创建一个只有一个字节的单字节二进制文件:0x01。这是我用 C++ 编写的程序:

#include <iostream>
#include <fstream>
using namespace std ;

int main ( )
{
    ofstream some_file ("some_file.bin", ios::out | ios::app | ios::binary);
    some_file << 0x01 ;
    some_file.close( );
    return 0;
}

当我使用十六进制编辑器检查创建的文件时 - 我看到值 0x31 而不是 0x1。这是为什么 ?

标签: c++

解决方案


0x01是一个整数文字。整数文字始终是整数类型,其等级至少为int. 因此它们不能是类型char(或signed char/ unsigned char)。

在你的情况下0x01将有 type int

char它的signed/unsigned变体是唯一的整数类型,它operator<<在 anstd::ostream上将输出由 . 中保存的值表示的单个字符char

对于其他整数类型operator<<,将输出十进制表示格式的整数值。

如果要从其 ASCII 代码中打印单个字符,则需要转换0x01char

some_file << char{0x01};

或使用字符文字:

some_file << '\x01';

或者您可以使用该put方法放置单个字符,该字符带有一个char参数,因此会导致int文字隐式转换为char,然后将其打印为由值表示的一个字符:

some_file.put(0x01);

或者

some_file.put('\x01');

相反<<put将直接写字符而不改变。<<受可以在流上设置的格式选项的影响,例如可能会添加填充。如果您想绝对确定只打印单个字符而不进行更改,put这可能是正确的选择。


推荐阅读