كيفية استخدام EOF للتشغيل من خلال ملف نصي في ج؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

لدي ملف نصي يحتوي على سلاسل على كل سطر. أريد زيادة رقم لكل سطر في الملف النصي، ولكن عندما يصل إلى نهاية الملف، فمن الواضح أن ذلك يحتاج إلى التوقف. لقد حاولت القيام ببعض الأبحاث حول EOF، لكن لم أتمكن من فهم كيفية استخدامه بشكل صحيح.

أنا أفترض أنني بحاجة لفترة من الوقت، لكنني لست متأكدا من كيفية القيام بذلك.

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

المحلول

تعتمد كيفية اكتشاف EOF على ما تستخدمه لقراءة الدفق:

function                  result on EOF or error                    
--------                  ----------------------
fgets()                   NULL
fscanf()                  number of succesful conversions
                            less than expected
fgetc()                   EOF
fread()                   number of elements read
                            less than expected

تحقق من نتيجة استدعاء المدخلات للحالة المناسبة أعلاه، ثم اتصل feof() لتحديد ما إذا كانت النتيجة كانت بسبب ضرب eof أو بعض الأخطاء الأخرى.

استخدام fgets():

 char buffer[BUFFER_SIZE];
 while (fgets(buffer, sizeof buffer, stream) != NULL)
 {
   // process buffer
 }
 if (feof(stream))
 {
   // hit end of file
 }
 else
 {
   // some other error interrupted the read
 }

استخدام fscanf():

char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
  // process buffer
}
if (feof(stream)) 
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

استخدام fgetc():

int c;
while ((c = fgetc(stream)) != EOF)
{
  // process c
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

استخدام fread():

char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 
                                                     // element of size
                                                     // BUFFER_SIZE
{
   // process buffer
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted read
}

لاحظ أن النموذج هو نفسه بالنسبة لهم جميعا: تحقق من نتيجة عملية القراءة؛ إذا فشلت، ومن بعد تحقق من eof. سترى الكثير من الأمثلة مثل:

while(!feof(stream))
{
  fscanf(stream, "%s", buffer);
  ...
}

هذا النموذج لا يعمل بالطريقة التي يعتقد الناس أنه يفعل ذلك feof() لن يعود صحيحا حتى بعد لقد حاولت أن تقرأ بعد نهاية الملف. نتيجة لذلك، تنفذ الحلقة مرة واحدة كثيرة جدا، والتي قد تسبب لك أو لا تسبب لك بعض الحزن.

نصائح أخرى

واحد حلقة C ممكن سيكون:

#include <stdio.h>
int main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        /*
        ** Do something with c, such as check against '\n'
        ** and increment a line counter.
        */
    }
}

في الوقت الحالي، أود أن أتجاهل feof وظائف مماثلة. يوضح Exprience أنه من السهل للغاية الاتصال به في الوقت الخطأ ومعالجة شيء مرتين في الاعتقاد بأن EOF لم يتم الوصول إليه بعد.

فطائر لتجنب: باستخدام char لنوع ج. getchar إرجاع الحرف التالي يلقي إلى unsigned char ثم إلى int. وبعد هذا يعني أنه على معظم [عاقل] منصات القيمة EOF وصحيح "char"القيم في c لا تتداخل حتى لا تكتشف بطريق الخطأ EOF للحصول على "طبيعي" char.

يجب عليك التحقق من eof بعد القراءة من الملف.

fscanf_s                   // read from file
while(condition)           // check EOF
{
   fscanf_s               // read from file
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top