0

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

文件的格式是这样的

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
4

1 回答 1

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()改为。

解决方案:

  1. 改变

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

    进入

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

  2. 在 in 的for循环中get_grid(),在为 分配内存之后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");
}

说了这么多,我必须指出几点:

  • malloc在 C 中不需要对调用进行类型转换。阅读内容以获取更多信息。
  • 您的代码中存在问题 - 如果您的行数和列数发生变化,您将难以跟上这些变化。我建议您#define使用您的行数和列数,并始终使用这些定义。
  • 确保在结束时释放分配的内存display_grid()以避免内存泄漏情况。
  • 您的代码中有几个未使用的变量。(它惹恼了像我这样挑剔的人。)
  • 您不需要传递文件指针。只get_grid()必须有你的文件指针。当然,如果您的需求发生变化,请忽略此声明。
于 2013-02-19T06:40:07.260 回答