Bạn sẽ chỉ nhận được một EOF
từ dòng khi kết thúc tập tin được đạt tới, không cuối dòng. Cách bạn báo hiệu phần cuối của tệp phụ thuộc vào cài đặt hệ điều hành và thiết bị đầu cuối của bạn.
Nó thường CTRLd trên hệ thống UNIX-type và CTRLz trên Windows. Đối với UNIX ở chế độ nấu chín (chế độ nhập thông thường), bạn thường sẽ phải nhập nó làm ký tự đầu tiên của một dòng và làm theo nó bằng một dòng mới (ENTER).
Với Windows, CTRLz có thể được nhập bất cứ nơi nào trên dòng, nhưng vẫn cần phải được theo sau bởi một dòng mới.
Trong UNIX, ký tự thực tế để thông báo cho giao diện đầu cuối mà bạn muốn gửi EOF
có thể được đặt bằng lệnh stty
. Nếu bạn thực hiện stty -a
, bạn sẽ thấy một cái gì đó như:
speed 38400 baud; rows 45; columns 150; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke
Bạn có thể nhìn thấy ở cuối dòng thứ hai mà eof
được thiết lập để ^D
(CTRLd). Bạn có thể thay đổi điều này với:
stty eof ^x
để đặt nó vào CTRLx, ví dụ. Bạn cũng có thể đặt một số lượng lớn các thứ khác, hầu hết trong số đó sẽ làm cho thiết bị đầu cuối hiện tại của bạn không sử dụng được, vì vậy hãy cẩn thận :-)
Tóm lại, nếu bạn muốn báo hiệu chương trình của mình là xong, hãy sử dụng CTRLd cho UNIX (hoặc kiểm tra stty
nếu điều đó không hoạt động) hoặc CTRLz cho Windows. Nếu bạn muốn chỉ nhận được một dòng của đầu vào, sử dụng ký tự \n
trong mã của bạn như sau:
#include <stdio.h>
int main (void) {
long nc = 0;
while(getchar() != '\n')
++nc;
printf("%ld\n", nc);
return 0;
}
Tôi thực sự đang sử dụng Windows và Ctrl + Z là chính xác. Cảm ơn, tôi không bao giờ mới. –
nó ** là ** ctrl + z –