在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态地分配到一个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
您的代码有一些逻辑问题:
-
在
ptr[i] = (char *)malloc(3 * sizeof(char *));
中,3实际上应该是4+4。这个数字就是你的列数。在每一行中,有4个数字,用3个空格分隔。这是7个字符(或列)。您还有一个尾随换行符。总共有8列。 -
您没有在任何地方读取文件。
-
正如William Pursell所指出的,从注释中,您正在为
get_grid()
本地的数组分配内存。分配的内存基本上不会影响您的ar[][]
。 -
你说你需要将文件的内容打印到屏幕上,那么你为什么要使用
fprintf(fp, "%s", ar)
?这只会将内容输出回您的输入文件。您可以只使用printf()
。
解决方案:
-
更改
ptr[i] = (char *)malloc(3 * sizeof(char *));
进入
ptr[i] = (char *)malloc(8 * sizeof(char *));
-
在
get_grid()
中的for
循环中,为ptr[i]
分配内存后,立即逐行读取文件的内容,如下所示:fgets(ptr[i], sizeof(ptr[i]), fp);
-
既然您已经阅读了文件,就在上面的声明之后,更新您的
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()
必须具有文件指针。当然,如果你的需求发生了变化,那就忽略这句话