C++ 文件 IO - ASCII 值而不是二进制值

标签 c++

我想创建一个单字节二进制文件,其中只有一个字节: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。 这是为什么?

最佳答案

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

就您而言0x01将具有类型 int .

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

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

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

some_file << char{0x01};

或使用字 rune 字:

some_file << '\x01';

或者您可以使用put放置单个字符的方法,它需要 char参数,因此将导致 int 的隐式转换字面意思为char ,然后将其打印为由值表示的一个字符:

some_file.put(0x01);

some_file.put('\x01');

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

关于C++ 文件 IO - ASCII 值而不是二进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59523481/

相关文章:

c++ - VS 2012 Express 中的 C++ 控制台?

c++ - 如何使用移位运算符 << 分配 BH1750 光传感器中的值?

c++ - 如何在打印时在数组值之间留出空格?

c++ - 如何删除没有构造函数的派生类的对象

c++ - 编译简单的openCV项目

c++ - 如何找到数据在内存中的地址?

c++ - 并行与线程 - 性能

c++ - 在使用派生类时找到 "circular include"的出路

c++ - 使用 std::bind 分别绑定(bind)参数和对象实例

c++ - 在 C++ 中读取 popen 结果