我需要写一个包含四列的矩阵(“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();
它工作正常,但现在我处理的是非常大(长)的矩阵,编写格式化的输出(“.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 :(得分:4)
要将二进制数据写入文件,首先需要以二进制模式打开文件,您需要使用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();