[英]Writing binary files in C++
我有一個設備向我發送類型為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。 此外,當我嘗試從文件中讀取數據(我的設備生成的數據)時,我得到了奇怪的結果,而不是手冊中描述的格式。 當然,有比我預期更多的數據。
我究竟做錯了什么?
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的倍數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.