Ini adalah kode sumber C saya.
Ketika saya membangunnya di Ubuntu, ia mulai mendapatkan karakter tetapi saya tidak tahu bagaimana mengakhiri program, karena tidak berakhir dengan memasukkan ENTERatau carriage return.
Apa artinya EOF? Bagaimana saya bisa memicunya?
Sumber ini juga ada di buku karya Dennis Ritchie:
#include <stdio.h>
/* count digits, white space, others */
main ()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar ()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf ("digits =");
for (i = 0; i < 10; ++i)
printf (" %d", ndigit[i]);
printf (", white space = %d, other = %d\n", nwhite, nother);
}
command-line
c
stackprogramer
sumber
sumber
-1
setara dengan EOF. Ini didefinisikan/usr/include/stdio.h
sebagai konstanta makro-1
sebagai input tidak berfungsi :)Jawaban:
Tl; dr
Anda biasanya dapat "memicu EOF" dalam program yang berjalan di terminal dengan CTRL+ Dkeystroke tepat setelah input flush terakhir.
EOF berarti End-Of-File.
"Triggering EOF" dalam hal ini kira-kira berarti "membuat program sadar bahwa tidak ada lagi input yang akan dikirim".
Dalam hal ini, karena
getchar()
akan mengembalikan angka negatif jika tidak ada karakter yang dibaca, eksekusi dihentikan.Tetapi ini tidak hanya berlaku untuk program spesifik Anda, tetapi juga berlaku untuk berbagai alat.
Secara umum "memicu EOF" dapat dilakukan dengan CTRL+ Dkeystroke tepat setelah input flush terakhir (yaitu dengan mengirim input kosong).
Misalnya dengan
cat
:Apa yang terjadi di bawah kap ketika menekan CTRL+ Dadalah bahwa input yang diketik sejak flush input terakhir memerah; ketika ini merupakan input kosong yang
read()
dipanggil syscall pada pengembalian program STDIN0
,getchar()
mengembalikan angka negatif (-1
dalam pustaka GNU C) dan ini pada gilirannya ditafsirkan sebagai EOF 1 .1 - /programming//a/1516177/4316166
sumber
TL; DR : EOF bukan karakter, ini adalah makro yang digunakan untuk mengevaluasi pengembalian negatif dari fungsi membaca-input. Orang dapat menggunakan Ctrl+ Duntuk mengirim
EOT
karakter yang akan memaksa fungsi kembali-1
Setiap programmer harus RTFM
Mari kita merujuk ke "Manual Referensi CA", oleh Harbison dan Steele, edisi ke-4. dari 1995, halaman 317:
Pada dasarnya
EOF
bukan karakter, melainkan nilai integer yang diterapkanstdio.h
untuk mewakili-1
. Jadi, jawaban kos itu benar sejauh yang dikatakan, tetapi ini bukan tentang menerima input "kosong". Catatan penting adalah bahwa di sini EOF berfungsi sebagai nilai pengembalian (darigetchar()
) perbandingan, bukan untuk menandakan karakter yang sebenarnya. Theman getchar
mendukung bahwa:Pertimbangkan
while
loop - tujuan utamanya adalah mengulangi tindakan jika kondisi dalam tanda kurung benar . Lihat lagi:Itu pada dasarnya mengatakan tetap melakukan hal-hal jika
c = getchar()
mengembalikan kode yang berhasil (0
atau di atas; itu adalah hal yang umum, coba jalankan perintah yang berhasil,echo $?
kemudian gagalecho $?
dan lihat angka mereka kembali). Jadi jika kita berhasil mendapatkan karakter dan assing ke C, kode status yang dikembalikan adalah 0, gagal adalah -1.EOF
didefinisikan sebagai-1
. Karena itu ketika kondisi-1 == -1
terjadi, loop berhenti. Dan kapan itu akan terjadi? Ketika tidak ada lagi karakter yang didapat, saatc = getchar()
gagal. Anda bisa menuliswhile ((c = getchar ()) != -1)
dan itu masih akan berhasilJuga, mari kita kembali ke kode aktual, ini kutipan dari
stdio.h
Kode dan EOT ASCII
Meskipun karakter EOF bukan karakter aktual, namun, ada karakter
EOT
(End of Transmission), yang memiliki nilai desimal ASCII dari 04; itu ditautkan ke Ctrl+ Dpintasan (diwakili juga sebagai karakter meta^D
). Akhir dari karakter transmisi digunakan untuk menandakan penutupan aliran data kembali ketika komputer digunakan untuk mengontrol koneksi telepon, karenanya penamaan "end of transmission".Jadi dimungkinkan untuk mengirim nilai ascii ke program seperti itu, perhatikan
$'\04'
EOT yang mana:Dengan demikian, kita dapat mengatakan bahwa itu memang ada, tetapi tidak dapat dicetak
Catatan Samping
Kita sering lupa bahwa di masa lalu komputer tidak serba guna - desainer harus menggunakan setiap tombol keyboard yang tersedia. Dengan demikian, mengirim
EOT
karakter dengan CtrlD masih "mengirim karakter", tidak seperti mengetik huruf A, ShiftA, Anda masih membuat memberi komputer input dengan kunci yang tersedia. Jadi EOT adalah karakter nyata dalam arti bahwa itu memang berasal dari pengguna, dapat dibaca oleh komputer (meskipun tidak dapat dicetak, tidak terlihat oleh manusia), itu ada dalam memori komputerKomentar Byte Commander
Ya, tepat sekali, karena di
/dev/null
sana tidak ada karakter aktual untuk dibaca, maka ituc = getchar()
akan mengembalikan-1
kode, dan program akan segera berhenti. Sekali lagi perintah tidak mengembalikan EOF. EOF hanyalah variabel konstan sama dengan -1, yang kami gunakan untuk membandingkan kode pengembalian fungsi getchar .EOF
tidak ada sebagai karakter, itu hanya nilai statis di dalamnyastdio.h
.Demo:
Paku lain di peti mati
Terkadang dicoba untuk dibuktikan bahwa EOF adalah karakter dengan kode seperti ini:
Masalah dengan itu adalah bahwa datatype char bisa menjadi nilai yang ditandatangani atau tidak. Selain itu mereka adalah datatype terkecil yang membuatnya sangat berguna dalam mikrokontroler, di mana memori terbatas. Jadi, alih-alih mendeklarasikannya
int foo = 25;
, biasanya terlihat di mikrokontroler dengan memori kecilchar foo = 25;
atau yang serupa. Selain itu, karakter dapat ditandatangani atau tidak ditandatangani .Orang dapat memverifikasi bahwa ukuran dalam byte dengan program seperti ini:
Apa sebenarnya intinya? Intinya adalah bahwa EOF didefinisikan sebagai -1, tetapi char datatype dapat mencetak nilai integer .
BAIK . . jadi bagaimana jika kita mencoba mencetak char sebagai string?
Jelas kesalahan, tapi tetap saja, kesalahan akan memberi tahu kita sesuatu yang menarik:
Nilai hex
Mencetak EOF sebagai nilai hex memberi
FFFFFFFF
, nilai 16 bit (8 byte), pujian dua dari a-1
.Keluaran:
Hal aneh lain terjadi dengan kode berikut:
Jika satu menekan Shift+ A, kita mendapatkan nilai hex 41, jelas sama seperti pada tabel ASCII. Tetapi untuk Ctrl+ D, kami memiliki
ffffffff
, sekali lagi - nilai balik dari yanggetchar()
disimpan dic
.Rujuk ke bahasa lain
Perhatikan bahwa bahasa lain menghindari kebingungan ini, karena mereka beroperasi pada evaluasi status keluar fungsi, tidak membandingkannya dengan makro. Bagaimana cara membaca file di Java?
Bagaimana dengan python?
sumber
/dev/null
, itu harus mengembalikan EOF juga, kan? Atau apa yang saya dapatkan di sana?EOF adalah singkatan dari end of file . Meskipun saya tidak tahu cara memicu simbol berikut, Anda dapat menjalankan program berikut melalui pemipaan file, yang mengirimkan sinyal EOF di akhir:
di mana
a.out
sumber kompilasi Andasumber
read()
(syscall) akan kembali0
, yang ditafsirkan sebagai EOF: stackoverflow.com/a/1516177/4316166