Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程:如何打印文件后的内容';什么是动态分配的?_C_Multidimensional Array_Malloc - Fatal编程技术网

C编程:如何打印文件后的内容';什么是动态分配的?

C编程:如何打印文件后的内容';什么是动态分配的?,c,multidimensional-array,malloc,C,Multidimensional Array,Malloc,在程序中,我提示用户打开他想要的文件。然后,我将文件的内容动态分配到一个2D数组中。然后在一个单独的函数中,我应该将文件的内容打印到屏幕上。当我运行这个程序时,我没有收到任何错误,但是文件的内容并没有像我预期的那样打印到屏幕上。如何将文件内容打印到屏幕上?我是否正确地将其内容动态分配到数组中 文件的格式如下所示 100 00 01 1 这是我的密码: #include <stdio.h> #include <string.h> #include <stdlib.h&

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

文件的格式如下所示

100 00

01

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(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列

  • 您没有在任何地方读取该文件

  • 从评论中,正如William Pursell指出的,您正在为
    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");
    }