C编程:如何在动态分配文件后打印文件内容?

时间:2013-02-18 22:50:38

标签: c multidimensional-array malloc

在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态分配到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 个答案:

答案 0 :(得分:1)

您的代码存在一些逻辑问题:

  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()即可。

  5. <强>解决方案:

    1. 更改

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

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

    2. for中的get_grid()循环内,在为ptr[i]分配内存之后,按行如下一行读取文件内容:

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

    3. 现在您已经在上述声明之后阅读了该文件,请按以下步骤更新您的ar


    4. /* 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来电。请阅读this以获取更多信息。
      • 您的代码中存在问题 - 如果您的行数和列数发生变化,您在跟上这些更改时会遇到一些问题。我建议您#define您的行数和列数,并始终使用这些定义。
      • 确保display_grid() 结尾处释放已分配的内存,以避免内存泄漏。
      • 您的代码中有几个未使用的变量。 (它让像我这样的挑剔的人烦恼。)
      • 您无需绕过文件指针。只有get_grid()必须有您的文件指针。当然,如果您的需求在不断发展,那么请忽略此声明。