Если у вас есть доступ к библиотеке GNU C, вы можете использовать getline
:
FILE *f;
char *line = NULL;
size_t line_size = 0;
int i=0;
/* Open the file, or get access it to it however you will */
for(; i <= requestedLine; ++i) {
if ( getline(&line, &line_size, f) == -1 ) {
//error condition, log / bail
}
}
/* line now holds the line number you want, do whatever you want with it */
fclose(f);
if (line) {
/* guard against the empty file case */
free(line);
}
getline
захватит для вас полную строку и решит большинство проблем с выделением памяти. Первый параметр - это указатель на буфер char*
(как в char**
- указатель на указатель на начало char
буфера), а второй - размер этого буфера. Если буфер недостаточно велик, getline
создаст новый буфер, достаточно большой, чтобы вместить строку и очистить ваш старый (выполняет realloc
). Когда функция вернется, первый параметр теперь будет указывать на новый буфер, который содержит строку, а второй параметр также будет обновлен для хранения нового размера буфера. Третий параметр - это просто объект FILE*
для чтения. getline
вернет -1 при ошибке, поэтому в этом случае мы регистрируем / освобождаем залог.
Обратите внимание, что когда все будет сделано, вам все еще нужно освободить буфер, который создает getline
.