[英]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::string
為char *
不會產生預期的結果。 兩者都不會在其上使用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.