【问题标题】:C programming: how do you print the contents of a file after it's been dynamically allocated?C 编程:如何在动态分配文件后打印文件的内容?
【发布时间】:2013-02-18 22:50:38
【问题描述】:

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

文件的格式是这样的

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

【问题讨论】:

  • get_grid 中,您分配了ptrptr[i],但是当get_grid 返回时,您会忘记这些分配。也许您打算分配给ar

标签: c multidimensional-array malloc


【解决方案1】:

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

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

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

  3. 正如 William Pursell 所指出的,从 cmets 中,您正在为 get_grid() 的本地数组分配内存。此分配的内存不会影响您在 main 中的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 调用进行类型转换。请阅读 this 了解更多信息。
  • 您的代码中存在问题 - 如果您的行数和列数发生变化,您将难以跟上这些变化。我建议您 #define 您的行数和列数,并始终使用这些定义。
  • 确保display_grid()结束时释放分配的内存以避免出现内存泄漏情况。
  • 您的代码中有几个未使用的变量。 (这让像我这样挑剔的人很恼火。)
  • 您不需要传递文件指针。只有get_grid() 必须有您的文件指针。当然,如果您的需求不断变化,请忽略此声明。

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2021-08-02
    • 2013-02-03
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多