C中的敏感行缓冲区大小?

时间:2010-08-23 22:09:05

标签: c file-io buffer fgets

我正在使用popen来读取shell命令的输出。我将使用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 个答案:

答案 0 :(得分:6)

<limits.h>未定义LINE_MAX时,请查看_POSIX2_LINE_MAX,其中必须至少为2048.我通常使用4096。

同时在同一个网址上查找(新)POSIX函数getline()getdelim()。这些必要时分配内存。


计划(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

答案 1 :(得分:5)

man getline

另请参阅http://www.gnu.org/s/libc/manual/html_node/Line-Input.html以及getline()fgets()gets()的讨论。一直受到SO的影响比我能算得多。

答案 2 :(得分:0)

您可以使用malloc()并在必要时展开,或使用源代码并查看GNU实用程序如何执行此操作。

答案 3 :(得分:0)

检查行是否为'\ n',如果不存在则在调用下一个fgets之前展开缓冲区。

答案 4 :(得分:0)

POSIX系统有getline,它将为您分配一个缓冲区。

在非POSIX系统上,您可以使用Chuck B. Falconer的公共域ggets功能,它类似。 (Chuck Falconer的网站已经不再可用,虽然archive.org has a copy,我已经my own page for ggets了。)