เหตุใดจึงแนะนำให้มีบรรทัดว่างในตอนท้ายของไฟล์ต้นฉบับ


232

เครื่องมือสไตล์โค้ดบางตัวแนะนำสิ่งนี้และฉันจำได้ว่าเห็นเครื่องมือบรรทัดคำสั่ง unix บางคำเตือนเกี่ยวกับบรรทัดว่างที่ขาดหายไป

เหตุผลที่มีบรรทัดว่างพิเศษคืออะไร


7
เครื่องมือบางอย่างล้มเหลวในการทำงานหากไฟล์ไม่ได้ขึ้นบรรทัดใหม่ นั่นแตกต่างจากการมีบรรทัดว่างท้าย (ซึ่งจะเป็น 2 บรรทัดใหม่)
William Pursell

2
คุณหมายถึงบรรทัดที่ว่างเปล่า ( \n\n) หรือบรรทัดใหม่\n?
Ciro Santilli 法轮功冠状病六四事件法轮功

13
catไฟล์บนเชลล์และคุณจะรู้ว่าทำไม หากไฟล์ของคุณทำให้พรอมต์ของเชลล์ปรากฏขึ้นในตำแหน่งอื่นนอกเหนือจากที่ควรจะเป็น (ที่จุดเริ่มต้นของบรรทัด) ฉันอาจจะเกลียดคุณ ;)
ThiefMaster

2
มาข้ามคำถามเก่านี้และไม่อยากจะเชื่อเลยว่าทุกคำตอบเดียวพยายามที่จะพิสูจน์ความล้มเหลวและข้อบกพร่องของเครื่องมือและระบบอื่น ๆ โดยบอกว่าตัวแปลงสัญญาณที่ทันสมัยควรเพิ่มตัวละครที่ไม่มีคุณค่าในตัวมันเอง พูดคุยกับลิง 5 ตัวในกรง! :-D
Amos M. Carpenter

1
ดีกว่า (ทั่วไปมากขึ้น) ตอบไฟล์ข้อความทั่วไปโดยทั่วไป :: stackoverflow.com/questions/729692/…
Ruben Bartelink

คำตอบ:


188

เครื่องมือรุ่นเก่าจำนวนมากทำงานไม่ถูกต้องหากบรรทัดสุดท้ายของข้อมูลในไฟล์ข้อความไม่ได้สิ้นสุดด้วยการขึ้นบรรทัดใหม่หรือการขึ้นบรรทัดใหม่ / การขึ้นบรรทัดใหม่ พวกเขาไม่สนใจบรรทัดนั้นเนื่องจากถูกยกเลิกด้วย ^ Z (eof) แทน


1
ขอบคุณสำหรับคำตอบ! ตัวอย่างใด ๆ ของเครื่องมือยอดนิยมที่อาจแสดงพฤติกรรมนี้
Nick Merrill

8
@NickM เครื่องมือบรรทัดคำสั่ง POSIX / Unix เกือบทั้งหมดที่รับอินพุตข้อความหรืออ่านไฟล์ข้อความถือว่าเป็นบรรทัดสิ้นสุด ( \n) ที่ท้ายไฟล์ เครื่องมือแก้ไขข้อความหลายตัวเช่น Vim และคอมไพเลอร์หลายตัว (โดยเฉพาะ C ++ และ Python) จะออกคำเตือน (ในกรณีของ C ++ มาตรฐานจำเป็นต้องใช้สิ่งนี้อย่างชัดเจน)
greyfade

5
ดังนั้นสิ่งที่คุณกำลังจะบอกว่าคือ ... มันเป็นสินค้าศาสนา
Jaykul

\n\nแต่คุณอาจจะมีข้อความในบรรทัดสุดท้ายคำถามที่กล่าวถึงบรรทัดว่าง
jinawee

57

หากคุณพยายามต่อไฟล์ข้อความสองไฟล์เข้าด้วยกันคุณจะมีความสุขมากขึ้นหากไฟล์แรกลงท้ายด้วยอักขระบรรทัดใหม่


38

นอกเหนือจากข้อเท็จจริงที่ว่ามันเป็นตำแหน่งเคอร์เซอร์ที่ดีกว่าเมื่อคุณย้ายไปยังจุดสิ้นสุดของไฟล์ในโปรแกรมแก้ไขข้อความ

การขึ้นบรรทัดใหม่ที่ท้ายไฟล์จะช่วยให้ตรวจสอบได้ง่ายว่าไฟล์นั้นไม่ได้ถูกตัดทอน


221
ไฟล์นี้อาจถูกตัดทอนและคุณจะไม่มีวันยอมแพ้
Simon Nickerson

26

นอกจากนี้ยังสามารถสร้างอาร์กิวเมนต์ให้กับตัวล้างข้อมูลได้ถ้าคุณต่อท้ายไฟล์ตามเหตุผลเดียวกับที่อนุญาตให้ใช้จุลภาคต่อท้ายในรายการ

ข้อมูลต่อไปนี้ถูกคัดลอก (และตัดส่วนเล็กน้อย) จากทรัพยากรที่ลิงก์:

การเปลี่ยนแปลง:

s = [
  'manny',
  'jack',
]

