سؤال

أواجه وقتًا عصيبًا مع حلقة أثناء التنفيذ ، من المفترض أن تتوقف عندما نصل إلى نهاية الملف. هذا هو رمز الحلقة:

do  {
    if (pcompanyRow[0] != '#' && pass == 1) {
        strtok(pcompanyRow, ":");
        pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
        pass = 2;
        fgets(pcompanyRow, 1024, f);
    }
    if (pcompanyRow[0] != '#' && pass == 2) {
        strtok(pcompanyRow, ":");
        pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
        pass = 3;
        fgets(pcompanyRow, 1024 , f);
    }
    if (pcompanyRow[0] != '#' && pass == 3) {
        strtok(pcompanyRow, ":");
        pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
        pass = 4;
        fgets(pcompanyRow, 1024, f);
    }
    if (pass == 4)  {
        AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
        pass = 1;
    }
} while (!feof(f));

بعد الجري مع مصحح الأخطاء ، لاحظت أن جميع مشاكل التعطل التي أواجهها لأنها لا تخرج من هذه الحلقة حتى عندما وصلت إلى الخطوط بأكملها.

كيف يجب أن أكتبها بشكل صحيح؟

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

المحلول

أود تغيير حلقة ومنطقك لاستخدام هذا:

while (fgets(pcompanyRow, 1024, f) != NULL) {

    /* do things */

}

عندما تحاول FGETS () قراءة نهاية الملف ، ستعود فارغة وستخرج من الحلقة. لا يزال بإمكانك الاستمرار في الاستخدام pass وعلاماتك/منطقك الأخرى ، ولكن الظروف التي تتحقق منها ستكون مختلفة قليلاً.

نصائح أخرى

يجب ألا تستخدم FeOF () أبدًا كمؤشر خروج للحلقة. FeOf () صحيح فقط بعد قراءة نهاية الملف (EOF) ، وليس عند الوصول إلى EOF

مصدر هنا. كما يفسر المشكلة بالتفصيل وكيفية إصلاحها.

أقترح استخدام كل من fgets () و feof (). قد يكون للسلسلة الأخيرة في الملف n أو قد لا. إذا كنت تستخدم FEOF () فقط ، فيمكنك تخطي خط الأخير (فقد).

 for(;;)
 {char *pc;

  pc=fgets(buf,sizeof(buf),fd);

  if(!pc)
    {//it may be read error or end of file
      if(feof(fd))
        {//it is end of file, normal exit from for
         break;      
        }
       else
        {//it is i/o error 
         fclose(fd);
         return 2;
        }
    }
}//for
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top