อย่างไรก็ตามโปรแกรมเมอร์ C ++ โปรดทราบว่าสิ่งที่เกิดขึ้นเสมอคือ cin.eof () จะไม่ส่งกลับ "true" จนกระทั่งหลังจากอ่านบรรทัดสุดท้ายสองครั้ง
นั่นไม่ใช่สิ่งที่เกิดขึ้น การeofbitเล่นไม่มีบทบาทในการแปลงเป็นบูลีน ( stream::operator bool(หรือoperator void*ใน c ++ เก่ากว่า) เฉพาะbadbitและfailbitมีส่วนร่วม
สมมติว่าคุณกำลังอ่านไฟล์ที่มีตัวเลขคั่นด้วยช่องว่าง การวนซ้ำที่อยู่รอบ ๆcin.eof()นั้นอาจจะผิดหรือทำให้ifการทดสอบเต็มไปหมด คุณไม่ได้อ่านจนกระทั่ง EOF คุณกำลังอ่านตัวเลข เพื่อให้รหัสของคุณแสดงตรรกะที่:
while (stream >> some_var) {
process_value(some_var);
}
วิธีนี้จะทำงานไม่ว่าบรรทัดสุดท้ายของไฟล์จะลงท้ายด้วย0 42\nหรือเพียงแค่0 42(ไม่มีบรรทัดใหม่ที่ท้ายบรรทัดสุดท้ายในไฟล์) หากไฟล์ลงท้ายด้วย0 42\nการอ่านที่ดีครั้งสุดท้ายจะดึงค่า 42 และอ่านตัวทำเครื่องหมายบรรทัดสุดท้ายที่ โปรดทราบว่าเครื่องหมาย EOF ยังไม่ได้อ่าน ฟังก์ชั่นเรียกว่ามีprocess_value 42การเรียกครั้งต่อไปที่โอเปอเรเตอร์การดึงข้อมูล >> อ่าน EOF และเนื่องจากไม่มีการแตกไฟล์ใด ๆ ทั้งeofbitและfailbitจะถูกตั้งค่า
สมมติว่าไฟล์นั้นลงท้ายด้วย0 42(ไม่มีการขึ้นบรรทัดใหม่ที่ท้ายบรรทัดสุดท้าย) การอ่านที่ดีครั้งสุดท้ายจะดึงค่า 42 ที่ยกเลิกบนเครื่องหมาย EOF สันนิษฐานว่าคุณต้องการประมวลผลที่ 42 นี่คือสาเหตุที่eofbitไม่มีบทบาทในตัวดำเนินการแปลงบูลีนสตรีมอินพุต ในการเรียกครั้งต่อไปที่ผู้ดำเนินการดึงข้อมูล >> เครื่องจักรพื้นฐานจะเห็นว่าeofbitมีการตั้งค่าไว้แล้ว failbitนี้ได้อย่างรวดเร็วส่งผลในการตั้งค่า
ทำไมรหัสชิ้นแรกไม่สามารถทำงานได้อย่างถูกต้อง?
เพราะคุณไม่ควรตรวจสอบ EOF ว่าเป็นเงื่อนไขลูป เงื่อนไขการวนซ้ำควรแสดงสิ่งที่คุณพยายามทำซึ่งก็คือ (ตัวอย่าง) การแยกตัวเลขจากสตรีม