C getline () - как бороться с буферами / как читать неизвестное количество значений в массив - PullRequest
4 голосов
/ 07 февраля 2012

Прежде всего, немного предыстории: я пытаюсь получить список целых чисел из внешнего файла и поместить их в массив. Я использую getline для разбора входного файла построчно:

int lines = 0;
size_t * inputBuffer = (size_t *) malloc(sizeof(size_t));
char * storage = NULL;

Я звоню getline так:

getline(&storage, &s, input)

Я слышал от man-страницы на getline, что если вы предоставите буфер size_t *, вы можете настроить getline для вас, когда он превысит распределение байтов. Мой вопрос: для чего вы можете использовать этот буфер? Будет ли он содержать все элементы, которые вы прочитали с помощью getline ()? Проще ли читать из этого буфера или обходить входные данные, помещая эти числа в массив? Спасибо!

Ответы [ 2 ]

8 голосов
/ 07 февраля 2012

Это неправильное использование getline.Я настоятельно рекомендую прочитать внимательно ее справочную страницу .

У вас может быть такой код, как

FILE *inputfile=fopen("yourinput.txt", "r");
size_t linesiz=0;
char* linebuf=0;
ssize_t linelen=0;
while ((linelen=getline(&linebuf, &linesiz, inputfile)>0) {
  process_line(linebuf, linesiz);
  // etc
  free(linebuf);
  linebuf=NULL;
}

Кстати, вы могли бы (и, вероятно,должно быть лучше) поставить

  free(linebuf);
  linebuf=NULL;

... после цикла while (чтобы сохранить буфер строк, выделенный от одной строки к следующей), и в большинстве случаев предпочтительнее сделать это (чтобы избежатьслишком часто malloc -s от getline).

Обратите внимание, что getline находится в ISO / IEC TR 24731-2: 2010 расширение (см. n1248 ).

5 голосов
/ 07 февраля 2012

Буфер будет содержать только последнюю строку, которую вы прочитали с getline.Цель состоит в том, чтобы просто взять немного усилий по управлению памятью из вашего кода.

Что произойдет, если вы будете неоднократно вызывать getline, многократно передавая ему один и тот же буфер, это расширение буфера додлина самой длинной строки в вашем файле и оставайтесь там.Каждый вызов заменит его содержимое следующей строкой.

Вы не предоставляете ему size_t*, вы даете ему char*.

...