อย่างไรก็ตามโปรแกรมเมอร์ 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 ว่าเป็นเงื่อนไขลูป เงื่อนไขการวนซ้ำควรแสดงสิ่งที่คุณพยายามทำซึ่งก็คือ (ตัวอย่าง) การแยกตัวเลขจากสตรีม