قيمة الإرجاع لـ ifstream.peek () عندما تصل إلى نهاية الملف

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

  •  02-10-2019
  •  | 
  •  

سؤال

كنت أنظر إلى هذا المقال على cplusplus.com ، http://www.cplusplus.com/reference/iostream/istream/peek/

ما زلت غير متأكد من إرجاع Peek () إذا وصلت إلى نهاية الملف.

في الكود الخاص بي ، من المفترض أن يتم تشغيل جزء من البرنامج طالما كان هذا البيان صحيحًا

(sourcefile.peek() != EOF)

حيث SourceFile هو ifstream الخاص بي.

ومع ذلك ، فإنه لا يتوقف أبدًا عن الحلقات ، على الرغم من أنه وصل إلى نهاية الملف.

هل لا تعني EOF "نهاية الملف"؟ أم كنت أستخدمه خطأ؟

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

المحلول

استشارة المعيار ،

عائدات:traits::eof() إذاgood()هوfalse. خلاف ذلك ، يعودrdbuf()->sgetc().

أما بالنسبة لل sgetc(),

إرجاع: إذا لم يكن موضع قراءة تسلسل الإدخال غير متوفر ، فالإرجاع underflow().

و underflow,

إذا كان التسلسل المعلق فارغًا ، فإن الوظيفة تعود traits::eof() للإشارة إلى الفشل.

لذا نعم ، يعود EOF في نهاية الملف.

طريقة أسهل لمعرفة أنها تعود int_type. منذ قيم int_type هي مجرد تلك char_type بالإضافة إلى EOF ، من المحتمل أن يعود char_type إذا لم يكن EOF ممكنًا.

كما ذكر آخرون ، peek لا تقدم موضع الملف. عمومًا أسهل وأفضل فقط لمجرد الحلقة while ( input_stream ) واترك الفشل في الحصول على مدخلات إضافية تقتل عملية التحليل.

نصائح أخرى

الأشياء التي تتبادر إلى الذهن (دون رؤية الكود الخاص بك).

  • EOF يمكن تعريفها بشكل مختلف عما تتوقع
  • sourcefile.peek() لا تقدم مؤشر الملف. هل تقدمها يدويًا بطريقة ما ، أم أنك ربما تنظر باستمرار إلى نفس الشخصية؟

EOF هو للوظائف على غرار C الأقدم. يجب أن تستخدم istream::traits_type::eof().

يحرر: عرض التعليقات يقنعني ذلك istream::traits_type::eof() مضمون لإرجاع نفس القيمة EOF, ، ما لم يكن بالصدفة EOF تم إعادة تعريفه في سياق كتلة المصدر الخاصة بك. في حين أن النصيحة لا تزال على ما يرام ، هذا هو ليس الجواب إلى السؤال كما تم النشر.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//myifstream_peek1.cpp
int main()
{
 char ch1, ch2;
 ifstream readtext2;
 readtext2.open("mypeek.txt");
 while(readtext2.good())
 {
 if(readtext2.good())
 {
  ch2 = readtext2.get();   cout<< ch2;
 }
 }
   readtext2.close();
 //
 ifstream readtext1;
 readtext1.open("mypeek.txt");
 while(readtext1.good())
    {
    if(readtext1.good())
     {

        ch2 = readtext1.get();
        if(ch2 ==';')
            {
             ch1= readtext1.peek();
             cout<<ch1;  exit(1);
            }
            else {  cout<<ch2; }
        }

    }
    cout<<"\n end of ifstream peeking";
   readtext1.close();
return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top