簡體   English   中英

在C ++中將向量的結構寫入二進制文件

[英]Writing struct of vector to a binary file in c++

我有一個結構,我想把它寫成二進制文件(c ++ / visual studio 2008)。 結構是:

struct DataItem
{
  std::string tag;        
  std::vector<int> data_block;
  DataItem(): data_block(1024 * 1024){}
};

我用隨機值填充data_block向量:

DataItem createSampleData ()
{   
    DataItem data;  
    std::srand(std::time(NULL));
    std::generate(data.data_block.begin(), data.data_block.end(), std::rand);   
    data.tag = "test";
    return data;
}

並嘗試將結構寫入文件:

void writeData (DataItem data, long fileName)
{
    ostringstream ss;
    ss << fileName;
    string s(ss.str());
    s += ".bin";

    char szPathedFileName[MAX_PATH] = {0};
    strcat(szPathedFileName,ROOT_DIR);
    strcat(szPathedFileName,s.c_str());
    ofstream f(szPathedFileName, ios::out | ios::binary | ios::app);            
    // ******* first I tried to write this way then one by one  
    //f.write(reinterpret_cast<char *>(&data), sizeof(data));
    // *******************************************************
    f.write(reinterpret_cast<const char *>(&data.tag), sizeof(data.tag));
    f.write(reinterpret_cast<const char *>(&data.data_block), sizeof(data.data_block));
    f.close();
}

主要是:

int main()
{
    DataItem data = createSampleData();
    for (int i=0; i<5; i++) {
         writeData(data,i); 
    }
}

因此,我期望文件大小至少為(1024 * 1024)* 4(對於矢量)+ 48(對於標簽),但是它只是將標簽寫入文件,並向硬盤驅動器創建1KB文件。

我在調試時可以看到內容,但是它沒有寫入文件...

這段代碼有什么問題,為什么我不能將strcut寫入vector到文件? 是否有更好/更快或更有效的方式來編寫它?

我是否必須序列化數據?

謝謝...

std::stringchar *不會產生預期的結果。 兩者都不會在其上使用sizeof 對於std::vector

對於矢量,您需要使用std::vector::data方法,或使用例如&data.data_block[0] 至於大小,請使用data.data_block.size() * sizeof(int)

但是寫字符串是另一回事,特別是如果它可以是可變長度的話。 您必須將其寫為固定長度的字符串,或者寫入長度(以固定大小的格式),然后是實際的字符串,或者在字符串的末尾寫一個終結符。 要獲得指向字符串的C風格指針,請使用std::string::c_str

歡迎來到C ++ std的歡樂世界::

基本上,載體意味着用作不透明的容器。
您可以立即忘記reinterpret_cast
嘗試關閉編譯器將允許您創建可執行文件,但它會產生愚蠢的結果。

基本上,您可以忽略與迭代器有關的大多數std :: vector語法糖,因為您的fstream不會通過迭代器訪問二進制數據(它將輸出數據的文本表示形式)。

但一切都不會丟失。

您可以使用新引入的(C ++ 11).data()方法訪問矢量基礎數組,但這會使用opaque類型。

const int * raw_ptr = data.data_block.data();

這將為您帶來100點的炫酷系數,而不是使用微不足道的

const int * raw_ptr = &data.data_block.data[0];

您還可以使用更加神秘的數據&data.data_block.front()來獲得50分的炫酷因子獎勵。

然后你可以一次編寫你的整體:

f.write (raw_ptr, sizeof (raw_ptr[0])*data.data_block.size());

現在,如果你想做一些非常簡單的事情,試試這個:

for (int i = 0 ; i != data.data_block.size() ; i++)
    f.write (&data.data_block[i], sizeof (data.data_block[i]));

這將消耗幾微秒,這將在背景噪聲中丟失,因為磁盤I / O將花費更多時間來完成寫入。

完全不酷,但是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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