C++ 如何编写动态分配的2D';数组';在文件中?

C++ 如何编写动态分配的2D';数组';在文件中?,c++,arrays,file,C++,Arrays,File,因此,在学校作业中,我正在编写一个程序,使用动态2D“数组”对矩阵建模并对其执行操作。所以我所做的是创建一个名为matrix的结构,它包含两个整数作为行和列,以及一个双指针作为“数组”。我初始化了指针,如下所示: int **ary=new int*[row]; for(int i=0;i<row;++i) ary[i]=new int[col]; matrix M; y.write((char*)&M,sizeof M); y.read((char*)&M,s

因此,在学校作业中,我正在编写一个程序,使用动态2D“数组”对矩阵建模并对其执行操作。所以我所做的是创建一个名为matrix的结构,它包含两个整数作为行和列,以及一个双指针作为“数组”。我初始化了指针,如下所示:

int **ary=new int*[row];
for(int i=0;i<row;++i)
     ary[i]=new int[col];
matrix M;
y.write((char*)&M,sizeof M);
y.read((char*)&M,sizeof M);
程序运行正常,但我输入的内容与文件读取的内容不同。为什么会这样?还有哪些方法(使用fstream)将矩阵存储在文件中


注意:很明显,我对这个网站是全新的,到目前为止,我还不知道在这个网站上提问的正确的,嗯,礼仪。如果我的问题在某种程度上看起来很奇怪,或者遗漏了一些信息,请留下评论。欢迎进行有建设性的编辑。

ari
上的每个指针在内存中都是不同的块,因此您需要分别写入和读取它们:

写:

for(int i=0;i<row;++i) 
   y.write((char*)&(M[i]),sizeof(int) * col);

for(int i=0;i位于
ary
的每个指针在内存中都是不同的块,因此需要分别写入和读取它们:

写:

for(int i=0;i<row;++i) 
   y.write((char*)&(M[i]),sizeof(int) * col);

for(int i=0;i如果在一个块中分配所有内存,则可以这样做(如果不想这样做,请参阅其他答案):

int*block=newint[row*col]
对于(int i=0;i
基本上,我分配一个大数组,然后使每一行指向数组的相应部分。 现在如果你写信

y.write(static_cast<char*>(block), sizeof(int) * row * col);
y.read(static_cast<char*>(block), sizeof(int) * row * col);
y.write(静态转换(块),sizeof(int)*行*col);
y、 读取(静态(块),大小(整数)*行*列);

你也会得到同样的结果。现在很明显,如果你在读取时不知道
的值,这将不起作用。你还需要将它们写入文件,并在读取时读取第一个。如果你在一个块中分配所有内存,你可以做到这一点(参见其他答案)如果您不想这样做):

int*block=newint[row*col]
对于(int i=0;i
基本上,我分配一个大数组,然后使每一行指向数组的相应部分。 现在如果你写信

y.write(static_cast<char*>(block), sizeof(int) * row * col);
y.read(static_cast<char*>(block), sizeof(int) * row * col);
y.write(静态转换(块),sizeof(int)*行*col);
y、 读取(静态(块),大小(整数)*行*列);

你也会得到同样的结果。现在很明显,如果你在阅读时不知道
的值,这将不起作用。你还需要将它们写入文件,并在阅读时先读取。

什么是
M
?请提供。提示:保存指向文件的指针没有意义。你应该ULD编写每个值而不是指针。C++是java代码。停止<代码>新< /代码>你所创建的所有东西。我们有<代码>:STD::矢量<代码>:STD::数组< /C>和语言级数组。你不必<代码>新< /代码>你使用的每个对象。@ G-man在保存每个元素之前保存矩阵的大小。@ gman,如果你想知道为什么你的Routine是不可能工作的,在
read
write
调用中
sizeof M
的值是编译时值。假设
sizeof M
是50个字节。这50个字节不改变值,无论矩阵的维数是多少。它可以是
1x1
10000x1000
。给定t信息,即使你不知道指针的来龙去脉,你也知道你所做的方法没有办法保存。什么是代码> M <代码>?提示:保存指向文件的指针是没有意义的。你应该写每个值而不是指针。C++不是java。停止代码>新< /代码>你所创造的一切。e、 我们有
std::vector
std::array
和语言级数组。您不必
new
您使用的每个对象。@G-man在保存每个元素之前保存矩阵的大小。@G-man如果您想知道例程为什么永远无法工作,请读取
w中的
sizeof M
的值rite
调用是编译时的值。假设M
的大小为50字节。这50字节不会改变值,无论矩阵的维数是多少。它可以是
1 x 1
10000 x 10000
。根据这些信息,即使您不知道指针的输入和输出,您也会发现没有办法进行savi用你所做的方式进行ng可能会起作用。不要使用C样式转换,而是使用
static\u cast
代替。不要使用C样式转换,而是使用
static\u cast