科研項目上遇到一個文件流的讀寫問題,要把一個圖片像素大小(1392*1038)的矩陣(double型)數據寫入磁盤,一開始是用ofstream將數據逐個寫入txt文件中,這樣做的結果就是寫出的文件太大,不利於存儲和轉移,而且讀寫速度奇慢,很影響後續工作的速度。還好最近看了leveldb的源碼,知道用ofstream的read、write函數將內存中的一塊數據與磁盤進行讀寫。嘗試了下,速度和文件的大小都大大改善。
打開文件的方式在ios類(所以流式I/O的基類)中定義,有如下幾種方式:
- ios::in 爲輸入(讀)而打開文件
- ios::out 爲輸出(寫)而打開文件
- ios::ate 初始位置:文件尾
- ios::app 所有輸出附加在文件末尾
- ios::trunc 如果文件已存在則先刪除該文件
- ios::binary 二進制方式
具體的如果你要像我一樣將內存中的一塊數據寫入磁盤,就要設置打開方式ios::binary,默認是ios::text;
讀寫時,記得將指向內存中數據塊的指針轉化爲char*;
源碼如下:
__int64 buffsize = sizeof(double)*W_I_D_T_H*H_E_I_G_H_T;
ifstream H1("./pd_bmp/pd_R_X_1.bin",ios::in|ios::binary);
double *h1 = new double[W_I_D_T_H*H_E_I_G_H_T];
//圖像尺寸W_I_D_T_H*H_E_I_G_H_T
H1.read((char*)h1,buffsize);