【问题标题】:Reading from file and storing into 2D dynamically allocated array in C从文件读取并存储到 C 中的 2D 动态分配数组中
【发布时间】:2018-01-12 08:23:57
【问题描述】:

我在这里进行了搜索,但我发现的所有内容似乎都不适合我。我正在做一个项目,我正在尝试实现一个标题如下的函数:

read_from_file(*r, *col, fp);

\param *r,其中将存储新矩阵的行数; \param *col 将存储新矩阵的列数; \param fp 已在程序主程序中以读取模式打开的文件,从矩阵中读取的位置。

\retval 必须 p,指向新矩阵的指针,从文件中读取。

现在,每个文件都类似于:

..........
.......@..
.....@@@@.
.....@@@..
..........
..........
..........
..........
..........
..........

基本上,该程序必须可以选择上传由空单元格组成的沉降区,即“.”,如果有障碍物,则“@”。某些单元格也可能已满,“*”。 那些“特殊字符”也是这样定义的:

#define EMPTY '.'
#define FULL '*'
#define OBSTACLE '@'

表示沉淀区域的矩阵必须是一个二维动态分配的数组。 我写了一段关于行数和列数评估的代码,它工作得很好。我在尝试执行以下操作时遇到问题:在我在这里编写的示例文件中,矩阵是 10x10 的,因此,一个为矩阵分配了足够的空间:

char**p = malloc(row*sizeof(char*));
int i = 0;

for(i = 0; i < row; i++){
    p[i] = malloc(columns*sizeof(char));

我试图完成从文件中读取的是:

p[1][1] = '.';
p[1][2] = '.';
....
p[2][8] = '@';

等等。我尝试了很多方法,但似乎没有任何效果。一旦我尝试将这个新矩阵写入文件,当我尝试读取输出时,会显示一条错误消息,表明文件已损坏。 有人可以帮帮我吗?

我试过这样:

char*buffer = malloc(sizeof(char));
int k;

while(fgets(buffer, columns, fp) != NULL){
    for(i = 0; i < row; i++){
        k = 0;
        for(j = 0; j < columns; j++){
            if(j == col-1)
                p[i][j] = buffer[columns - 1]; /* excluding ‘\0’ here */
            else
                p[i][j] = buffer[k++];
            }
        }
}

我什至试过这样:

    While((c = fgetc(fp))) != EOF){
        for(i = 0; i < row; i++){
              for(j=0; j< columns; j++){
                     p[i][j] = c;
                   }
             }
       }

提前致谢。

【问题讨论】:

  • 错误信息来自哪里?从你的代码?来自编译器?从操作系统?您能尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们看吗?也请read about how to ask good questions.
  • 请注意,此代码char**p = malloc(row*sizeof(char*)); int i = 0; for(i = 0; i &lt; row; i++){ p[i] = malloc(columns*sizeof(char)); 分配an array of pointers to array,这与二维数组相同。真正期望的是什么,不知道...
  • 要动态分配一个真正的二维数组,如果您的编译器支持它们,您可以使用指向 VLA 的指针:char (*p)[row][columns] = malloc(sizeof *p)
  • 基本上沉淀区必须是指针处的矩阵。教授说我们必须以这种方式分配那个矩阵。我想我已经表达了非常抱歉。
  • 我尝试了很多方法,但似乎没有任何效果。但是您未能在此处显示任何代码尝试。我们可以帮助您修复错误或了解具体点,但您唯一的问题是有人可以帮助我吗?。答案显然是肯定的 ;-),但我们不会为您从头开始编写代码...您应该阅读(再次?)How to Ask

标签: c arrays file matrix


【解决方案1】:

您是如何尝试从文件中读取的?我想你应该看看read a file line by line.

你可以试试:

char**p = malloc(row*sizeof(char*));
char *line = NULL    
size_t len = 0;
int i = 0;

while ((getline(&line, &len, fp)) != -1) {
    p[i++] = strdup(line)
    printf("%s", line);
}

我认为这应该可行,没有在编译时对其进行测试,但我认为您有这个想法! 正如评论中的某人所说,小心 getline !它不是标准的 C 函数,使用它不能移植到非 POSIX 系统

【讨论】:

  • 需要注意的是getline不是标准的C函数,使用它不能移植到非POSIX系统。
  • 我试过了,但这不是我需要的。我需要通过 elem 解析文件 elem 并将每个 elem 关联到 p[i][j]。其中 i 范围从 0 到行,j 范围从 0 到列。
  • 更具体地说明您想要做什么。实际上,使用我提供给您的代码,如果您的文件正确,则该数组关联良好。然后,您可以添加另一个函数,该函数采用 **p 并返回您需要的内容!我不确定我是否通过“associate elem by elem”得到你想要的
  • 它应该适用于我的解决方案。您可以为每个字符访问 p[I][j] !
  • 它似乎不起作用。好像我无法从文件中读取!我不明白为什么!
猜你喜欢
  • 2017-11-04
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多