Pemrosesan file
| English | Bahasa Indonesia |
|---|---|
| overwrite/ˌəʊvəˈraɪt/ | menimpa |
| APPEND/əˈpend/ | APPEND |
| temporary file/ˈtemprəri faɪl/ | file sementara |
Anda tidak dapat mengubah satu baris file teks
- Sebuah program harus memperbaiki ejaan di tengah file pelanggan. Sepertinya jelas: temukan barisnya, ubah, simpan.
- Hampir tidak ada bahasa yang mengizinkannya. File teks adalah aliran karakter, dan nama yang diperbaiki memiliki panjang berbeda dari yang lama, sehingga setiap byte setelahnya harus berpindah.
- Jadi jawaban standarnya adalah tidak mengedit sama sekali: salin seluruh file, mengubah satu baris itu saat melewati, dan tempatkan salinannya menggantikan yang asli.
- Pelajaran ini mencakup operasi file, pola copy-through untuk pembaruan, dan jebakan yang menyebabkan bug nyata.
Operasi
OPENFILE name FOR READ | WRITE | APPENDmembuka file. READ membuka file yang sudah ada di awal; WRITE membuatnya, atau menimpa yang sudah ada; APPEND membukanya dan menambah di akhir.READFILE name, variablemembaca baris berikutnya.WRITEFILE name, valuemenulis satu.CLOSEFILE namemenutupnya.EOF(name)bernilai TRUE ketika akhir telah dicapai.- Pilih tata letak file dan metode akses terlebih dahulu: file serial, sekuensial, dan acak melayani operasi yang berbeda. Contoh copy-through di sini menggunakan akses sekuensial untuk rekaman teks.
- Pola untuk membaca seluruh file selalu sama:
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") DO
READFILE "names.txt", thisName
OUTPUT thisName
ENDWHILE
CLOSEFILE "names.txt"

