我正在尝试编写一个读取文本文件的函数,并将文本文件的每一行复制到传递给函数的数组行中。
void read_lines(FILE* fp, char*** lines, int* num_lines) {
int i = 0, line_count = 0;
char line[256], c;
fscanf(fp, "%c", &c);
while(!feof(fp)){
if(c == '\n') {
++line_count;
}
printf("%c", c);
fscanf(fp, "%c", &c);
}
rewind(fp);
*num_lines = line_count;
lines = (char***)malloc(line_count * sizeof(char**));
while (fgets(line, sizeof(line), fp) != NULL) {
lines[i] = (char**)malloc(strlen(line) * sizeof(char*));
strcpy(*lines[i], line);
}
++i;
}
}
初始部分扫描换行符,以便我知道最初分配给行的数量。我不知道我哪里出错了。
此外,如果任何人有任何资源可以帮助我更好地理解如何动态分配空间,那将非常感激。
答案 0 :(得分:2)
您应该了解指针的工作原理。在那之后,动态内存分配任务将是非常微不足道的。现在你的代码是完全错误的:
//here you assign to the argument. While this is technically allowed
//it is most certainly not what you have intended
lines = (char***)malloc(line_count * sizeof(char**));
while (fgets(line, sizeof(line), fp) != NULL) {
//sizeof(char*) <> sizeof(char). Also you need a space for the trailing \0
lines[i] = (char**)malloc(strlen(line) * sizeof(char*));
//[] precedes * so it is copying the string somewhere you not intend to
strcpy(*lines[i], line);
}
++i;
}
正确的版本应该是:
*lines = malloc(line_count * sizeof(char*));
while (fgets(line, sizeof(line), fp) != NULL) {
(*lines)[i] = malloc((strlen(line) + 1) * sizeof(char));
strcpy((*lines)[i], line);
}
++i;
}
请注意,您需要使用(*lines)[i]
构造,因为[]
运算符位于*
(取消引用)运算符之前。
答案 1 :(得分:1)
代码正在犯各种错误,包括@Ari0nhh
详述的关键错误另一个是计算'\n'
无法通过3种方式获得正确的行数与fgets()
:
行超过256。
超过INT_MAX
行。
最后一行不以'\n'
结尾。
建议使用相同的循环来计算“行”
unsigned long long line_count = 0;
while (fgets(line, sizeof(line), fp) != NULL) {
line_count++;
}
rewind(fp);
....
assert(line_count <= SIZE_MAX/sizeof *(*lines));
*lines = malloc(sizeof *(*lines) * line_count);