سؤال

لدي حلقة أن يقرأ كل سطر في ملف باستخدام getline():

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

لاحظت أن يدعو getline() مثل هذا أيضا يبدو للعمل:

while (getline(is, line))

ما الذي يجري هنا ؟ getline() يعود تيار المرجعية.هو أنه يجري تحويلها إلى مؤشر بطريقة أو بأخرى ؟ هذا هو في الواقع ممارسة جيدة أو يجب أن العصا إلى أول شكل ؟

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

المحلول

ووistream إرجاعها بواسطة getline() هو وجود منهجه void*() مشغل دعا ضمنا، والتي ترجع ما إذا كان تشغيل تيار في خطأ. على هذا النحو فإنه جعل المزيد من الشيكات من الدعوة إلى eof().

نصائح أخرى

تحديث:

كان عن طريق الخطأ إلى basic_istream الوثائق للمشغل منطقي() الأسلوب على basic_istream::خفير الدرجة, ولكن كما ذكرت هذه ليست في الواقع ما يحدث.لقد صوت تشارلز لوك الإجابات الصحيحة.انها في الواقع مشغل باطل*() التي أصبحت تسمى.أكثر على هذا في C++ التعليمات.

تشارلز لم تعطي الإجابة الصحيحة.

ما يسمى في الواقع std::basic_ios::operator void*(), و لا sentry::operator bool(), التي هي متسقة مع حقيقة أن std::getline() ترجع std::basic_istream (وهكذا ، std::basic_ios) و لا خفير.

من أجل غير المؤمنين ، انظر:

وإلا الأخرى ، تفضل النموذج الثاني الذي هو متعارف عليه.استخدام لا fail() لو كنت حقا تريد مطول كود-لم تذكر ما إذا كان xxx.good() يمكن أن تستخدم بدلا من !xxx.fail()

وأود أن العصا مع النموذج الأول. في حين قد يعمل النموذج الثاني، فإنه يكاد يكون صريحا. كود الأصلي يصف بوضوح ما يجري، وكيف أنه من المتوقع أن تتصرف.

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