هل fgets () دائما إنهاء شار المخزن المؤقت مع 0؟

StackOverflow https://stackoverflow.com/questions/1660228

  •  11-09-2019
  •  | 
  •  

سؤال

هل FGETS () قم دائما بإنهاء المخزن المؤقت Char with 0 حتى إذا تم الوصول إلى EOF بالفعل؟ يبدو أنه يفعل ذلك (بالتأكيد يفعل ذلك في التنفيذ المقدم في كتاب ANSI K & R)، لكنني اعتقدت أنني سأطلب التأكد من ذلك.

أعتقد أن هذا السؤال ينطبق على وظائف أخرى مماثلة مثل يحصل ().

تحرير: أعرف أن 0 يتم إلحاقه أثناء الظروف "العادية"، ويستهدف سؤالي في oof أو ظروف الخطأ. علي سبيل المثال:

FILE *fp;
char b[128];
/* ... */
if (feof(fp)) {
    /* is \0 appended after EACH of these calls? */
    fgets(b, 128, fp);
    fgets(b, 128, fp);
    fgets(b, 128, fp);
}
هل كانت مفيدة؟

المحلول

لا تستخدم أبدا يحصل!

 7.19.7.2 FENTS وظيفة ملخص 1 #includeu003Cstdio.h> Char * FENTS (Char * تقييد S، Int N، File * تقييد الدفق)؛ الوصف 2 يقرأ وظيفة FGENTS على الأكثر قليلا من عدد الأحرف المحددة بواسطة N من الدفق المدببة حسب الدفق في الصفيف المدبأ إلى S. لا تتم قراءة أحرف إضافية بعد حرف جديد (يتم الاحتفاظ به) أو بعد نهاية الملف. تتم كتابة حرف فارغ مباشرة بعد قراءة الشخصية الأخيرة في الصفيف. إرجاع 3 وظيفة FENTS إرجاع S إذا نجحت. إذا تمت مصادفة نهاية الملف ولم يتم قراءة أي شخصيات في الصفيف، فإن محتويات الصفيف تبقى دون تغيير ويتم إرجاع مؤشر فارغ. إذا حدث خطأ في القراءة أثناء العملية، فإن محتويات الصفيف غير محددة ويتم إرجاع مؤشر فارغ.

وبالتالي، نعم, ، متي fgets() لا يرجع Null صفيف الوجهة دائما لديه شخصية فارغة.

إذا fgets() إرجاع NULL، قد تم تغيير صفيف الوجهة وقد لا يكون لديه حرف فارغ. لا تعتمد أبدا على الصفيف بعد الحصول على خالية من fgets().


يحرر وأضاف المثال

$ القط fgets_error.c #includeu003Cstdio.h> باطل print_buf (char * buf، size_t len) {int k؛ printf ("٪ 02x"، BUF [0])؛ ل (ك = 1؛ ك

يرى؟ لا nul في buf :)

نصائح أخرى

fgets هل تضيف دائما " 0" إلى المخزن المؤقت للقراءة، يقرأ على الأكثر size - 1 شخصيات من الدفق (size كونها المعلمة الثانية) بسبب هذا.

لم أستعمل أبدا gets نظرا لأنك لا تستطيع أبدا أن تضمن أنه لن تتجاوز أي مخزن مؤقت كنت تعطيه، فاخذ أنه في حين أنه يقوم دائما بإنهاء سلسلة القراءة دائما لا يساعد ذلك بالفعل.

الرجل fgets:

يقرأ FGENTS () في أكثر من الأحرف الأقل من حجم الأحرف من تيار ويخزنها في المخزن المؤقت توقف القراءة بعد eof أو جديد. إذا تم قراءة سطر جديد، يتم تخزينه في المخزن المؤقت. يتم تخزين " 0" بعد الحرف الأخير في المخزن المؤقت.

إذا قمت بفتح الملف في الوضع الثنائي "RB"، وإذا كنت ترغب في قراءة سطر النص حسب الخط باستخدام FGENTS، فيمكنك استخدام التعليمات البرمجية التالية لحماية برنامجك لفقدان النص، إذا بواسطة خطأ يحتوي النص على ' 0 'بايت. ولكن أخيرا مثل الآخرين المذكورة، عادة لا ينبغي أن تستخدم fgets إذا كان الدفق يحتوي على " 0".


size_t filepos=ftell(stream);
fgets(buffer, buffersize, stream);
len=strlen(buffer);
/* now check for > len+1 since no problem if the 
   last byte is 0 */
if(ftell(stream)-filepos > len+1) 
{
    if(!len) filepos++;
    if(!fseek(stream, filepos, SEEK_SET) && len)
    {
        fread(buffer, 1, len, stream);
        buffer[len]='\0';
    }
}

نعم إنها كذلك. من cplusplus.com.

يقرأ الأحرف من تيار وتخزينها كسلسلة C إلى STR حتى (Num-1) تم قراءة الأحرف أو إما جديد أو يتم الوصول إلى نهاية الملف، أيهما يأتي أولا.

يحقق حرف Newline fgets عن القراءة، ولكنه يعتبر حرفا صالحا، وبالتالي يتم تضمينه في السلسلة التي تم نسخها إلى Str.

يتم إلحاق حرف Null تلقائيا تلقائيا في Str بعد قراءة الأحرف للإشارة إلى نهاية سلسلة C.

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