C 中合理的行缓冲区大小?
我正在使用 popen 读取 shell 命令的输出。我将使用 fgets 逐行读取。
我的问题是如何为我的 char* 缓冲区选择最佳缓冲区大小?我记得一位教授告诉我们要包含
并使用 LINE_MAX
来处理此类事情。它在我的 Mac 上运行良好,但在 Linux 上没有 LINE_MAX
。
这个邮件列表存档提出了同样的问题,但没有回答我的问题 http://bytes.com/topic/ c/answers/843278-not-able-locate-line_max-limits-h
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
当
没有定义LINE_MAX
,看看_POSIX2_LINE_MAX
,要求至少是2048。我通常使用4096。另外寻找(新的)POSIX函数
getline()
和getdelim( )
- 两者位于同一 URL。这些根据需要分配内存。程序 (
posix2_line_max.c
)输出:
posixver.h
在 Ubuntu 12.04 衍生版本上测试;命令行:
When
<limits.h>
does not defineLINE_MAX
, look at_POSIX2_LINE_MAX
, which is required to be at least 2048. I usually use 4096.Also look for the (new) POSIX functions
getline()
andgetdelim()
- both at the same URL. These allocate memory as necessary.Program (
posix2_line_max.c
)Output:
posixver.h
Tested on an Ubuntu 12.04 derivative; command line:
man getline
另请参阅 http:// www.gnu.org/s/libc/manual/html_node/Line-Input.html 以及
getline()
与fgets()
对比的讨论.获取()
。受到如此话题影响的次数超出了我的统计范围。man getline
Also see http://www.gnu.org/s/libc/manual/html_node/Line-Input.html and the discussion of
getline()
vs.fgets()
vs.gets()
. Has been subject on SO more often than I can count as well.您可以使用
malloc()
并根据需要进行扩展,或者使用源代码并查看 GNU 实用程序如何执行此操作。You could use
malloc()
and expand if necessary, or use the source and look at how a GNU utility does it.检查该行是否有“\n”,如果不存在,请在调用下一个 fget 之前扩展缓冲区。
check the line for an '\n', if not exists expand the buffer before you call the next fgets.
POSIX 系统有
getline
,它将为您分配一个缓冲区。在非 POSIX 系统上,您可以使用 Chuck B. Falconer 的公共域
ggets
函数,该函数类似。 (Chuck Falconer 的网站不再可用,尽管 archive.org 有一个副本,我已经为我自己的页面>ggets
。)POSIX systems have
getline
which will allocate a buffer for you.On non-POSIX systems, you can use Chuck B. Falconer's public domain
ggets
function, which is similar. (Chuck Falconer's website is no longer available, although archive.org has a copy, and I've made my own page forggets
.)