2012-09-22 129 views
0

我有一些我在C++中處理的財務數據。我將它存儲在一個簡單的二進制格式,因爲它需要更少的資源,並且速度很快,但是我想爲文件添加壓縮。我猜測我會受到IO的限制,所以壓縮在處理速度方面不會花費太多。如何將二進制數據寫入壓縮文件

我不知道如何做壓縮,因爲我是一名學者而不是真正的程序員。我真的可以用一隻手握住這個。

I have my data in a structure like this: 

    struct TradesBin { 
    int ttim; 
    int prc; 
    int siz; 
    short int g127; 
    short int corr; 
    char cond[2]; 
    char ex[1]; 
}__attribute__((packed)); 

,我可以寫一個二進制文件,如下所示:

ofstream fout(outfile.c_str(), ios::out | ios::binary); 
fout.write((char *) &tbin, sizeof(TradesBin)); 

凡TBIN充滿TradesBin數據。

我現在如何爲這些文件添加壓縮?我只聽說過ZLO,Bzip2,zlib和Boost.IOStreams。我非常感謝你的指導和建議!

謝謝!

+0

Zlib是你想使用的,但不幸的是,使用它有點棘手,因爲它是以一種協同的方式運行的。當然,更簡單的是編寫平面文件,然後用壓縮方式壓縮它們。 –

+0

Boost有一個[zlib過濾器](http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/classes/zlib.html),它允許您在普通C++流的頂部使用zlib。但是,你確定你需要壓縮嗎? [不成熟的優化](http://c2.com/cgi/wiki?PrematureOptimization)和所有... – willglynn

+0

@HotLicks:不需要協程。就在最近,我處理了大量簡單數字數據的代碼,我們讀取/寫入一串雙打。 –

回答

2

Zlib允許你這樣做,但它只提供一個普通的C接口。概括地說,你做

gzFile fp = gzopen(fname.c_str(),"wb"); 
gzwrite(fp, (void*) (&vec[0]), sizeof(TradesBin)*nelem); 
gzclose(fp); 

其中vec將是例如std::vector<TradesBin>TradesBin結構。

+0

感謝您的回覆。我幾乎是「在那裏」實施你的方法。但是,我收到一個編譯錯誤,指出「沒有從std :: vector >到」voidpc「的合適轉換。有什麼建議嗎? – TJB

+0

是的,碰巧我也必須這樣做。更新答案...請隨時upvote和接受:) –