在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态分配到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
答案 0 :(得分:1)
您的代码存在一些逻辑问题:
在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 *));
在for
中的get_grid()
循环内,在为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");
}
说完这些,我必须指出几件事:
malloc
来电。请阅读this以获取更多信息。#define
您的行数和列数,并始终使用这些定义。display_grid()
结尾处释放已分配的内存,以避免内存泄漏。get_grid()
必须有您的文件指针。当然,如果您的需求在不断发展,那么请忽略此声明。