اكتشاف EOF في C ++ من ملف تم إعادة توجيهه إلى stdin
سؤال
تنفيذ الأمر:
./program < input.txt
مع التحقق من الكود التالي:
string input;
while(cin) {
getline(cin, input);
}
يبدو أن الكود أعلاه يولد إضافيًا getline()
اتصل حيث تكون الإدخال فارغة. يحدث هذا بغض النظر عما إذا كان هناك \n
على السطر الأخير من input.txt.
المحلول
كان jacob الحل الصحيح ولكن حذف إجابته لسبب ما. إليك ما يحدث في حلقتك:
cin
يتم فحصه لأي من أجزاء الفشل (بادت ، فشل)cin
تقارير لا توجد مشكلة لأنه لم يتم قراءة أي شيء من الملف.getline
يطلق عليه والذي يكتشف نهاية الملف ، وتعيين بتات EOF و FAILBIT.- يتم تنفيذ الحلقة مرة أخرى من 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 :: جيد ().