将表(双打)写入二进制文件 IO C++

Arn*_*ein 2 c++ io binary-data

我需要写一个四列的矩阵(“g_Grid.r”、“g_Grid.t”、“g_Grid.b”、“g_Grid.ph”)

通常,我使用文件流写入文件:

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();
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在我正在处理非常大(长)的矩阵,编写格式化输出(“.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();
Run Code Online (Sandbox Code Playgroud)

但是这个只会产生“一列”,而稍后将被 matlab 读取。

Mat*_*son 5

要将二进制数据写入文件,首先需要以二进制方式打开文件,需要使用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();
Run Code Online (Sandbox Code Playgroud)