【问题标题】:Read Values from a file and store it in 2D matrix从文件中读取值并将其存储在二维矩阵中
【发布时间】:2018-12-26 18:34:36
【问题描述】:

我正在尝试从文件中读取值,并在某些操作后写入另一个文件。这里面临一个小问题,因为我还试图将值保存在 2D 数组中并显示它。我的文件读取和文件写入显示正确的结果,但我的程序在显示矩阵部分时抛出异常。

#include <stdio.h>
#include <ctype.h>

#ifndef NULL
#define NULL   ((void *) 0)
#endif

int main(void)
{
    FILE *file  = NULL; //for file read
    FILE *fptr  = NULL; //for file write

    int mat[182][274];

    // code to read and display number from file
    // open file for reading
    file = fopen("file.txt", "r");
    fptr = fopen("file1.txt", "w");
    int i = 0,j=0;

    fscanf (file, "%d", &i);    
    while (!feof (file))
    {
        symbol = fgetc(file);

        if (symbol == '\n' || feof(file))
        {
            fprintf (fptr,"\n");
            printf("\n");
        }
        else{
            j=255-i;

            mat[i][j]=j;

            fprintf (fptr,"%d ", j);
            fprintf (fptr," ");
            printf ("%d ", j);
        }

        fscanf (file, "%d", &i);

   }
   fclose (file);
   fclose (fptr);


   //Facing issue in this part
   int k;
   int l;
   for (k=0;k<=182;k++)
   {

       for(l=0;l<=274;l++)
       {

           printf("%d ", mat[k][l]);
       }
   }

   return 0;
}

【问题讨论】:

  • 在代码末尾的for循环内打印时,这个mat[i][j] --> mat[k][l]k&lt;=182 --> k &lt; 182l&lt;=274 --> l &lt; 274 as &lt;= 倾向于访问超出绑定的数组元素,导致未定义的行为。
  • 做到了。仍然程序意外终止。我想这与 mat[i][j]=j; 有关系。线。这是问题的根源。
  • 数组int mat[182][274]; 的维度很奇怪,当j=255-i; 时,您将索引为mat[i][j]=j; 所以j 永远不能是&gt; 255,除非i &lt; 0 在这种情况下您遇到问题数组索引。
  • 可能是 j=255-i 只是一个操作。假设我在文件号 1 中有一个值 40。将从 255 中减去 40,结果将存储在第二个文件中。现在我希望这个数字存储在矩阵位置(0,0)等等重复这个过程直到循环结束。
  • 顺便说一句,你可以看看why !feof(file) is always problematic,不推荐。

标签: c file-handling file-read


【解决方案1】:

C 中的数组从 0 开始,到 (array_size - 1) 结束。

当您访问数组外的内存时,您很可能会遇到分段错误。

要解决此问题,请更改以下行:

 for (k=0;k<182;k++)
 {

  for(l=0;l<274;l++)
  {

      printf("%d ", mat[k][l]);
  }
 }

请注意,我将关系运算符从 &lt;=&gt;= 分别更改为 &lt;&gt;

除此之外,您可能还需要完全初始化您的数组。如果数组未初始化,可能会打印奇数。 (@Weather Vane)。

但是,为了最好地确定是否是这种情况,我们需要 file.txtfile1.txt

【讨论】:

  • 另外值得注意的是,作为一个自动数组,mat[][]它没有被初始化,所以对于没有显式设置的数组元素可能会打印一些奇怪的值。
  • @Weather Vane 谢谢。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多