اكتشاف EOF في C ++ من ملف تم إعادة توجيهه إلى stdin

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

  •  28-09-2019
  •  | 
  •  

سؤال

تنفيذ الأمر:

./program < input.txt

مع التحقق من الكود التالي:

string input;
while(cin) {
  getline(cin, input);
}

يبدو أن الكود أعلاه يولد إضافيًا getline() اتصل حيث تكون الإدخال فارغة. يحدث هذا بغض النظر عما إذا كان هناك \n على السطر الأخير من input.txt.

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

المحلول

كان jacob الحل الصحيح ولكن حذف إجابته لسبب ما. إليك ما يحدث في حلقتك:

  1. cin يتم فحصه لأي من أجزاء الفشل (بادت ، فشل)
  2. cin تقارير لا توجد مشكلة لأنه لم يتم قراءة أي شيء من الملف.
  3. getline يطلق عليه والذي يكتشف نهاية الملف ، وتعيين بتات EOF و FAILBIT.
  4. يتم تنفيذ الحلقة مرة أخرى من 1 ، باستثناء هذه المرة يخرج.

تحتاج إلى فعل شيء مثل هذا بدلاً من ذلك:

std::string input;
while(std::getline(std::cin, input))
{
     //Have your way with the input.
}

نصائح أخرى

وماذا عن هذا:

string input;
while(getline(cin, input)) {
  //do something with input...
}

تعديل: يرجى ملاحظة ، في المثال أدناه ، أريكم "كيفية اكتشاف EOF". كما أشار Billy ، ربما تريد استخدامها good() بدلاً من eof() للكشف عن أي حالة خطأ أو eof. لقد قمت بتضمين معلومات حول هذا الأمر في نهاية إجابتي ، لكن هذا أمر مهم ، لذلك أقوم بإضافة هذه الملاحظة في الأعلى للتأكد من أن الأمر واضح.

(الجواب الأصلي يتبع)


انت تريد هذا:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}

استخدام operator! على iostream يتحقق فقط ما إذا كان قد حدث فشل أو حالة خطأ أخرى. iOS :: Operator! ().

يمكنك استخدام good() بدلاً من !eof() للتحقق من أي من الشروط eof, badbit, ، أو failbit. iOS :: جيد ().

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