حجم الخط المخزن المؤقت المعقول في ج؟
سؤال
أنا أستخدم 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
.)