بيضاء في نهاية الملف تسبب EOF الاختيار الفشل في C ++

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أقرأ في البيانات من ملف يحتوي على ثلاثة أعمدة. على سبيل المثال البيانات سوف ننظر شيئا مثل:

3  START  RED
4  END    RED

لقراءة في البيانات أنا باستخدام الاختيار التالية:

while (iFile.peek() != EOF) {
   // read in column 1
   // read in column 2
   // read in column 3
}

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

وفعلت قليلا من غوغلينغ والبحث عن SO وجدت بعض حالات مماثلة مثل <وأ href = "https://stackoverflow.com/questions/21647/c-reading-from-text-file-until- الفولكلوري-يكرر الخط الأخير ولكن أنا لا يمكن أن يبدو "> القراءة من ملف نصي حتى يكرر EOF خط آخر جدا للتكيف مع الحل نظرا لحل مشكلتي. أي اقتراحات؟

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

المحلول

وعلى افتراض iFile هو istream:

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

لتأكد من عدم وجود أي شيء للاهتمام القادمة بعد الآن، هل يمكن، بعد الحلقة، إعادة الدولة تيار ومن ثم محاولة قراءة بيضاء فقط حتى EOF متناول يديك:

while( !iFile.eof() )
{
   iFile >> std::ws;
   string line;
   std::getline(iFile,line);
   if(!line.empty()) error(...);
}

نصائح أخرى

وEOF ليس التنبؤ ولكن حالة خطأ. وبالتالي، لا يمكن استخدامه مثل الذي تستخدمه الآن، التنبؤ ما إذا كان يمكنك قراءة العمود 1 و 2 و 3. لهذا السبب، وهو نمط شائع في C ++ هو:

while (input >> obj1 >> obj2) {
  use(obj1, obj2);
}

جميع operator>>(istream& is, T&) إعادة inputstream، وعند استخدامها في السياق المنطقي للتيار هو "الحقيقي" طالما نجح استخراج الماضي. ثم انها آمنة للاستخدام الكائنات المستخرج.

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

وربما عليك أن تنظر فيه فكرة جيدة للتعامل مع إدخال غير صالح مسافة بيضاء وغيرها من ثم. ربما بعض التحقق من صحة الأساسي من الأعمدة 1،2،3 سيكون من المرغوب فيه كذلك.

لا تقلق بشأن عدد المرات التي قمت حلقة: مجرد التحقق من صحة البيانات والتعامل مع المدخلات غير صالحة

والأساس، وتأكد من أن لديك ثلاثة أعمدة القراءة وإذا لم يكن لتقرر ما اذا كان لأن الملف هو أكثر أو بسبب بعض المسألة الأخرى.

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