C ++将字节写入文件

Posted

技术标签:

【中文标题】C ++将字节写入文件【英文标题】:C++ writing byte to file 【发布时间】:2022-01-10 17:59:41 【问题描述】:

我正在尝试将一个字节写入 C++ 中的文件。当我保存它时,它是 8 字节大,而不是 1 字节。我怎样才能只保存一个字节?

ofstream binFile("compressed.bin", ios::out | ios::binary);
bitset<8> a("10010010");
binFile << a;

ls -la 的输出:

.rw-r--r-- name staff   8 B  Sat Dec  4 23:26:18 2021  compressed.bin

我怎样才能把它缩小到一个字节?

【问题讨论】:

我认为发布的重复 Why is std::bitset<8> 4 bytes big? 解释了问题,但没有回答这里提出的问题。投票重新开放。 你看文件的内容了吗?查看输出的内容比查看输出的数量更能提供信息。 (当您期望文件中包含非文本数据时,十六进制编辑器可能很有用。或者对于这么小的文件,您可以创建另一个程序,从 compressed.bin 读取每个字节,转换为整数,然后流式传输到屏幕上(不要忘记数字之间的空格)。 哦.. 如果我提到的“另一个程序”报告所有(或大部分)整数值都在 32-126 范围内,请考虑转换为 char,因为那是可打印字符的范围。 【参考方案1】:

operator &lt;&lt; 专为格式化输出而设计。

在编写严格二进制时,您应该关注成员函数put(用于一个字节)或write(用于可变数量的字节)。

这会将您的位集写入单个字节。

binFile.put( a.to_ulong() );

【讨论】:

有效!非常感谢!【参考方案2】:

我不确定 bitset 是什么类,但它似乎在下面创建了一个 uint64_t。也许模板参数是字节数而不是位?

我可以用

实现单字节二进制文件
std::ofstream binFile("onebyte.bin", std::ios::out | std::ios::binary);
uint8_t aByte = 0x77; // this is w in ASCII. Easy to see in a bin file
binFile << aByte;

也许您需要将 bitset 转换为 uint8_t?

【讨论】:

“可能模板参数是字节数而不是比特数?” -- No. “也许您需要将 bitset 转换为 uint8_t?” -- 结果为 error: invalid cast from type 'std::bitset&lt;8&gt;' to type 'uint8_t' 当您不知道问题的主题是什么时,您可能应该在回答之前测试您的理论(无论如何这都是一个好主意)。更好的是,还可以查找the documentation。 啊,好的。您正在使用 STL 位集。因此,如果您在此处阅读构造函数:en.cppreference.com/w/cpp/utility/bitset/bitset 如果大小小于 64,您将看到它构造一个 64(或 32 字节,具体取决于 c++ 版本)。所以您想使用 put 和 .en.cppreference.com/w/cpp/utility/bitset/to_ulong 作为 Drew Dormann上面描述的,或者从它返回到 uint8_t 并使用流运算符的 static_cast。我认为 Drew 很好地解释了为什么 .put() 更合适 “如果大小小于 64,你会看到它构造了一个 64(或 32 字节,取决于 c++ 版本)。” -- 我在文档。该页面上唯一出现的32(和64)是指构造函数的参数大小,而不是构造对象的大小。该部分文档说,如果您从 64 位 unsigned long long 构造 std::bitset&lt;90&gt;,则从 unsigned long long 设置低 64 位,其余 26 位初始化为零。

以上是关于C ++将字节写入文件的主要内容,如果未能解决你的问题,请参考以下文章

C语言二进制流写入文件

C++ 将字符串写入文件 = 额外字节

c# 将字符串以二进制形式写入文件

在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych

如何在lua中设置文件写入函数调用的长度?

c怎样在文件中插入数据