Buka, gunakan, tutup, setiap kali
Rute akses file
Ikuti alur file dari penyimpanan ke program dan kembali dengan aman.
Apa efek membuka file FOR WRITE terhadap konten yang sudah ada?
WRITE membuat atau menimpa file. Untuk menjaga konten yang ada dan menambahkannya, gunakan APPEND.
Pasangkan setiap operasi file dengan fungsinya.
WRITE menimpa, APPEND menambah; EOF menandai akhir; loop pencarian berhenti dini sekali nilai ditemukan.
Mencari dalam sebuah fail
- Untuk mencari, baca baris demi baris dan berhenti apabila sasaran ditemui. Dua syarat diperlukan:
WHILE NOT EOF(…) AND NOT found. - Flag
founditu penting. Tanpa ia, gelung akan membaca keseluruhan fail walaupun padanan telah ditemui, yang mana membazirkan sumber, dan tiada apa-apa untuk diuji selepasnya bagi melaporkan "tidak ditemui".
found ← FALSE
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") AND NOT found DO
READFILE "names.txt", thisName
IF thisName = target THEN
found ← TRUE
ENDIF
ENDWHILE
CLOSEFILE "names.txt"
Saat mencari nilai dalam file, kondisi loop biasanya mencakup:
Berhenti saat ditemukan menghindari pembacaan sisa file yang tidak perlu.
Mengapa loop pencarian file menggunakan WHILE NOT EOF AND NOT found? Pilih semua yang berlaku.
Setiap file tetap harus ditutup. Dua kondisi tersebut menangani keluaran dini dan akhir file masing-masing.
Kemaskini: corak fail sementara
- Kerana fail teks tidak boleh diedit secara tempatan (in-place), kemaskini menggunakan fail sementara.
- Buka fail asal UNTUK BACA dan fail sementara UNTUK TULIS. Baca setiap baris satu demi satu; tulis ke fail sementara sama ada diubah atau tidak berubah.
- Tutup kedua-dua fail, kemudian ganti fail asal dengan fail sementara.
- Corak yang sama melakukan semua perkara: untuk memadam satu rekod, lewati penulisan baris tersebut; untuk menyisipkan satu, tulis baris baharu pada titik yang betul semasa menyalin.
Untuk memperbarui file teks ketika pengeditan in-place tidak memungkinkan, Anda:
Salin setiap baris (berubah atau tidak) ke file temp, lalu tukar dengan yang asli.
Susun langkah-langkah menghapus satu rekord dari file teks secara berurutan.
Langkah terakhir adalah yang sering dilewati calon, dan tanpanya tidak ada perubahan. Pola yang sama digunakan untuk menyisipkan atau mengedit rekord.
Contoh penyelesaian: memadam satu rekod
- Huraikan bagaimana satu program memadamkan satu rekod daripada fail teks. [4]
- Buka fail asal untuk membaca dan fail sementara untuk menulis.
- Baca setiap baris satu demi satu. Jika baris itu bukan baris yang ingin dipadam, tulis ke fail sementara; jika ianya ya, jangan tulis.
- Apabila hujung fail asal dicapai, tutup kedua-dua fail.
- Gantikan fail asal dengan fail sementara. Keempat-empat langkah mendapat markah, dan langkah terakhir adalah yang sering dilupakan oleh calon.
Sebuah program menulis 500 rekord lalu berakhir tanpa menutup file, dan beberapa rekord terakhir hilang. Mengapa?
Penulisan dibuffer untuk kecepatan. Menutup file melakukan flush buffer, dan mungkin juga melepaskan kunci yang sedang ditunggu program lain.
Perangkap umum
- Lupa menutup fail: data berpenjuru mungkin tidak pernah ditulis, maka rekod terakhir hilang, dan fail mungkin kekal terkunci daripada program lain.
- Membuka UNTUK TULIS apabila yang dimaksudkan ialah LAMPAHIR: keseluruhan kandungan sedia ada musnah serta-merta sebaik sahaja fail dibuka, sebelum satu baris pun ditulis.
- Membaca melepasi EOF: uji
EOFsebelum setiap pembacaan, bukan selepasnya. - Laluan yang dikod keras: letakkan nama fail dalam pemalar supaya ia muncul sekali dan program boleh dipindahkan.
Lupa menutup file dapat menyebabkan hilangnya penulisan terbuffer dan menghalangi program lain — jadi Anda selalu harus menutup file saat selesai.
Menutup flush data terbuffer ke disk dan melepaskan kunci — blok FINALLY adalah tempat yang baik untuk menjamin hal ini.
Untuk memasukkan entri hari ini ke log yang harus menyimpan sejarahnya, buka file FOR ____.
WRITE akan menghancurkan setiap entri sebelumnya seketika file dibuka, sebelum bahkan satu baris pun ditulis.
Contoh terpecahkan: mode mana
- Sebuah program menambahkan transaksi hari ini ke log berjalan yang harus menyimpan sejarahnya. APPEND: WRITE akan menghancurkan semua entri sebelumnya.
- Sebuah program menghasilkan laporan baru setiap malam, menggantikan yang kemarin. WRITE: membuat atau menimpa adalah persis apa yang diinginkan.
- Sebuah program membaca file konfigurasi saat startup. READ.
- Mode dipilih berdasarkan apa yang harus terjadi pada isi yang ada: disimpan dan ditambah, dihancurkan, atau dibiarkan begitu saja.
⟦⟧ Nilai yang sering terlewat
- Pola pembaruan berakhir dengan mengganti file asli dengan file sementara. Menyalin tanpa langkah akhir itu tidak mengubah apa pun.
- Loop pencarian memerlukan kedua kondisi,
NOT EOFdanNOT found, serta sesuatu untuk diuji setelahnya. - WRITE menimpa; APPEND menambahkan. Memilih dengan salah akan menghancurkan file pada saat pembukaannya.
- Selalu
CLOSEFILE. Jelaskan alasannya: data terbuffer dapat hilang jika tidak demikian.
Anda telah memahaminya
OPENFILE … FOR READ | WRITE | APPEND, laluREADFILEatauWRITEFILE, kemudianCLOSEFILE;EOFdiuji sebelum setiap pembacaan- **WRITE membuat atau menimpa, APPEND mempertahankan isi dan menambahkannya di akhir, READ dimulai dari awal
- cari dengan
WHILE NOT EOF AND NOT found, sehingga loop berhenti lebih cepat dan "tidak ditemukan" dapat dilaporkan - perbarui dengan menyalin melalui file sementara, menulis setiap baris yang diubah atau tidak berubah, melewatkan baris untuk menghapus atau menambahkan satu untuk menyisipkan, kemudian mengganti file asli