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 <<
专为格式化输出而设计。
在编写严格二进制时,您应该关注成员函数put
(用于一个字节)或write
(用于可变数量的字节)。
这会将您的位集写入单个字节。
binFile.put( a.to_ulong() );
【讨论】:
有效!非常感谢!【参考方案2】:我不确定 bitset
我可以用
实现单字节二进制文件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<8>' 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<90>
,则从 unsigned long long
设置低 64 位,其余 26 位初始化为零。以上是关于C ++将字节写入文件的主要内容,如果未能解决你的问题,请参考以下文章