多维数组 - C 编程:动态分配文件后如何打印文件内容?



在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态地分配到一个2D数组中。然后在一个单独的函数中,我应该将文件的内容打印到屏幕上。运行此程序时不会出现任何错误,但文件的内容并没有像预期的那样打印到屏幕上。如何将文件的内容打印到屏幕?我是否正确地将其内容动态分配到数组中?

文件的格式类似于

1 0 0 0

0 0 0 1

1 1 1 1

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *get_grid(int ar[3][4]);
FILE *display_grid(int ar[3][4], FILE *fp);
int main()
{
  FILE *fp;
  char **ptr;
  int ar[3][4];
  fp = get_grid(ar);
  display_grid(ar, fp);
}//main ()
FILE *get_grid(int ar[3][4])
{
  FILE *fp;
  int i;
  char file[80]; 
  char **ptr;
  printf("File name: ");
  scanf("%s", file);
  fp = fopen(file, "r");
  ptr = (char **)malloc(3 * sizeof(char *));
  for(i = 0; i < 3; i++)
    ptr[i] = (char *)malloc(3 * sizeof(char *));
  return fp;
}//get grid
FILE *display_grid(int ar[3][4], FILE *fp)
{
  fprintf(fp, "%s", ar);
}//display grid

您的代码有一些逻辑问题:

  1. ptr[i] = (char *)malloc(3 * sizeof(char *));中,3实际上应该是4+4。这个数字就是你的列数。在每一行中,有4个数字,用3个空格分隔。这是7个字符(或列)。您还有一个尾随换行符。总共有8列。

  2. 您没有在任何地方读取文件。

  3. 正如William Pursell所指出的,从注释中,您正在为get_grid()本地的数组分配内存。分配的内存基本上不会影响您的ar[][]

  4. 你说你需要将文件的内容打印到屏幕上,那么你为什么要使用fprintf(fp, "%s", ar)?这只会将内容输出回您的输入文件。您可以只使用printf()

解决方案:

  1. 更改

    ptr[i] = (char *)malloc(3 * sizeof(char *));

    进入

    ptr[i] = (char *)malloc(8 * sizeof(char *));

  2. get_grid()中的for循环中,为ptr[i]分配内存后,立即逐行读取文件的内容,如下所示:

    fgets(ptr[i], sizeof(ptr[i]), fp);

  3. 既然您已经阅读了文件,就在上面的声明之后,更新您的ar如下:


/* Make sure you initialize 'p' and 'j' in the beginning */
char *p = strtok(ptr[i], " ");  /* This code gets the numbers from the */
do                              /* space-delimited array you have read from the file */
{                               /* Example: */
    ar[i][j] = atoi(p);         /* ptr[i]: "0 0 0 1" */
    j++;                        /* strtok(ptr[i], " ") will yield the first '0' */
} while(p = strtok(NULL, " ")); /* strtok(NULL," ") will continue where the previous */                 
                                /* strtok() left off */

最后,将您的display_grid()更改如下:


int i, j;
for(i = 0; i < 3; i++)
{
    for(j = 0; j < 4; j++)
        printf("%d ", ar[i][j]);
    printf("n");
}

说到这里,我必须指出几点:

  • 在C中,类型转换malloc调用是不必要的。有关详细信息,请阅读本文
  • 代码中的一个问题是,如果行和列的数量发生了变化,那么就很难跟上这些变化。我建议您#define您的行数和列数,并始终使用这些定义
  • 请确保display_grid()结束时释放分配的内存,以避免出现内存泄漏情况
  • 您的代码中有几个未使用的变量。(这让像我这样挑剔的人很恼火。)
  • 您不需要到处传递您的文件指针。只有get_grid()必须具有文件指针。当然,如果你的需求发生了变化,那就忽略这句话

相关内容

  • 没有找到相关文章

最新更新