ฉันเพิ่งอ่านคำตอบของ "การลบอักขระบรรทัดใหม่ที่ท้ายไฟล์" และทุกคนบอกว่าจะลบอักขระตัวสุดท้าย คำถามของฉันคือตัวละครสุดท้ายไม่ใช่ตัวละครสุดท้ายใช่ไหม
ฉันเพิ่งอ่านคำตอบของ "การลบอักขระบรรทัดใหม่ที่ท้ายไฟล์" และทุกคนบอกว่าจะลบอักขระตัวสุดท้าย คำถามของฉันคือตัวละครสุดท้ายไม่ใช่ตัวละครสุดท้ายใช่ไหม
คำตอบ:
ไฟล์ไม่ได้ลงท้ายด้วยอักขระ End of File เนื่องจากคำตอบก่อนหน้านี้ระบุไว้อย่างถูกต้อง แต่ฉันคิดว่าคำตอบและความคิดเห็นมีความไม่ถูกต้องบางอย่างที่ชี้ให้เห็น:
ชุดอักขระ ASCII ไม่มีอักขระ EOF ที่แน่นอน มีอักขระควบคุม "สิ้นสุด" หลายตัว: สิ้นสุดข้อความ (3), สิ้นสุดการส่ง (4), สิ้นสุดการส่งบล็อก (23), สิ้นสุดกลาง (25) ตัวแยกไฟล์ (28) อาจใกล้เคียงกับอักขระ EOF มากที่สุด รหัส 26 คือ "ทดแทน" ไม่ใช่ EOF
Ctrl- Dเชื่อมโยงกับอินพุตเทอร์มินัลเท่านั้น ยกตัวอย่างเช่นคำสั่ง
cat filea fileb filec > outfile
ไม่เกี่ยวข้องกับ-Ctrl Dโดยวิธีการที่คุณสามารถเปลี่ยนตัวอักษร EOF terminal เพื่อสิ่งอื่นมากกว่าCtrl- Dการใช้stty
คำสั่ง
การพูดอย่างเคร่งครัดCtrl- D(หรือสิ่งที่คุณเปลี่ยนไป) ไม่ใช่รหัสคีย์ EOF สิ่งที่ทำให้การread
เรียกระบบกลับด้วยอินพุตที่มีอยู่เช่นเดียวกับการกดส่งคืนทำให้การเรียกระบบการอ่านส่งคืนบรรทัดของอักขระไปยังผู้โทร โดยการประชุมค่าส่งกลับเป็นศูนย์จากการเรียกระบบการอ่าน (เช่นการอ่านตัวอักษรศูนย์) สัญญาณสิ้นสุดของสภาพไฟล์ อย่างไรก็ตามไฟล์อินพุตจะไม่ปิดโดยอัตโนมัติและหากอินพุตมาจากเทอร์มินัลจะไม่ถูกทำให้อยู่ในสถานะ "สิ้นสุดไฟล์" คุณสามารถเขียนโปรแกรมที่อ่านต่อจากเทอร์มินัลแม้หลังจาก "สิ้นสุดไฟล์" และการเรียกเพื่ออ่านสามารถส่งคืนค่าที่ไม่ใช่ศูนย์สำหรับบรรทัดอินพุตถัดไป
การเปรียบเทียบระหว่างตัวอักษร eof และ eol สามารถดูได้ว่าCtrl- Dถูกกดหรือไม่เมื่ออินพุตบางส่วนถูกเขียนบนบรรทัดแล้ว ตัวอย่างเช่นถ้าคุณเขียน "abc" และกดCtrl- Dการเรียก read จะส่งคืนเวลานี้ด้วยค่าส่งคืน 3 และเก็บ "abc" ไว้ในบัฟเฟอร์ที่ส่งผ่านเป็นอาร์กิวเมนต์ เนื่องจากการอ่านไม่ส่งคืน 0 นี่จึงไม่ถูกตีความว่าเป็นเงื่อนไข EOF ตามแบบแผนด้านบน ในทำนองเดียวกันการกดปุ่มย้อนกลับเพื่อทำให้การโทรกลับอ่านด้วยสายอินพุตทั้งหมด (รวมถึงบรรทัดใหม่) คุณสามารถทดลองนี้ด้วยcat
คำสั่ง: เขียนตัวอักษรบางอย่างเกี่ยวกับเส้นและการกด-Ctrl Dคุณจะเห็นตัวละครดังก้องกลับมาหาคุณและcat
รอการป้อนข้อมูลเพิ่มเติม
ทั้งหมดข้างต้นใช้เฉพาะเมื่อเทอร์มินัลอยู่ในโหมด "สุก" ซึ่งตรงข้ามกับโหมด "ดิบ" ซึ่งการประมวลผลอินพุตบรรทัดจะถูกย่อให้เล็กสุด ในโหมด raw อักขระ Ctrl-D จะถูกส่งไปยังบัฟเฟอร์อินพุตจริง ๆ
อักขระควบคุม ASCII มีคำจำกัดความจากปี 1960 (จริง ๆ แล้วนำหน้าสิ่งที่คุณอาจพิจารณาถึงเครือข่าย ) ไม่ใช่ว่าจะมีการใช้อักขระควบคุมทั้งหมดตามวิธีที่กำหนดไว้สำหรับอุปกรณ์โทรคมนาคมในตอนนั้น
บนระบบที่เหมือน Unix ไม่จำเป็นต้องมีEOF
ตัวอักษร ไม่มีการใช้ ระบบสามารถบอกแอปพลิเคชันว่ามีกี่ไบต์ในไฟล์:
ในบางระบบอื่น ๆ (เห็นใน VMS, DOS, Windows) ตัวควบคุม -Z อาจทำหน้าที่เป็นตัวสิ้นสุดไฟล์เพราะในรุ่นเก่าระบบไม่สามารถบอกบางแอปพลิเคชันได้ว่ามีกี่ไบต์ในไฟล์
ในกรณีของ VMS ข้อ จำกัด เกิดจากการทำงานของ C runtime แอปพลิเคชันภาษาแอสเซมบลี (และสามารถทำได้) รับขนาดไฟล์ที่ถูกต้อง
ระบบ Unix ในเชลล์ใช้ control-D เพื่อบอกแอ็พพลิเคชันว่าถึงจุดสิ้นสุดของอินพุต (ไฟล์) แล้ว แต่ control-D ไม่ได้เก็บไว้ในไฟล์
ใน C EOF
ถูกสร้างขึ้นโดยมีจุดประสงค์-1
เพื่อระบุว่าไม่ใช่อักขระที่ถูกต้อง I / O มาตรฐานจะส่งกลับEOF
เมื่อตรวจพบเงื่อนไขการสิ้นสุดไฟล์ - ไม่ใช่อักขระพิเศษ
อย่างไรก็ตามไฟล์ไม่จำเป็นต้องลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ (ASCII line-feed) เครื่องมือแก้ไขข้อความสามารถรับมือกับไฟล์ที่เป็นข้อความที่พิมพ์ได้ทั้งหมด แต่ไม่มีบรรทัดใหม่ต่อท้าย
busybox
's vi
เป็นต้น)
EOF ไม่ใช่ตัวละคร มันเป็นสถานะที่บ่งบอกว่าไม่มีตัวละครที่จะอ่านจากกระแสไฟล์ เมื่อคุณป้อนคำสั่ง EOF จากเทอร์มินัลคุณกำลังส่งสัญญาณระบบปฏิบัติการเพื่อปิดอินพุตสตรีมไม่ใส่อักขระพิเศษ
bash
จะถึงมือของมันกับอินพุตมันจะถูกนวดโดยไดรเวอร์ TTY ไดรเวอร์นี้ดัก Ctrl-D และส่ง EOF ไปที่bash
(โดยที่ EOF ไม่ใช่ตัวอักษร แต่เป็นสถานะไฟล์พิเศษ)