ถึง:

s = [
  'manny',
  'jack',
  'roger',
]

เกี่ยวข้องกับการเปลี่ยนแปลงหนึ่งบรรทัดในส่วนต่าง:

  s = [
    'manny',
    'jack',
+   'roger',
  ]

สิ่งนี้จะทำให้เกิดความสับสนมากขึ้นในหลาย ๆ บรรทัดที่แตกต่างเมื่อคอมม่าต่อท้ายถูกละเว้น:

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]

คำตอบสำหรับลิงก์เท่านั้นไม่ถือว่ามีค่าใน SO โปรดคัดลอกข้อมูลที่เกี่ยวข้องที่นี่ในขณะที่ยังคงแสดงที่มา
isherwood

17

บรรทัดว่างในท้ายไฟล์ปรากฏขึ้นเพื่อให้การอ่านมาตรฐานจากอินพุตสตรีมจะรู้ว่าเมื่อใดที่จะยุติการอ่านโดยปกติแล้วจะส่งคืน EOF เพื่อระบุว่าคุณได้มาถึงจุดสิ้นสุดแล้ว ภาษาส่วนใหญ่สามารถรองรับ EOF marker ได้ มันมีเหตุผลตั้งแต่สมัยโบราณภายใต้ DOS ตัวทำเครื่องหมาย EOF คือคีย์ F6 หรือ Ctrl-Z สำหรับระบบ * nix นั่นคือ Ctrl-D

ส่วนใหญ่ถ้าไม่ใช่ทั้งหมดจะอ่านจริง ๆ จนถึงเครื่องหมาย EOF เพื่อให้ฟังก์ชันของไลบรารีรันไทม์ของการอ่านจากอินพุตจะทราบเมื่อหยุดหยุดอ่านเพิ่มเติม เมื่อคุณเปิดกระแสข้อมูลสำหรับโหมดผนวกมันจะล้างเครื่องหมาย EOF และเขียนผ่านมันจนกว่าการปิดจะถูกเรียกอย่างชัดเจนซึ่งจะแทรกเครื่องหมาย EOF ที่จุดนั้น

เครื่องมือรุ่นเก่าคาดว่าจะมีบรรทัดว่างตามด้วย EOF marker ทุกวันนี้เครื่องมือสามารถจัดการกับบรรทัดว่างและไม่สนใจมันได้


6
^ D ไม่ใช่ "เครื่องหมาย EOF" การกด ^ D ทำให้เชลล์ปิดด้านการเขียนของไพพ์ที่กลุ่มกระบวนการพื้นหน้าอ่านจากเพื่อให้การอ่านจากไพพ์นั้นส่งคืน EOF ไม่มี "เครื่องหมาย EOF"
William Pursell

@William Pursell คุณทำผิดพลาด * NIX และ Windows Legacy Windows / DOS ใช้เครื่องหมาย EOF (26, 0x1a) ที่ฝังอยู่ในตอนท้ายของไฟล์ส่วนใหญ่เพื่อให้เข้ากันได้กับ CP / M โบราณ (ใครเป็นผู้ใช้ CP / M หลังจากปี 1983) "สนุก" อื่น ๆ : \r\nแทนที่จะ\nเรียกใช้ DOS โดยใช้ ASCIIZ และ ASCII $ ผสมกัน ยิ่งแย่ไปกว่านั้นบน Windows มักจะใส่ Unicode byte order mark (BOM) ที่จุดเริ่มต้นของไฟล์ข้อความส่วนใหญ่ น่ารัก "เอกลักษณ์"

9

นอกจากนี้เมื่อคุณแก้ไขไฟล์และเพิ่มรหัสท้ายไฟล์ - diff (อย่างน้อย git diff ในการกำหนดมาตรฐาน) จะแสดงว่าคุณเปลี่ยนบรรทัดสุดท้ายในขณะที่สิ่งเดียวที่คุณทำจริง - เพิ่มสัญลักษณ์ขึ้นบรรทัดใหม่ ดังนั้นรายงาน CVS จึงสะดวกสบายน้อยลง


5

บางภาษากำหนดไฟล์อินพุตของพวกเขาในแง่ของบรรทัดอินพุตโดยที่แต่ละบรรทัดอินพุตคือชุดของอักขระที่ถูกยกเลิกโดย carriage return หากมีการกำหนดไวยกรณ์เหล่านั้นบรรทัดสุดท้ายที่ถูกต้องของไฟล์จะต้องถูกยกเลิกโดย carriage return


3

มันเป็นเพราะคำจำกัดความของไฟล์ข้อความ เมื่อคุณสร้างไฟล์ข้อความใหม่ในสภาพแวดล้อม unix เนื้อหาของไฟล์นั้นคืออักขระบรรทัดใหม่ '\ n'

หากไม่มีสิ่งนี้ไฟล์จะไม่ถูกระบุว่าเป็นไฟล์ข้อความจริงๆ ตอนนี้เมื่อเราเพิ่มรหัสไปยังแฟ้มข้อความนี้มันไม่ได้เกี่ยวกับการลบนี้บรรทัดใหม่เริ่มต้นที่กำหนดแฟ้มข้อความตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.