Разумный размер строки буфера в C? - PullRequest
4 голосов
/ 24 августа 2010

Я использую popen для чтения выходных данных команд оболочки.Я буду использовать fgets для чтения построчно.Мой вопрос: как выбрать лучший размер буфера для моего буфера char *?Я помню, как один из профессоров говорил нам включать <limits.h> и использовать LINE_MAX для таких вещей.Он отлично работает на моем Mac, но в Linux нет LINE_MAX.

Этот архив списка рассылки ставит тот же вопрос, но не отвечает на мой вопрос http://bytes.com/topic/c/answers/843278-not-able-locate-line_max-limits-h

Ответы [ 5 ]

6 голосов
/ 24 августа 2010

Когда <limits.h> не определяет LINE_MAX, посмотрите на _POSIX2_LINE_MAX, который должен быть не менее 2048. Я обычно использую 4096.

Также ищите(новые) функции POSIX getline() и getdelim() - оба по одному и тому же URL.Они распределяют память по мере необходимости.


Программа (posix2_line_max.c)

#include "posixver.h"
#include <limits.h>
#include <stdio.h>

int main(void)
{
  printf("%d\n", _POSIX2_LINE_MAX);
  return 0;
}

Выход:

2048

posixver.h

#ifndef JLSS_ID_POSIXVER_H
#define JLSS_ID_POSIXVER_H

/*
** Include this file before including system headers.  By default, with
** C99 support from the compiler, it requests POSIX 2001 support.  With
** C89 support only, it requests POSIX 1997 support.  Override the
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
*/

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600   /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */
#else
#define _XOPEN_SOURCE 500   /* SUS v2, POSIX 1003.1 1997 */
#endif /* __STDC_VERSION__ */
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */

#endif /* JLSS_ID_POSIXVER_H */

Проверено на производной Ubuntu 12.04;командная строка:

gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Werror  posix2_line_max.c -o posix2_line_max
5 голосов
/ 24 августа 2010

man getline

Также см. http://www.gnu.org/s/libc/manual/html_node/Line-Input.html и обсуждение getline() против fgets() против gets(). Был предметом на SO чаще, чем я могу сосчитать.

0 голосов
/ 24 августа 2010

POSIX-системы имеют getline, который выделит для вас буфер.

В системах, отличных от POSIX, вы можете использовать функцию Чака Б. Фальконера для публичного домена ggets, котораяпохож.(Сайт Чака Фальконера больше недоступен, хотя archive.org имеет копию , и я создал свою собственную страницу для ggets.)

0 голосов
/ 24 августа 2010

проверьте строку на наличие \ n, если она не существует, разверните буфер, прежде чем вызывать следующие fgets.

0 голосов
/ 24 августа 2010

Вы можете использовать malloc() и расширять при необходимости, или использовать источник и посмотреть, как это делает утилита GNU.

...