4

popen を使用して、シェル コマンドからの出力を読み取ります。fgets を使用して 1 行ずつ読み取ります。私の質問は、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 を使用します。

getline()また、(新しい) POSIX 関数と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」の行を確認してください。存在しない場合は、次の fgets を呼び出す前にバッファを展開してください。

于 2010-08-23T22:22:24.527 に答える
0

POSIX システムにはgetline、バッファを割り当てるものがあります。

非 POSIX システムでggetsは、同様の Chuck B. Falconer のパブリック ドメイン関数を使用できます。(chuck Falconer の Web サイトはもう利用できませんが、archive.org にはコピーがあり、私は自分のページを作成しましたggets。)

于 2010-08-23T22:23:30.030 に答える