যাইহোক, সি ++ প্রোগ্রামাররা লক্ষ্য করে যে সর্বদা যা ঘটে তা হ'ল cin.eof () শেষ লাইনে দু'বার পড়া না হওয়া পর্যন্ত "সত্য" প্রত্যাবর্তন করে না।
যা হচ্ছে তা নয়। eofbitকোন একটি বুলিয়ান রূপান্তর একটি ভূমিকা পালন করে ( stream::operator bool(অথবা operator void*পুরোনো C ++))। শুধুমাত্র badbitএবং failbitজড়িত।
ধরা যাক আপনি একটি ফাইল পড়ছেন যা শ্বেতস্পেসে পৃথক সংখ্যাসমৃদ্ধ একটি ফাইল রয়েছে। চারপাশে ভিত্তিক একটি লুপ cin.eof()অনিবার্যভাবে ভুল হবে বা ifপরীক্ষায় পূর্ণ হবে । আপনি ইওএফ অবধি পড়ছেন না। আপনি সংখ্যা পড়ছেন। সুতরাং আপনার কোডটি সেই যুক্তিটি প্রকাশ করুন:
while (stream >> some_var) {
process_value(some_var);
}
এটি ফাইলের শেষ লাইনটি শেষ হবে 0 42\nবা ঠিক 0 42( ফাইলের শেষ লাইনের শেষে কোনও নতুন লাইন নয়) তা কাজ করবে। যদি ফাইলটি শেষ হয় 0 42\n, শেষ ভাল পঠনটি 42 টি মানটি পুনরুদ্ধার করবে এবং লাইন চিহ্নিতকারীটির চূড়ান্ত প্রান্তটি পড়বে। নোট করুন যে ইওএফ চিহ্নিতকারীটি এখনও পড়েনি। process_valueসঙ্গে ফাংশন বলা হয় 42। প্রবাহ নিষ্কাশন অপারেটর >> পাশে কল ফাইলের শেষে লেখা আছে, এবং কিছুই যেহেতু বের করা হয়েছে, উভয় eofbitএবং failbitসেট হবে।
মনে করুন অন্যদিকে, ফাইলটি শেষ হয় 0 42(শেষ লাইনের শেষে কোনও নিউলাইন নেই)। সর্বশেষ ভাল পঠন ইওএফ চিহ্নিতকারীতে 42 টি সমাপ্তি মানটি পুনরুদ্ধার করবে। সম্ভবত আপনি এটি প্রক্রিয়া করতে চান ৪২. এই কারণেই eofbitইনপুট স্ট্রিম বুলিয়ান রূপান্তর অপারেটরে কোনও ভূমিকা রাখে না। স্ট্রিম এক্সট্রাকশন অপারেটর >> এর পরবর্তী কলটিতে, অন্তর্নিহিত যন্ত্রপাতি দ্রুত দেখতে পাবে যে eofbitইতিমধ্যে সেট করা আছে। এটি দ্রুত সেটিংসে ফলাফল করে failbit।
কোডের প্রথম অংশটি কেন সর্বদা সঠিকভাবে কাজ করতে ব্যর্থ হয়?
কারণ আপনি লুপের শর্ত হিসাবে ইওএফের জন্য যাচাই করা উচিত নয়। লুপের শর্তটি আপনাকে কী করতে চেষ্টা করছে তা প্রকাশ করা উচিত, যা (উদাহরণস্বরূপ), একটি স্ট্রিম থেকে সংখ্যা বের করা।