Saya baru saja membaca jawaban untuk "Menghapus karakter baris baru di akhir file" dan semua orang berkata untuk menghapus karakter terakhir. Pertanyaan saya adalah, bukankah karakter terakhir adalah yang terakhir?
Saya baru saja membaca jawaban untuk "Menghapus karakter baris baru di akhir file" dan semua orang berkata untuk menghapus karakter terakhir. Pertanyaan saya adalah, bukankah karakter terakhir adalah yang terakhir?
Jawaban:
File tidak berakhir dengan karakter Akhir File, karena jawaban sebelumnya menyatakan dengan benar. Tapi saya pikir jawaban dan komentarnya mengandung beberapa ketidakakuratan yang layak untuk ditunjukkan:
Set karakter ASCII tidak mengandung karakter EOF yang tepat. Ada beberapa karakter kontrol "end": End of Text (3), End of Transmission (4), End of Transmission Block (23), End of Medium (25). Pemisah File (28) mungkin paling mendekati karakter EOF. Kode 26 adalah "Pengganti", bukan EOF.
Ctrl- Dhanya terkait dengan input terminal. Misalnya perintah
cat filea fileb filec > outfiletidak melibatkan Ctrl- D. Omong-omong, Anda dapat mengubah karakter terminal EOF menjadi sesuatu yang lain selain Ctrl- Dmenggunakan sttyperintah.
Sebenarnya, Ctrl- D(atau apa pun yang telah Anda ubah) bukan kode kunci EOF. Apa yang dilakukannya adalah membuat readpanggilan sistem kembali dengan input apa yang tersedia, seperti menekan kembali membuat panggilan sistem baca mengembalikan satu baris karakter ke penelepon. Dengan konvensi, nilai balik nol dari panggilan sistem baca (yaitu karakter nol dibaca) menandakan akhir dari kondisi file. Namun, file input tidak ditutup secara otomatis, dan, jika input berasal dari terminal, itu tidak dimasukkan ke dalam status "akhir file". Anda dapat menulis program yang terus membaca dari terminal bahkan setelah "akhir file" dan panggilan baca dapat mengembalikan non-nol untuk baris input berikutnya.
Analogi antara karakter eof dan eol dapat dilihat jika Ctrl- Dditekan ketika beberapa input sudah ditulis di telepon. Misalnya, jika Anda menulis "abc" dan tekan Ctrl- Dpanggilan baca kembali, kali ini dengan nilai balik 3 dan dengan "abc" disimpan dalam buffer yang dilewatkan sebagai argumen. Karena baca tidak mengembalikan 0, ini tidak ditafsirkan sebagai kondisi EOF oleh konvensi di atas. Demikian pula, menekan kembali untuk membuat panggilan baca kembali dengan seluruh jalur input (termasuk baris baru). Anda dapat mencoba ini dengan catperintah: tulis beberapa karakter di telepon dan tekan Ctrl- D. Anda akan melihat karakter bergema kembali kepada Anda dan catmenunggu input lebih banyak.
Semua hal di atas hanya berlaku ketika terminal berada dalam mode "matang", sebagai lawan dari mode "mentah", di mana pemrosesan input jalur diminimalkan. Dalam mode mentah, karakter Ctrl-D benar-benar dikirim ke buffer input.
Karakter kontrol ASCII memiliki definisi dari tahun 1960-an (sebenarnya mendahului apa yang Anda anggap sebagai jaringan ). Tidak semua karakter kontrol tersebut digunakan dengan cara yang ditentukan untuk peralatan telekomunikasi saat itu.
Pada sistem mirip Unix, tidak perlu EOFkarakter; tidak ada yang digunakan. Sistem dapat memberi tahu aplikasi berapa byte dalam file:
Pada beberapa sistem lain (terlihat dalam VMS, DOS, Windows), kontrol-Z dapat bertindak sebagai penanda akhir file karena dalam versi yang lebih lama sistem tidak dapat memberi tahu beberapa aplikasi berapa banyak byte dalam file.
Dalam kasus VMS, batasannya adalah karena cara runtime C bekerja. Aplikasi bahasa assembly dapat (dan memang) mendapatkan ukuran file yang benar.
Sistem Unix dalam shell secara konvensional menggunakan control-D untuk memberi tahu aplikasi bahwa akhir input (file) telah tercapai, tetapi control-D tidak disimpan dalam file.
Dalam C, EOFsengaja dibuat -1untuk menunjukkan bahwa itu bukan karakter yang valid. I / O standar kembali EOFketika kondisi file akhir terdeteksi - bukan karakter khusus.
Omong-omong, file tidak harus diakhiri dengan karakter baris baru (ASCII line-feed). Editor teks dapat mengatasi file yang semuanya merupakan teks yang dapat dicetak tetapi tidak memiliki baris baru.
busyboxitu vi, dll).
EOF bukan karakter. Ini adalah keadaan yang menunjukkan tidak ada lagi karakter untuk dibaca dari aliran file. Ketika Anda memasukkan perintah EOF dari terminal, Anda memberi sinyal OS untuk menutup aliran input, bukan memasukkan karakter khusus.
bashmendapatkan input, dipijat oleh driver TTY. Pengandar ini memotong Ctrl-D dan mengirim EOF ke bash (Di mana EOF bukan karakter, tetapi status file khusus)