C编程:如何打印文件后的内容';什么是动态分配的?
在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态分配到一个2D数组中。然后在一个单独的函数中,我应该将文件的内容打印到屏幕上。当我运行这个程序时,我没有收到任何错误,但是文件的内容并没有像我预期的那样打印到屏幕上。如何将文件内容打印到屏幕上?我是否正确地将其内容动态分配到数组中 文件的格式如下所示 100 00 01 1 这是我的密码:C编程:如何打印文件后的内容';什么是动态分配的?,c,multidimensional-array,malloc,C,Multidimensional Array,Malloc,在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态分配到一个2D数组中。然后在一个单独的函数中,我应该将文件的内容打印到屏幕上。当我运行这个程序时,我没有收到任何错误,但是文件的内容并没有像我预期的那样打印到屏幕上。如何将文件内容打印到屏幕上?我是否正确地将其内容动态分配到数组中 文件的格式如下所示 100 00 01 1 这是我的密码: #include <stdio.h> #include <string.h> #include <stdlib.h&
#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(int ar[3][4]);
文件*显示网格(int-ar[3][4],文件*fp);
int main()
{
文件*fp;
字符**ptr;
国际会计准则[3][4];
fp=获取网格(ar);
显示网格(ar、fp);
}//主要()
文件*获取网格(int ar[3][4])
{
文件*fp;
int i;
字符文件[80];
字符**ptr;
printf(“文件名:”);
scanf(“%s”,文件);
fp=fopen(文件“r”);
ptr=(char**)malloc(3*sizeof(char*);
对于(i=0;i<3;i++)
ptr[i]=(char*)malloc(3*sizeof(char*));
返回fp;
}//获取网格
文件*显示网格(int-ar[3][4],文件*fp)
{
fprintf(fp,“%s”,ar);
}//显示网格
您的代码存在一些逻辑问题:
ptr[i]=(char*)malloc(3*sizeof(char*))代码>,3实际上应该是4+4。该数字是您的列数。在每行中,您有4个数字,由3个空格分隔。这是7个字符(或列)。您还有一个尾随换行符。总共有8列
get\u 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
:最后,将您的
显示网格()
更改如下:
inti,j;
对于(i=0;i<3;i++)
{
对于(j=0;j<4;j++)
printf(“%d”,应收账款[i][j]);
printf(“\n”);
}
说到这里,我必须指出几点:
- 在C中不需要键入强制转换malloc调用。有关详细信息,请阅读
- 代码中的一个问题-如果行和列的数量发生了变化,您将很难跟上这些变化。我建议您定义行数和列数,并在整个过程中使用这些定义
- 确保在
末尾释放分配的内存,以避免出现内存泄漏的情况display\u grid()
- 代码中有几个未使用的变量。(这让像我这样挑剔的人很恼火。)
- 您不需要传递文件指针。只有
必须具有文件指针。当然,如果您的需求不断变化,那么请忽略此声明get\u grid()
get\u grid
中,您分配ptr
和ptr[i]
,但当get\u grid
返回时,您将无法跟踪这些分配。也许您打算分配给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 */
int i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
printf("%d ", ar[i][j]);
printf("\n");
}