Tôi giả sử mọi người ở đây đều quen thuộc với câu ngạn ngữ rằng tất cả các tệp văn bản nên kết thúc bằng một dòng mới. Tôi đã biết đến "quy tắc" này trong nhiều năm nhưng tôi luôn tự hỏi - tại sao?
Tôi giả sử mọi người ở đây đều quen thuộc với câu ngạn ngữ rằng tất cả các tệp văn bản nên kết thúc bằng một dòng mới. Tôi đã biết đến "quy tắc" này trong nhiều năm nhưng tôi luôn tự hỏi - tại sao?
Câu trả lời:
Bởi vì đó là cách tiêu chuẩn POSIX định nghĩa một dòng :
- Đường 3.206
- Một chuỗi gồm 0 hoặc nhiều ký tự không phải <dòng mới> cộng với ký tự <dòng mới> kết thúc.
Do đó, các dòng không kết thúc bằng một ký tự dòng mới không được coi là các dòng thực tế. Đó là lý do tại sao một số chương trình gặp sự cố khi xử lý dòng cuối cùng của tệp nếu dòng đó không bị chấm dứt.
Có ít nhất một lợi thế cho hướng dẫn này khi làm việc trên trình giả lập thiết bị đầu cuối: Tất cả các công cụ Unix đều mong đợi quy ước này và hoạt động với nó. Chẳng hạn, khi nối các tệp với cat
, một tệp bị chấm dứt bởi dòng mới sẽ có hiệu ứng khác với tệp không có:
$ more a.txt
foo
$ more b.txt
bar$ more c.txt
baz
$ cat {a,b,c}.txt
foo
barbaz
Và, như ví dụ trước cũng chứng minh, khi hiển thị tệp trên dòng lệnh (ví dụ: thông qua more
), tệp kết thúc dòng mới sẽ hiển thị chính xác. Một tập tin kết thúc không đúng có thể bị cắt xén (dòng thứ hai).
Để thống nhất, rất hữu ích khi tuân theo quy tắc này - làm khác đi sẽ phát sinh thêm công việc khi xử lý các công cụ Unix mặc định.
Hãy suy nghĩ về nó một cách khác biệt: Nếu các dòng không bị chấm dứt bởi dòng mới, việc tạo các lệnh như cat
hữu ích sẽ khó hơn nhiều: làm thế nào để bạn thực hiện một lệnh để ghép các tệp sao cho
b.txt
và c.txt
?Tất nhiên điều này có thể giải quyết được nhưng bạn cần sử dụng cat
phức tạp hơn (bằng cách thêm các đối số dòng lệnh vị trí, ví dụ cat a.txt --no-newline b.txt c.txt
), và bây giờ lệnh thay vì mỗi tệp riêng lẻ kiểm soát cách dán cùng với các tệp khác. Điều này gần như chắc chắn không thuận tiện.
Bạn có thể cần phải giới thiệu một ký tự đặc biệt để đánh dấu một dòng được cho là tiếp tục thay vì chấm dứt. Chà, bây giờ bạn đang bị mắc kẹt với tình huống tương tự như trên POSIX, ngoại trừ đảo ngược (tiếp tục dòng thay vì ký tự kết thúc dòng).
Bây giờ, trên các hệ thống không tuân thủ POSIX (ngày nay hầu hết là Windows), vấn đề chính là: các tệp thường không kết thúc bằng một dòng mới và định nghĩa (không chính thức) của một dòng có thể là văn bản được phân tách bởi dòng mới. (lưu ý nhấn mạnh). Điều này là hoàn toàn hợp lệ. Tuy nhiên, đối với dữ liệu có cấu trúc (ví dụ mã lập trình), nó làm cho việc phân tích cú pháp phức tạp hơn một chút: nó thường có nghĩa là các trình phân tích cú pháp phải được viết lại. Nếu một trình phân tích cú pháp ban đầu được viết với định nghĩa POSIX, thì việc sửa đổi luồng mã thông báo sẽ dễ dàng hơn so với trình phân tích cú pháp - nói cách khác, hãy thêm mã thông báo nhân tạo mới vào dòng đầu vào một đầu vào.
cat
theo cách vừa hữu ích vừa nhất quán.
Mỗi dòng nên được chấm dứt trong một ký tự dòng mới, bao gồm cả dòng cuối cùng. Một số chương trình có vấn đề khi xử lý dòng cuối cùng của tệp nếu không phải là dòng mới bị chấm dứt.
GCC cảnh báo về điều đó không phải vì nó không thể xử lý tệp mà vì nó phải là một phần của tiêu chuẩn.
Tiêu chuẩn ngôn ngữ C cho biết Một tệp nguồn không trống sẽ kết thúc bằng một ký tự dòng mới, không được đặt ngay trước ký tự dấu gạch chéo ngược.
Vì đây là mệnh đề "sẽ", chúng tôi phải phát ra một thông báo chẩn đoán vi phạm quy tắc này.
Đây là trong mục 2.1.1.2 của tiêu chuẩn ANSI C 1989. Mục 5.1.1.2 của tiêu chuẩn ISO C 1999 (và có lẽ cũng là tiêu chuẩn ISO C 1990).
Tham khảo: Kho lưu trữ thư GCC / GNU .
wc -l
sẽ không đếm dòng cuối cùng của tệp nếu nó không phải là dòng mới bị chấm dứt. Ngoài ra, cat
sẽ nối dòng cuối cùng của tệp với dòng đầu tiên của tệp tiếp theo thành một nếu dòng cuối cùng của tệp đầu tiên không phải là dòng mới kết thúc. Hầu như bất kỳ chương trình nào đang tìm kiếm các dòng mới như một dấu phân cách đều có khả năng làm hỏng điều này.
wc
đã được đề cập ....
cat
và wc
?
Câu trả lời này là một nỗ lực tại một câu trả lời kỹ thuật hơn là ý kiến.
Nếu chúng tôi muốn trở thành người theo chủ nghĩa POSIX, chúng tôi xác định một dòng là:
Một chuỗi gồm 0 hoặc nhiều ký tự không phải <dòng mới> cộng với ký tự <dòng mới> kết thúc.
Nguồn: https://pub.opengroup.org/onlinepub/9699919799/basingefs/V1_chap03.html#tag_03_206
Một dòng không đầy đủ như:
Một chuỗi gồm một hoặc nhiều ký tự không phải <dòng mới> ở cuối tệp.
Nguồn: https://pub.opengroup.org/onlinepub/9699919799/basingefs/V1_chap03.html#tag_03_195
Một tệp văn bản như:
Một tệp chứa các ký tự được tổ chức thành không hoặc nhiều dòng. Các dòng không chứa các ký tự NUL và không có ký tự nào có thể vượt quá độ dài {LINE_MAX}, bao gồm cả ký tự <newline>. Mặc dù POSIX.1-2008 không phân biệt giữa tệp văn bản và tệp nhị phân (xem tiêu chuẩn ISO C), nhiều tiện ích chỉ tạo ra đầu ra có thể dự đoán hoặc có ý nghĩa khi hoạt động trên tệp văn bản. Các tiện ích tiêu chuẩn có các hạn chế như vậy luôn chỉ định "tệp văn bản" trong phần STDIN hoặc INPUT PHIM.
Nguồn: https://pub.opengroup.org/onlinepub/9699919799/basingefs/V1_chap03.html#tag_03_397
Một chuỗi như:
Một chuỗi các byte liền kề được kết thúc bởi và bao gồm byte null đầu tiên.
Nguồn: https://pub.opengroup.org/onlinepub/9699919799/basingefs/V1_chap03.html#tag_03_394
Từ đó, chúng ta có thể rút ra rằng lần duy nhất chúng ta có khả năng gặp phải bất kỳ loại sự cố nào là nếu chúng ta xử lý khái niệm về một dòng của tệp hoặc tệp dưới dạng tệp văn bản (vì tệp văn bản là một tổ chức bằng không hoặc nhiều dòng hơn và một dòng chúng tôi biết phải chấm dứt bằng <dòng mới>).
Trường hợp tại điểm : wc -l filename
.
Từ wc
hướng dẫn của chúng tôi, chúng tôi đọc:
Một dòng được định nghĩa là một chuỗi các ký tự được phân tách bằng ký tự <newline>.
Ý nghĩa của các tệp JavaScript, HTML và CSS là chúng là các tệp văn bản là gì?
Trong các trình duyệt, IDE hiện đại và các ứng dụng ngoại vi khác, không có vấn đề gì khi bỏ qua EOL tại EOF. Các ứng dụng sẽ phân tích các tập tin đúng cách. Do đó, không phải tất cả các Hệ điều hành đều tuân thủ tiêu chuẩn POSIX, do đó, sẽ không thực tế đối với các công cụ không phải hệ điều hành (ví dụ: trình duyệt) để xử lý các tệp theo tiêu chuẩn POSIX (hoặc bất kỳ tiêu chuẩn cấp hệ điều hành nào).
Do đó, chúng ta có thể tương đối tin tưởng rằng EOL ở EOF sẽ hầu như không có tác động tiêu cực ở cấp ứng dụng - bất kể nó có chạy trên HĐH UNIX hay không.
Tại thời điểm này, chúng tôi có thể tự tin nói rằng bỏ qua EOL tại EOF là an toàn khi giao dịch với JS, HTML, CSS ở phía máy khách. Trên thực tế, chúng tôi có thể tuyên bố rằng việc thu nhỏ bất kỳ một trong các tệp này, không chứa <newline> là an toàn.
Chúng ta có thể tiến thêm một bước này và nói rằng theo như NodeJS có liên quan thì nó cũng không thể tuân thủ tiêu chuẩn POSIX vì nó có thể chạy trong môi trường không tuân thủ POSIX.
Chúng ta còn lại gì sau đó? Công cụ cấp hệ thống.
Điều này có nghĩa là các vấn đề duy nhất có thể phát sinh là với các công cụ nỗ lực tuân thủ chức năng của chúng theo ngữ nghĩa của POSIX (ví dụ: định nghĩa của một dòng như trong hình wc
).
Mặc dù vậy, không phải tất cả các shell sẽ tự động tuân thủ POSIX. Bash chẳng hạn không mặc định cho hành vi POSIX. Có một công tắc để kích hoạt nó : POSIXLY_CORRECT
.
Thực phẩm cho suy nghĩ về giá trị của EOL là <newline>: https://www.rfc-editor.org/old/EOLstory.txt
Tiếp tục theo dõi công cụ, cho tất cả các ý định và mục đích thực tế, hãy xem xét điều này:
Hãy làm việc với một tệp không có EOL. Khi viết, tệp trong ví dụ này là một JavaScript được rút gọn không có EOL.
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o x.js
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o y.js
$ cat x.js y.js > z.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 x.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 y.js
-rw-r--r-- 1 milanadamovsky 15810 Aug 14 23:18 z.js
Lưu ý cat
kích thước tập tin chính xác là tổng của các phần riêng lẻ của nó. Nếu việc ghép các tệp JavaScript là mối quan tâm đối với các tệp JS, thì mối quan tâm thích hợp hơn sẽ là bắt đầu mỗi tệp JavaScript bằng dấu chấm phẩy.
Như một người khác đã đề cập trong chủ đề này: nếu bạn muốn cat
hai tệp có đầu ra chỉ là một dòng thay vì hai thì sao? Nói cách khác, cat
làm những gì nó phải làm.
Các man
các cat
chỉ đề cập đến việc đọc đầu vào lên đến EOF, không <xuống dòng>. Lưu ý rằng công -n
tắc của cat
cũng sẽ in ra một dòng kết thúc không phải là <newline> (hoặc dòng không đầy đủ ) dưới dạng một dòng - vì số đếm bắt đầu từ 1 (theo man
.)
-n Đánh số các dòng đầu ra, bắt đầu từ 1.
Bây giờ chúng tôi hiểu cách POSIX định nghĩa một dòng , hành vi này trở nên mơ hồ hoặc thực sự không tuân thủ.
Hiểu mục đích và sự tuân thủ của một công cụ nhất định sẽ giúp xác định mức độ quan trọng của việc kết thúc các tệp bằng EOL. Trong C, C ++, Java (JAR), v.v ... một số tiêu chuẩn sẽ đưa ra một dòng mới về tính hợp lệ - không có tiêu chuẩn nào như vậy tồn tại đối với JS, HTML, CSS.
Ví dụ: thay vì sử dụng wc -l filename
một cách có thể làm awk '{x++}END{ print x}' filename
và hãy yên tâm rằng thành công của nhiệm vụ không bị nguy hiểm bởi một tệp mà chúng tôi có thể muốn xử lý mà chúng tôi đã không viết (ví dụ: thư viện bên thứ ba như JS đã rút gọn chúng tôi curl
d) - trừ khi chúng tôi ý định thực sự là đếm các dòng theo nghĩa tuân thủ POSIX.
Phần kết luận
Sẽ có rất ít trường hợp sử dụng thực tế trong đó bỏ qua EOL tại EOF đối với các tệp văn bản nhất định như JS, HTML và CSS sẽ có tác động tiêu cực - nếu có. Nếu chúng tôi dựa vào <newline>, chúng tôi sẽ hạn chế độ tin cậy của công cụ của chúng tôi đối với các tệp mà chúng tôi tạo ra và tự mở ra các lỗi tiềm ẩn do các tệp của bên thứ ba giới thiệu.
Đạo đức của câu chuyện: Kỹ sư công cụ không có điểm yếu là dựa vào EOL tại EOF.
Vui lòng gửi các trường hợp sử dụng khi chúng áp dụng cho JS, HTML và CSS nơi chúng tôi có thể kiểm tra việc bỏ qua EOL có ảnh hưởng xấu như thế nào.
Nó có thể liên quan đến sự khác biệt giữa :
Nếu mỗi dòng kết thúc ở một dòng cuối, thì điều này sẽ tránh, ví dụ, việc nối hai tệp văn bản sẽ làm cho dòng cuối cùng của dòng đầu tiên chạy vào dòng đầu tiên của dòng thứ hai.
Ngoài ra, một biên tập viên có thể kiểm tra tải xem tệp có kết thúc ở cuối dòng hay không, lưu nó trong tùy chọn cục bộ 'eol' và sử dụng tệp đó khi ghi tệp.
Vài năm trước (2005), nhiều biên tập viên (ZDE, Eclipse, Scite, ...) đã "quên" EOL cuối cùng, vốn không được đánh giá cao .
Không chỉ vậy, nhưng họ giải thích rằng EOL cuối cùng không chính xác, như 'bắt đầu một dòng mới', và thực sự bắt đầu hiển thị một dòng khác như thể nó đã tồn tại.
Điều này rất dễ thấy với tệp văn bản 'phù hợp' với trình soạn thảo văn bản hoạt động tốt như vim, so với mở tệp trong một trong các trình soạn thảo ở trên. Nó hiển thị một dòng phụ bên dưới dòng cuối cùng thực sự của tập tin. Bạn thấy một cái gì đó như thế này:
1 first line
2 middle line
3 last line
4
Một số công cụ mong đợi điều này. Ví dụ, wc
mong đợi điều này:
$ echo -n "Line not ending in a new line" | wc -l
0
$ echo "Line ending with a new line" | wc -l
1
wc
không mong đợi điều này, cũng như nó chỉ hoạt động theo định nghĩa POSIX của một "dòng" trái ngược với sự hiểu biết trực quan của hầu hết mọi người về "dòng".
wc -l
in 1
trong cả hai trường hợp, nhưng một số người có thể nói trường hợp thứ hai nên in 2
.
\n
kết thúc dòng, thay vì phân tách dòng, như POSIX / UNIX, thì mong đợi trường hợp thứ hai để in 2 là hoàn toàn điên rồ.
Về cơ bản, có nhiều chương trình sẽ không xử lý tệp chính xác nếu chúng không nhận được EOL EOF cuối cùng.
GCC cảnh báo bạn về điều này bởi vì nó được dự kiến là một phần của tiêu chuẩn C. (phần 5.1.1.2 rõ ràng)
Điều này bắt nguồn từ những ngày đầu khi các thiết bị đầu cuối đơn giản được sử dụng. Char dòng mới được sử dụng để kích hoạt 'tuôn ra' dữ liệu được truyền.
Ngày nay, char dòng mới không cần thiết nữa. Chắc chắn, nhiều ứng dụng vẫn có vấn đề nếu dòng mới không có, nhưng tôi cho rằng đó là một lỗi trong các ứng dụng đó.
Tuy nhiên, nếu bạn có định dạng tệp văn bản nơi bạn yêu cầu dòng mới, bạn sẽ nhận được xác minh dữ liệu đơn giản rất rẻ: nếu tệp kết thúc bằng một dòng không có dòng mới ở cuối, bạn biết rằng tệp bị hỏng. Chỉ với một byte bổ sung cho mỗi dòng, bạn có thể phát hiện các tệp bị hỏng với độ chính xác cao và gần như không có thời gian CPU.
Một trường hợp sử dụng riêng: khi tệp văn bản của bạn được kiểm soát phiên bản (trong trường hợp này cụ thể theo git mặc dù nó cũng áp dụng cho những người khác). Nếu nội dung được thêm vào cuối tệp, thì dòng trước đó là dòng cuối cùng sẽ được chỉnh sửa để bao gồm một ký tự dòng mới. Điều này có nghĩa là blame
ing tệp để tìm ra khi dòng đó được chỉnh sửa lần cuối sẽ hiển thị bổ sung văn bản, không phải là cam kết trước đó mà bạn thực sự muốn xem.
\n
). Vấn đề được giải quyết.
Ngoài những lý do thực tế trên, tôi sẽ không ngạc nhiên nếu những người khởi tạo Unix (Thompson, Ritchie và cộng sự) hoặc những người tiền nhiệm Multics của họ nhận ra rằng có một lý do lý thuyết để sử dụng các đầu cuối dòng thay vì phân tách dòng: Với dòng terminator, bạn có thể mã hóa tất cả các tập tin có thể có của dòng. Với các dấu phân cách dòng, không có sự khác biệt giữa một tệp có các dòng 0 và một tệp chứa một dòng trống duy nhất; cả hai đều được mã hóa dưới dạng tệp chứa ký tự không.
Vì vậy, lý do là:
wc -l
sẽ không tính một "dòng" cuối cùng nếu nó không kết thúc bằng một dòng mới.cat
chỉ hoạt động và nó hoạt động mà không có biến chứng. Nó chỉ sao chép các byte của mỗi tệp mà không cần phải giải thích. Tôi không nghĩ có một DOS tương đương cat
. Sử dụng copy a+b c
sẽ kết thúc hợp nhất dòng cuối cùng của tệp a
với dòng đầu tiên của tệp b
.Tôi đã tự hỏi điều này trong nhiều năm. Nhưng tôi đã đi qua một lý do tốt ngày hôm nay.
Hãy tưởng tượng một tệp có bản ghi trên mỗi dòng (ví dụ: tệp CSV). Và máy tính đã viết hồ sơ ở cuối tập tin. Nhưng nó bất ngờ bị rơi. Gee là dòng cuối cùng hoàn thành? (không phải là một tình huống tốt đẹp)
Nhưng nếu chúng ta luôn chấm dứt dòng cuối cùng, thì chúng ta sẽ biết (chỉ cần kiểm tra xem dòng cuối cùng có bị chấm dứt không). Nếu không, chúng tôi có thể phải loại bỏ dòng cuối cùng mỗi lần, để được an toàn.
Có lẽ chỉ đơn giản là một số mã phân tích dự kiến nó sẽ ở đó.
Tôi không chắc chắn tôi sẽ coi đó là một "quy tắc", và nó chắc chắn không phải là thứ tôi tuân thủ một cách tôn giáo. Hầu hết các mã hợp lý sẽ biết cách phân tích văn bản (bao gồm mã hóa) theo từng dòng (bất kỳ lựa chọn kết thúc dòng nào), có hoặc không có dòng mới trên dòng cuối cùng.
Thật vậy - nếu bạn kết thúc bằng một dòng mới: liệu (về lý thuyết) có một dòng cuối cùng trống giữa EOL và EOF không? Một người suy ngẫm ...
Cuối cùng cũng có một vấn đề lập trình thực tế với các tệp thiếu dòng mới: read
Bash tích hợp (Tôi không biết về các read
triển khai khác ) không hoạt động như mong đợi:
printf $'foo\nbar' | while read line
do
echo $line
done
Bản in này thôifoo
! Lý do là khi read
gặp dòng cuối cùng, nó ghi nội dung vào $line
nhưng trả về mã thoát 1 vì nó đạt EOF. Điều này phá vỡ while
vòng lặp, vì vậy chúng tôi không bao giờ đạt được echo $line
một phần. Nếu bạn muốn xử lý tình huống này, bạn phải làm như sau:
while read line || [ -n "${line-}" ]
do
echo $line
done < <(printf $'foo\nbar')
Đó là, làm echo
nếu read
thất bại vì một dòng không trống ở cuối tập tin. Đương nhiên, trong trường hợp này sẽ có thêm một dòng mới trong đầu ra không có trong đầu vào.
Tại sao các tệp (văn bản) nên kết thúc bằng một dòng mới?
Cũng được thể hiện bởi nhiều người, bởi vì:
Nhiều chương trình không hoạt động tốt, hoặc thất bại mà không có nó.
Ngay cả các chương trình xử lý tốt tệp không có kết thúc '\n'
, chức năng của công cụ có thể không đáp ứng mong đợi của người dùng - điều này có thể không rõ ràng trong trường hợp góc này.
Các chương trình hiếm khi không cho phép cuối cùng '\n'
(tôi không biết về bất kỳ).
Tuy nhiên, điều này đặt ra câu hỏi tiếp theo:
Mã nên làm gì về các tệp văn bản mà không có dòng mới?
Quan trọng nhất - Không viết mã giả sử tệp văn bản kết thúc bằng một dòng mới . Giả sử một tệp phù hợp với định dạng dẫn đến hỏng dữ liệu, tấn công và tấn công của hacker. Thí dụ:
// Bad code
while (fgets(buf, sizeof buf, instream)) {
// What happens if there is no \n, buf[] is truncated leading to who knows what
buf[strlen(buf) - 1] = '\0'; // attempt to rid trailing \n
...
}
Nếu dấu vết cuối cùng '\n'
là cần thiết, cảnh báo người dùng về sự vắng mặt của nó và hành động được thực hiện. IOWs, xác nhận định dạng của tập tin. Lưu ý: Điều này có thể bao gồm giới hạn về độ dài dòng tối đa, mã hóa ký tự, v.v.
Xác định rõ ràng, tài liệu, xử lý mã của một trận chung kết bị thiếu '\n'
.
Đừng, càng tốt, tạo một tập tin thiếu kết thúc '\n'
.
Ở đây rất muộn nhưng tôi chỉ gặp phải một lỗi trong quá trình xử lý tệp và điều đó xảy ra do các tệp không kết thúc với dòng mới trống. Chúng tôi đã xử lý các tệp văn bản với sed
và sed
đã bỏ qua dòng cuối cùng từ đầu ra, điều này gây ra cấu trúc json không hợp lệ và khiến phần còn lại của quá trình bị lỗi.
Tất cả những gì chúng tôi đã làm là:
Có một tệp mẫu cho biết: foo.txt
với một số json
nội dung bên trong nó.
[{
someProp: value
},
{
someProp: value
}] <-- No newline here
Tệp được tạo trong các góa phụ máy và các kịch bản cửa sổ đang xử lý tệp đó bằng các lệnh PowerShell. Tất cả đều tốt.
Khi chúng tôi xử lý cùng một tệp bằng sed
lệnhsed 's|value|newValue|g' foo.txt > foo.txt.tmp
Các tập tin mới được tạo là
[{
someProp: value
},
{
someProp: value
và bùng nổ, nó đã thất bại trong các quy trình còn lại vì JSON không hợp lệ.
Vì vậy, nó luôn luôn là một thực hành tốt để kết thúc tệp của bạn với dòng mới trống.
Tôi luôn có ấn tượng rằng quy tắc xuất phát từ những ngày khi phân tích một tệp mà không có dòng mới kết thúc là khó khăn. Đó là, bạn sẽ kết thúc việc viết mã trong đó một dòng cuối được xác định bởi ký tự EOL hoặc EOF. Nó chỉ đơn giản hơn khi giả sử một dòng kết thúc bằng EOL.
Tuy nhiên tôi tin rằng quy tắc này bắt nguồn từ trình biên dịch C yêu cầu dòng mới. Và như đã chỉ ra trên mạng Không có dòng mới nào ở cuối tập tin cảnh báo trình biên dịch , #include sẽ không thêm dòng mới.
Hãy tưởng tượng rằng tệp đang được xử lý trong khi tệp vẫn đang được tạo bởi một quy trình khác.
Nó có thể phải làm gì với điều đó? Một cờ cho biết rằng tệp đã sẵn sàng để được xử lý.
Cá nhân tôi thích các dòng mới ở cuối các tệp mã nguồn.
Nó có thể có nguồn gốc với Linux hoặc tất cả các hệ thống UNIX cho vấn đề đó. Tôi nhớ có lỗi biên dịch (gcc nếu tôi không nhầm) vì các tệp mã nguồn không kết thúc bằng một dòng mới trống. Tại sao nó lại được làm theo cách này để người ta tự hỏi.
IMHO, đó là vấn đề về phong cách và quan điểm cá nhân.
Vào thời xa xưa, tôi đã không đặt dòng mới đó. Một ký tự được lưu có nghĩa là tốc độ cao hơn thông qua modem 14,4K đó.
Sau đó, tôi đặt dòng mới đó để dễ dàng chọn dòng cuối cùng bằng cách sử dụng shift + downarrow.