2013-06-12 108 views
1

我需要寫一個四列(「g_Grid.r」,「g_Grid.t」,「g_Grid.b」,「g_Grid.ph」)的矩陣寫一個表格(雙打)到二進制文件IO C++

通常情況下,我用寫文件流文件:

ofstream fout; 
fout.open("GRID.dat"); 
for (int m=0;m<N_PH;++m) 
    { 
    for (int k=0;k<N_B;++k) 
     { 
      for (int j=0;j<N_T;++j) 
      { 
      for (int i=0;i<N_R;++i) 
       { 
        fout << setprecision(32) << g_Grid.r[i]<<" "<<g_Grid.t[j]<<" "<<g_Grid.b[k]<<" "<<g_Grid.ph[m]<< endl; 

       } 
      } 
     } 
    } 
fout.close(); 

其工作正常,但現在我處理非常大(長)矩陣,它需要年齡寫的格式化輸出(「.TXT」 )。由於我真的不需要格式化文件,所以它更願意將它寫爲二進制文件。

問題:給出四個矢量/陣列(R,T,B,PH),如何寫到二進制文件? (我用MATLAB稍後閱讀這個文件,還需要讀它作爲一個二進制表)

編輯

通常情況下,我用下面簡單的代碼寫的二進制文件:

ofstream myFile (fileName, ios::out | ios::binary); 
double val; 
for (int m=0;m<N_PH;++m) 
    { 
    for (int k=0;k<N_B;++k) 
     { 
      for (int j=0;j<N_T;++j) 
      { 
      for (int i=0;i<N_R;++i) 
       { 
        val = g_N.Amp[m][k][j][i]; 
        myFile.write(reinterpret_cast<const char*>(&val), sizeof(val)); 
       } 
      } 
     } 
    } 
myFile.close(); 

但是這個只會產生「單列」,而後面會被matlab讀取。

+0

是否MATLAB剛讀浮點數並沒有「額外」信息的純二進制文件? –

+0

@馬特彼得森 你是什麼意思?我使用非常簡單的命令來讀取二進制文件: fid = fopen(「name.dat」); X =的fread(FID, '雙'); 基本上,我可以將「四列」表重新排列爲「單列」,它將被matlab讀取並在稍後恢復「四列」。這是可行的。我想到了更簡單的方式來編寫和閱讀表格,而沒有額外的「黑魔法」。 –

+0

好吧,對Matlab不太瞭解,所以不知道你可以簡單地告訴它從一個文件中讀取一堆浮點數。將寫出一個答案... –

回答

3

要將二進制數據寫入文件,首先需要以二進制模式打開文件,則需要使用fstream::write。它需要一個char *參數,並從中寫入若干字節 - 如果數據不是char或指向char的數組,則char *參數需要強制轉換。爲了避免多次調用寫入,最好將數據填充到結構中。

因此,下面應該做你需要什麼:

ofstream fout; 
fout.open("GRID.dat", ios::binary); 
for (int m=0;m<N_PH;++m) 
    { 
    for (int k=0;k<N_B;++k) 
     { 
      for (int j=0;j<N_T;++j) 
      { 
      for (int i=0;i<N_R;++i) 
       { 
        struct X 
        { 
         double a, b, c, d; 
        } x; 

        x.a = g_Grid.r[i]; 
        x.b = g_Grid.t[j]; 
        x.c = g_Grid.b[k]; 
        x.d = g_Grid.ph[m]; 
        fout.write(reinterpret_cast<char *>(&x), sizeof(x)); 
       } 
      } 
     } 
    } 
fout.close(); 
+0

太棒了!現在運行檢查出來! –

+0

你可以請示,如何在r,t,b,ph中再次用C++和STORE讀取這個二進制文件? (我同時使用matlab和C來處理文件)。 (我在程序中使用IO作爲中間步驟,所以我需要寫入一個文件並再次讀取) –

+0

原理相同,只需使用ifstream而不是'ofstream'和'read'而不是寫入。 [可能是一個好主意,把'fout'的名字改成'fin',或者其他的,但是在功能上,這是不需要的] –