Tôi chỉ đọc câu trả lời cho "Xóa một ký tự dòng mới ở cuối tệp" và mọi người nói sẽ xóa ký tự cuối cùng. Câu hỏi của tôi là, không phải là nhân vật eof cuối cùng?
Tôi chỉ đọc câu trả lời cho "Xóa một ký tự dòng mới ở cuối tệp" và mọi người nói sẽ xóa ký tự cuối cùng. Câu hỏi của tôi là, không phải là nhân vật eof cuối cùng?
Câu trả lời:
Một tệp không kết thúc bằng ký tự Kết thúc tệp, vì các câu trả lời trước đó nêu chính xác. Nhưng tôi nghĩ rằng các câu trả lời và bình luận có chứa một số điểm không chính xác đáng để chỉ ra:
Bộ ký tự ASCII không chứa ký tự EOF chính xác. Có một số ký tự điều khiển "kết thúc": Kết thúc văn bản (3), Kết thúc truyền (4), Kết thúc khối truyền (23), Kết thúc trung bình (25). Dấu tách tệp (28) có thể đến gần nhất với ký tự EOF. Mã 26 là "Thay thế", không phải EOF.
Ctrl- Dchỉ được liên kết với đầu vào thiết bị đầu cuối. Ví dụ, lệnh
cat filea fileb filec > outfile
không liên quan Ctrl- D. Nhân tiện, bạn có thể thay đổi ký tự EOF của thiết bị đầu cuối thành một thứ khác ngoài Ctrl- Dsử dụng stty
lệnh.
Nói đúng ra, Ctrl- D(hoặc bất cứ điều gì bạn đã thay đổi) không phải là mã khóa EOF. Những gì nó làm là làm cho read
cuộc gọi hệ thống trở lại với những gì đầu vào có sẵn, giống như nhấn return làm cho cuộc gọi hệ thống đọc trả về một dòng ký tự cho người gọi. Theo quy ước, giá trị trả về bằng 0 từ lệnh gọi hệ thống đọc (tức là số 0 ký tự đọc) báo hiệu kết thúc điều kiện tệp. Tuy nhiên, tệp đầu vào không được đóng tự động và, nếu đầu vào đến từ thiết bị đầu cuối, nó không được đặt ở trạng thái "cuối tệp". Bạn có thể viết chương trình tiếp tục đọc từ thiết bị đầu cuối ngay cả sau khi "kết thúc tập tin" và cuộc gọi đọc có thể trả về giá trị khác không cho dòng đầu vào tiếp theo.
Sự tương tự giữa các ký tự eof và eol có thể được nhìn thấy nếu Ctrl- Dđược nhấn khi một số đầu vào đã được ghi trên dòng. Ví dụ: nếu bạn viết "abc" và nhấn Ctrl- Dcuộc gọi đọc trả về, lần này với giá trị trả về là 3 và với "abc" được lưu trong bộ đệm được truyền dưới dạng đối số. Vì đọc không trả về 0, nên điều này không được hiểu là điều kiện EOF theo quy ước ở trên. Tương tự, nhấn return để thực hiện trả lại cuộc gọi đã đọc với toàn bộ dòng đầu vào (bao gồm cả dòng mới). Bạn có thể thử điều này với cat
lệnh: viết một số ký tự trên dòng và nhấn Ctrl- D. Bạn sẽ thấy các nhân vật lặp lại với bạn và cat
chờ thêm đầu vào.
Tất cả những điều trên chỉ áp dụng khi thiết bị đầu cuối ở chế độ "nấu", trái ngược với chế độ "thô", trong đó xử lý đầu vào dòng được giảm thiểu. Trong chế độ thô, một ký tự Ctrl-D thực sự được gửi đến bộ đệm đầu vào.
Các ký tự điều khiển ASCII có các định nghĩa từ những năm 1960 (thực ra trước những gì bạn có thể xem là một mạng ). Không phải tất cả các ký tự điều khiển đó đều được sử dụng theo cách mà chúng được xác định cho thiết bị viễn thông hồi đó.
Trên các hệ thống giống Unix, không cần phải có EOF
ký tự; không cái nào được sử dụng Hệ thống có thể cho các ứng dụng biết có bao nhiêu byte trong một tệp:
Trên một số hệ thống khác (được thấy trong VMS, DOS, Windows), control-Z có thể hoạt động như một điểm đánh dấu cuối tệp vì trong các phiên bản cũ , hệ thống không thể cho một số ứng dụng biết có bao nhiêu byte trong tệp.
Trong trường hợp của VMS, hạn chế là do cách thức hoạt động của thời gian chạy C. Các ứng dụng ngôn ngữ hội có thể (và đã) có được kích thước tệp chính xác.
Các hệ thống Unix trong shell thường sử dụng control-D để báo cho ứng dụng biết đã kết thúc đầu vào (tệp), nhưng control-D không được lưu trong tệp.
Trong C, EOF
được thực hiện một cách có chủ đích -1
để chỉ ra rằng nó không phải là một ký tự hợp lệ. I / O tiêu chuẩn trả về EOF
khi phát hiện tình trạng cuối tập tin - không phải là ký tự đặc biệt.
Nhân tiện, các tệp không cần kết thúc bằng ký tự dòng mới (ASCII line-feed). Trình chỉnh sửa văn bản có thể đối phó với các tệp là tất cả văn bản có thể in nhưng thiếu một dòng mới.
busybox
's vi
, vv).
EOF không phải là một nhân vật. Đây là trạng thái cho biết không còn ký tự nào để đọc từ luồng tệp. Khi bạn nhập lệnh EOF từ thiết bị đầu cuối, bạn đang báo hiệu cho HĐH để đóng luồng đầu vào, không đưa vào một ký tự đặc biệt.
bash
chạm tay vào đầu vào, nó được trình điều khiển TTY mát xa. Trình điều khiển này chặn Ctrl-D và gửi EOF tới bash
(Trong đó EOF không phải là ký tự, nhưng là trạng thái tệp đặc biệt)