【发布时间】: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 < 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