سؤال

أنا أستخدم Popen لقراءة الإخراج من أوامر Shell. سأستخدم fgets لقراءة الخط من السطر. سؤالي هو كيفية اختيار أفضل حجم المخزن المؤقت لـ char* المخزن المؤقت؟ أتذكر من أستاذ يخبرنا أن ندرج <limits.h> والاستخدام LINE_MAX لمثل هذه الأشياء. إنه يعمل بشكل جيد على جهاز Mac الخاص بي ، ولكن لا يوجد LINE_MAX على Linux.

يطرح أرشيف القائمة البريدية هذا السؤال نفسه ، ولكن لا يوجد إجابة على سؤاليhttp://bytes.com/topic/c/answers/843278-not-able-lock-line_max-limits-h

هل كانت مفيدة؟

المحلول

متي <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

نصائح أخرى

man getline

انظر أيضا http://www.gnu.org/s/libc/manual/html_node/line-input.html ومناقشة getline() ضد. fgets() ضد. gets(). لقد تم عرضه في كثير من الأحيان أكثر مما يمكنني الاعتماد عليه أيضًا.

يمكنك استخدام malloc() والتوسع إذا لزم الأمر ، أو استخدم المصدر وانظر في كيفية قيام أداة GNU بذلك.

تحقق من السطر للحصول على ' n' ، إن لم يكن موجودًا ، قم بتوسيع المخزن المؤقت قبل الاتصال بـ fgets التالية.

أنظمة Posix لديها getline الذي سيخصص لك مخزن مؤقت.

على أنظمة غير بوسكس ، يمكنك استخدام المجال العام لـ Chuck B. Falconer ggets وظيفة ، وهو مشابه. (لم يعد موقع Chuck Falconer متاحًا ، على الرغم من ذلك Archive.org لديه نسخة, ، وقد صنعت صفحتي الخاصة ggets.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top