【问题标题】:How to write dynamically allocated 2D 'array' in a file?如何在文件中写入动态分配的二维“数组”?
【发布时间】:2015-12-07 14:46:55
【问题描述】:

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

int **ary=new int*[row];
for(int i=0;i<row;++i)
     ary[i]=new int[col];

现在我知道我的程序看起来会非常缓慢和低效,并且对于这个网站上的人来说通常是可怕的,但请记住,我正在做一个学校作业,我不能使用 fancy 诸如矢量之类的东西。

然后我尝试在二进制文件中写入然后读取结构对象,例如使用 fstream 对象 y,如下所示:

matrix M;
y.write((char*)&M,sizeof M);
y.read((char*)&M,sizeof M);

程序可以运行,但我输入的内容与文件读取的内容不同。为什么呢?还有哪些其他方法(使用 fstream)将我的矩阵存储在文件中?

注意:很明显,我对这个网站完全陌生,到目前为止,我还不知道在这个网站上提问的正确礼仪。如果我的问题在某些方面看起来很奇怪或缺少某些信息,请发表评论。欢迎进行建设性的修改。

【问题讨论】:

  • 什么是M?请提供MCVE
  • 提示:保存指向文件的指针没有意义。您应该编写每个 而不是指针。
  • C++ 不是 Java。停止newing 你创造的一切。我们有std::vectorstd::array 和语言级数组。您不必new 您使用的每个对象。
  • @G-man 在保存每个元素之前保存矩阵的大小。
  • @G-man 如果你想知道为什么你的例程永远无法工作,sizeof M 在你的readwrite 调用中的值是compile-time i> 价值。假设sizeof M 是 50 个字节。无论矩阵的尺寸是多少,这 50 都不会改变值。可能是1 x 110000 x 10000。鉴于这些信息,即使您不知道指针的来龙去脉,您也会发现无法按照您已经完成的方式进行保存。

标签: c++ arrays file


【解决方案1】:

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

int* block = new int[row*col]
for (int i=0; i < row; i++)
   ary[i] = block + i*col;

基本上,我分配一个大数组,然后使每一行指向数组的相应部分。 现在如果你写

y.write(static_cast<char*>(block), sizeof(int) * row * col);
y.read(static_cast<char*>(block), sizeof(int) * row * col);

你会得到同样的东西。现在可能很明显,如果您在阅读本文时不知道 rowcol 的值,将无法正常工作。您还需要将它们写入文件并在读取时读取第一个。

【讨论】:

    【解决方案2】:

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

    写:

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

    阅读:

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

    如果您发布 matrix 的定义,我可以提供更好的帮助。

    【讨论】:

    • 不要使用 C 风格的强制转换,而是使用 static_cast
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2017-09-28
    相关资源
    最近更新 更多