Как записать 2d динамический c массив в файл в C - PullRequest
0 голосов
/ 22 апреля 2020
 int row,col,i,j;
 int **matrix;

 printf("Col:");
 scanf("%d",&col);
 printf("Row:");
 scanf("%d",&row);

 matrix= (int**) malloc(row* sizeof(int));
    if(NULL == matrix)
      {
      free(matrix);
      printf("Error.\n");
      exit(-1);
      }
for (i=0;i<row;i++)
{
  matrix[i] = (int*) malloc(col* sizeof(int));
    if(NULL == matrix[i])
      {
       free(matrix[i]);
       printf("Error.\n");
       exit(-1);
      }
}

for (i=0;i<col;i++)
   {
       for (j=0;j<row;j++)
     {
       matrix[i][j]=1+rand()%1000000;
     }
   }
FILE *tfile;


tfile=fopen("matrix.txt","w");
fwrite(matrix,sizeof(matrix),matrix,tfile);
fclose(tfile);

Так что моя проблема в том, что когда я пытаюсь выполнить этот вывод кода, происходит шифрование c следующим образом: ˜1œ ° 1œ È1œ à1œ a ™ w ¬Æ <<br> Как записать 2d массив в файл, если это динамический c массив? И что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Это неправильно:

matrix= (int**) malloc(row* sizeof(int));

Это должно быть sizeof(int*) вместо sizeof(int).

Это тоже неправильно:

for (i=0;i<col;i++)
   {
       for (j=0;j<row;j++)
     {
       matrix[i][j]=1+rand()%1000000;

Когда вы Вы выделили массивы, у вас было row первое и col второе, но теперь у вас есть col первое и row второе. Это должно быть matrix[j][i] вместо matrix[i][j].

И это действительно очень неправильно:

fwrite(matrix,sizeof(matrix),matrix,tfile);

Почему вы думаете, что указатель является подходящим значением для nmemb? И указатели не являются массивами. У вас есть указатель, а не массив, поэтому вы не можете использовать один вызов fwrite для записи всего. Вам нужно будет делать это построчно изнутри al oop.

И даже если ваша программа работает правильно, вы все равно получите вывод "crypti c", так как вы ' Я буду писать кучу случайных чисел в двоичной форме. Если вы хотите, чтобы они были текстом ASCII, вам нужно будет использовать что-то вроде fprintf вместо fwrite.

0 голосов
/ 22 апреля 2020

Вам нужно исправить эту строку:

matrix = (int **) mallo c (row * sizeof (int));

в эту

matrix = (int **) mallo c (row * sizeof ( int *));

Edit : как указал Джозеф, это не единственный проблема в коде.

...