簡體   English   中英

用C ++編寫二進制文件

[英]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數組不同的東西。 你有很多選擇:

  1. 使用字節數組,整數或您知道其大小的任何內容,並顯式打開您想要的位。 然后,存儲數組。

     #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數組。

  2. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM