我有一个设备向我发送uint32_t类型的二进制数据。我想将数据保存到二进制文件。这是我的代码:
#include<iostream>
#include<fstream>
#include <cstdlib>
using namespace std;
int main()
{
ofstream myFile ("data2.bin", ios::out | ios::binary);
bool buffer[32];
for (int k = 0; k<100; k++)
{
for (int i = 0; i<32;i++)
{
buffer[i] = (bool)rand()%2;
}
myFile.write ((char*)&buffer, 32);
}
myFile.close();
}
它有效,但文件大小为3.2 kB,而不是0.4 kB。此外,当我尝试从文件中读取数据(我的设备生成的数据)时,我得到了奇怪的结果,而不是手册中描述的格式。当然,有比我预期更多的数据。
我做错了什么?
答案 0 :(得分:9)
bool
需要一个字节。检查sizeof(bool)
,你会发现它等于1.所以数组长度为32个字节,你要写100次,因此3.2kB。
如果要存储位数组,则需要使用与bool
数组不同的内容。您有很多选择:
使用字节数组,整数或您知道其大小的任何内容,并明确打开您想要的位。然后,存储数组。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdint>
using namespace std;
int main()
{
ofstream myFile ("data2.bin", ios::out | ios::binary);
uint32_t buffer;
for (int k = 0; k<100; k++) {
buffer = 0;
for (int i = 0; i<32; i++) {
buffer <<= 1;
buffer |= (bool)(rand()%2);
}
myFile.write((char*) &buffer, sizeof(buffer));
}
myFile.close();
return 0;
}
事实上,如果您已经开始使用uint32_t
数组,那么您不需要循环,您可以直接存储数组。使用上面的确切myFile.write
行,其中buffer
是您的uint32_t
数组。
使用vector<bool>
或最好使用bitset
。两者都经过优化,每个元素使用一位。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <bitset>
using namespace std;
int main()
{
ofstream myFile ("data2.bin", ios::out | ios::binary);
bitset<32> buffer;
for (int k = 0; k<100; k++) {
for (int i = 0; i<32; i++) {
buffer[i] = (bool)(rand()%2);
}
myFile.write((char*) &buffer, 32/8);
}
myFile.close();
return 0;
}
当然,在这两种情况下,都会将字节输出到文件中。在第二种情况下,位数必须是8的倍数。