Я пытаюсь изучить C и хотел бы иметь функцию, которая принимает имя файла, считывает каждую строку файла в массив и возвращает этот массив (или указатель на него, но я предполагаю, что в этом случае массивов, это почти всегда указатель уже) main()
. Но у меня есть предупреждение ниже, поэтому должно быть что-то не так в коде:
warning: incompatible pointer to integer conversion assigning to 'char' from
'char [1024]' [-Wint-conversion]
a_line[n - 1] = line;
^ ~~~~
1 warning generated.
Код:
#define BUFFER_MAX_LENGTH 1024
#define EXIT_FAILURE 1
char * read_lines_to_arr(char *fname, FILE **fp) {
char line[BUFFER_MAX_LENGTH];
// initialise array to store lines
// https://stackoverflow.com/questions/11198604/
// static, because otherwise array would be destroyed when function finishes
static char * a_line = NULL;
int n = 0;
*fp = fopen(fname, "r");
// Check for error....
if (*fp == NULL){
printf("error: could not open file: %s\n", fname);
exit(EXIT_FAILURE);
}
while (fgets(line, sizeof(line), *fp) != NULL) {
/*
fgets doesn't strip the terminating "\n" so we do it manually
*/
size_t len = strlen(line);
if (line[len - 1] == '\n') { // FAILS when len == 0
line[len -1] = '\0';
}
// printf("%s", line);
a_line = realloc (a_line, sizeof (char*) * ++n);
if (a_line == NULL)
exit (-1); // memory allocation failed
a_line[n - 1] = line; // <- this line is giving the warning
}
a_line = realloc(a_line, sizeof (char*) * (n + 1));
a_line[n] = 0;
return a_line;
}
Я думаю, мне нужно использовать realloc
/ malloc
в этом случае, потому что я не знаю, сколько строк будет в файле.
Любая помощь, чтобы решить / понять это было бы любезно.