Tại sao nên có dòng trống ở cuối tệp nguồn?


232

Một số công cụ kiểu mã khuyến nghị điều này và tôi nhớ đã thấy một số công cụ dòng lệnh unix cảnh báo về việc thiếu dòng trống.

Lý do cho việc có thêm một dòng trống là gì?


7
Một số công cụ không hoạt động nếu tệp không kết thúc bằng một dòng mới. Điều đó khác với việc có một dòng trống ở cuối (sẽ là 2 dòng mới).
William Pursell

2
Bạn có nghĩa là dòng trống ( \n\n) hoặc dòng mới \n?
Ciro Santilli 郝海东 冠状 病 事件

13
catcác tập tin trên một vỏ và bạn sẽ biết tại sao. Nếu tệp của bạn làm cho dấu nhắc của trình bao của tôi xuất hiện ở bất kỳ nơi nào khác ngoài vị trí của nó (ở đầu dòng), tôi có thể sẽ ghét bạn. ;)
ThiefMaster

2
Đưa ra câu hỏi cũ này và đơn giản là không thể tin rằng mỗi câu trả lời đều cố gắng biện minh cho những thất bại và thiếu sót của các công cụ và hệ thống khác bằng cách nói rằng các lập trình viên hiện đại nên thêm một ký tự không có giá trị trong chính mã. Nói về 5 con khỉ trong một cái lồng! :-D
Amos M. Carpenter

1
Tốt hơn (tổng quát hơn) trả lời các tệp văn bản nói chung :: stackoverflow.com/questions/729692/ trên
Ruben Bartelink

Câu trả lời:


188

Nhiều công cụ cũ hoạt động sai nếu dòng dữ liệu cuối cùng trong tệp văn bản không bị chấm dứt với dòng kết hợp dòng mới hoặc dòng vận chuyển / kết hợp dòng mới. Thay vào đó, họ bỏ qua dòng đó vì nó được kết thúc bằng ^ Z (eof).


1
Cảm ơn câu trả lời! Bất kỳ ví dụ về các công cụ phổ biến có thể thể hiện hành vi này?
Nick Merrill

8
@NickM Hầu như tất cả các công cụ dòng lệnh POSIX / Unix nhận nhập văn bản hoặc đọc tệp văn bản đều giả sử một dòng kết thúc ( \n) ở cuối tệp. Một số trình soạn thảo văn bản, như Vim và một số trình biên dịch (đáng chú ý là C ++ và Python) sẽ đưa ra cảnh báo. (Trong trường hợp của C ++, tiêu chuẩn yêu cầu rõ ràng điều này.)
greyfade

5
Vì vậy, những gì bạn đang nói là ... đó là một giáo phái vận chuyển hàng hóa
Jaykul

Tuy nhiên, bạn có thể có văn bản trên dòng cuối cùng, câu hỏi đề cập đến một dòng trống \n\n.
jinawee

57

Nếu bạn cố gắng ghép hai tệp văn bản lại với nhau, bạn sẽ hạnh phúc hơn nhiều nếu tệp đầu tiên kết thúc bằng một ký tự dòng mới.


38

Ngoài thực tế, đó là một vị trí con trỏ đẹp hơn khi bạn di chuyển đến cuối tệp trong trình soạn thảo văn bản.

Có một dòng mới ở cuối tập tin cung cấp một kiểm tra đơn giản rằng tập tin chưa bị cắt ngắn.


221
Các tập tin có thể bị cắt ngắn và bạn thậm chí sẽ không bao giờ kn
Simon Nickerson

26

Một đối số cũng có thể được tạo cho khác biệt sạch hơn nếu bạn thêm vào tệp theo cùng lý do như Tại sao dấu phẩy được phép trong danh sách?

Sau đây được sao chép (và cắt bớt một chút) từ tài nguyên được liên kết:

Thay đổi:

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

đến:

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

chỉ liên quan đến thay đổi một dòng trong diff:

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

Điều này đánh bại sự khác biệt nhiều dòng khó hiểu hơn khi dấu phẩy bị bỏ qua:

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

Câu trả lời chỉ liên kết không được coi là có giá trị trên SO. Vui lòng sao chép thông tin liên quan ở đây trong khi duy trì ghi công.
isherwood

17

Dòng trống ở cuối tệp xuất hiện để việc đọc chuẩn từ luồng đầu vào sẽ biết khi nào chấm dứt việc đọc, thường trả về EOF để cho biết rằng bạn đã kết thúc. Phần lớn các ngôn ngữ có thể xử lý điểm đánh dấu EOF. Đó là lý do từ ngày xưa, trong DOS, điểm đánh dấu EOF là phím F6 hoặc Ctrl-Z, đối với các hệ thống * nix, đó là Ctrl-D.

Hầu hết, nếu không phải tất cả, sẽ thực sự đọc đúng đến điểm đánh dấu EOF để chức năng đọc của thư viện thời gian chạy từ đầu vào sẽ biết khi nào nên dừng đọc thêm nữa. Khi bạn mở luồng cho chế độ chắp thêm, nó sẽ xóa dấu EOF và ghi qua nó, cho đến khi đóng được gọi rõ ràng trong đó nó sẽ chèn dấu EOF tại điểm đó.

Các công cụ cũ hơn đang mong đợi một dòng trống theo sau là dấu EOF. Ngày nay, các công cụ có thể xử lý dòng trống và bỏ qua nó.


6
^ D không phải là "điểm đánh dấu EOF". Nhấn ^ D khiến lớp vỏ đóng cạnh ghi của đường ống mà nhóm quy trình tiền cảnh đang đọc từ đó, để đọc từ ống đó trả về EOF. Không có "điểm đánh dấu EOF".
William Pursell

@William Pursell Bạn nhầm lẫn * NIX và Windows. Windows / DOS kế thừa hoàn toàn sử dụng điểm đánh dấu EOF (26, 0x1a) thường được nhúng ở phần cuối của hầu hết các tệp để giữ khả năng tương thích với CP / M cổ đại (Ai đã sử dụng CP / M sau năm 1983?). "Vui" khác: \r\nthay vì \n, các cuộc gọi DOS sử dụng kết hợp ASCIIZ và ASCII $. Thậm chí tệ hơn, sau này trên Windows thường chèn một dấu thứ tự byte Unicode (BOM) vào đầu hầu hết các tệp văn bản. Đáng yêu "độc đáo."

9

Ngoài ra, khi bạn sửa đổi tệp và nối thêm một số mã ở cuối tệp - diff (ít nhất là git diff trong cấu hình tiêu chuẩn) sẽ cho thấy bạn đã thay đổi dòng cuối cùng, trong khi điều duy nhất bạn thực sự thực hiện - đã thêm ký hiệu dòng mới. Vì vậy, báo cáo cvs trở nên ít thuận tiện.


5

Một số ngôn ngữ xác định tệp đầu vào của chúng theo các dòng đầu vào, trong đó mỗi dòng đầu vào là một chuỗi các ký tự được kết thúc bằng trả về vận chuyển. Nếu ngữ pháp của chúng được xác định như vậy, thì dòng hợp lệ cuối cùng của tệp cũng phải được kết thúc bằng trả về vận chuyển.


3

Đó là do định nghĩa của tệp văn bản là gì. Khi bạn tạo một tệp văn bản mới trong bất kỳ môi trường unix nào, nội dung của tệp đó là ký tự dòng mới '\ n'

Không có điều này, tệp không thực sự được xác định là tệp văn bản. Bây giờ một khi chúng ta thêm mã vào tệp văn bản này, về việc không xóa dòng mới ban đầu này xác định chính tệp văn bản đó .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.