我在这里搜索,但我发现的任何东西似乎都对我有用。我正在研究一个项目,并且我正在尝试实现一个标题如下的函数:
read_from_file(*r, *col, fp);
\ param * r,其中将存储新矩阵的行数; \ param * col,其中将存储新矩阵的列数; \ param fp该文件,已在程序主程序中的读取模式下打开,从矩阵中读取。
\ retval必须是p,指向新矩阵的指针,从文件中读取。
现在,每个文件都是这样的:
..........
.......@..
.....@@@@.
.....@@@..
..........
..........
..........
..........
..........
..........
基本上,程序必须能够选择上传由空单元组成的沉淀区域,并且在遇到障碍物的情况下,可以选择' @'。有些细胞也可能已满,' *'。 那些"特殊字符"也定义如下:
#define EMPTY '.'
#define FULL '*'
#define OBSTACLE '@'
表示沉降区域的矩阵必须是2D动态分配的数组。 我编写了关于行数和列数评估的代码片段,它工作得很好。我在尝试执行以下操作时遇到问题:在我写的示例文件中,矩阵是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;
}
}
}
提前致谢。
答案 0 :(得分:0)
你是如何尝试从文件中读取的?我想你应该查看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系统