سؤال

أقوم بتشغيل نفسي من خلال كتاب نصي C ++ لديّ كبرمجة تجديد لبرمجة C ++. واحدة من مشاكل الممارسة (دون الخوض في الكثير من التفاصيل) تريد مني تحديد وظيفة يمكن تمريرها ifstream أو cin (على سبيل المثال) كحجة. من هناك ، يجب أن أقرأ من خلال الدفق. المشكلة هي ، لا يمكنني معرفة طريقة للحصول على هذا واحد وظيفة استخدام CIN و ifstream للعثور بشكل فعال على نهاية الدفق. يسمى،

while(input_stream.peek() != EOF)

لن تعمل لصالح CIN. يمكنني إعادة صياغة الوظيفة للبحث عن عبارة معينة (مثل "#".

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

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

المحلول

eof() يفعل العمل في CIN. أنت تفعل شيئًا خاطئًا ؛ الرجاء نشر الرمز الخاص بك. كتلة عثرة شائعة هي ذلك eof يتم تعيين العلم بعد تحاول القراءة وراء نهاية الدفق.

هنا مظاهرة:

#include <iostream>
#include <string>

int main( int, char*[] )
{
    std::string s;
    for ( unsigned n = 0; n < 5; ++n )
    {
        bool before = std::cin.eof();
        std::cin >> s;
        bool after = std::cin.eof();
        std::cout << int(before) << " " << int(after) << "  " << s << std::endl;
    }

    return 0;
}

وإخراجها:

D:>t
aaaaa
0 0  aaaaa
bbbbb
0 0  bbbbb
^Z
0 1  bbbbb
1 1  bbbbb
1 1  bbbbb

(يمكن إنشاء EOF مع CTRL-Z على Windows و Ctrl-D على العديد من أنظمة أخرى)

نصائح أخرى

لماذا لا std::cin.eof() الشغل؟ cin سوف تشير EOF عند إغلاق Stdin ، والذي سيحدث عندما يشير المستخدم إلى ذلك Ctrl+د (*nix) أو Ctrl+z (Windows) ، أو (في حالة دفق إدخال الأنابيب) عند انتهاء ملف الأنابيب

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

نظرًا لأن معظم عمليات IO على التدفقات تعيد الدفق (بحيث يمكن ربطها). يمكنك القيام بعملية القراءة الخاصة بك واستخدام النتيجة في الاختبار (كما هو مذكور أعلاه).

لذا فإن برنامجًا لقراءة تيار من الأرقام من دفق:

int main()
{
   int x;

   // Here we try and read a number from the stream.
   // If this fails (because of EOF or other error) an internal flag is set.
   // The stream is returned as the result of operator>>
   // So the stream is then being used in the boolean context of the while()
   // So it will be converted to true if operator>>  worked correctly.
   //                         or false if operator>> failed because of EOF
   while(std::cin >> x)
   {
       // The loop is only entered if operator>> worked correctly.
       std::cout << "Value: " << x << "\n";
   }

   // Exit when EOF (or other error).
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top