4

我正在使用 popen 来读取 shell 命令的输出。我将使用 fgets 逐行阅读。我的问题是如何为我的 char* 缓冲区选择最佳缓冲区大小?我记得一位教授告诉我们要包括<limits.h>和使用LINE_MAX这些东西。它在我的 Mac 上运行良好,但LINE_MAX在 Linux 上没有。

此邮件列表存档提出了相同的问题,但没有回答我的问题 http://bytes.com/topic/c/answers/843278-not-able-locate-line_max-limits-h

4

5 回答 5

6

<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
于 2010-08-23T22:20:40.193 回答
5

man getline

另请参阅http://www.gnu.org/s/libc/manual/html_node/Line-Input.htmlgetline()和vs. fgets()vs.的讨论gets()。受到 SO 的影响比我数的还要多。

于 2010-08-23T22:20:49.787 回答
0

如果需要,您可以使用malloc()和扩展,或者使用源代码并查看 GNU 实用程序是如何做到的。

于 2010-08-23T22:12:07.357 回答
0

检查该行是否有“\n”,如果不存在,请在调用下一个 fget 之前扩展缓冲区。

于 2010-08-23T22:22:24.527 回答
0

POSIX 系统getline会为您分配一个缓冲区。

在非 POSIX 系统上,您可以使用 Chuck B. Falconer 的公共域ggets功能,它与此类似。(Chuck Falconer 的网站不再可用,尽管archive.org 有一个副本,而且我已经为 . 制作了自己的页面ggets。)

于 2010-08-23T22:23:30.030 回答