قيمة الإرجاع لـ ifstream.peek () عندما تصل إلى نهاية الملف
سؤال
كنت أنظر إلى هذا المقال على 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;
}