[Powered by Google Translate] [File I / O]
[Jason Hirschhorn, Universitas Harvard]
[Ini adalah CS50, CS50.TV]
Ketika kita berpikir tentang sebuah file, apa yang terlintas dalam pikiran adalah dokumen Microsoft Word,
JPEG gambar, atau lagu MP3,
dan kita berinteraksi dengan masing-masing jenis file dengan cara yang berbeda.
Misalnya, dalam dokumen Word kita menambahkan teks
sementara dengan gambar JPEG kita bisa memotong keluar tepi atau retouch warna.
Namun di bawah tenda semua file di komputer kita tidak lebih
dari urutan panjang nol dan satu.
Terserah aplikasi tertentu yang berinteraksi dengan file
untuk memutuskan bagaimana untuk memproses urutan panjang dan menyampaikannya kepada pengguna.
Di satu sisi, dokumen dapat melihat hanya satu byte,
atau 8 angka satu dan nol, dan menampilkan karakter ASCII pada layar.
Di sisi lain, gambar bitmap dapat melihat 3 byte,
atau 24 angka satu dan nol,
dan menafsirkan mereka sebagai 3 angka heksadesimal
yang mewakili nilai-nilai untuk merah, hijau, dan biru
dalam satu pixel dari suatu gambar.
Apapun yang mereka mungkin terlihat seperti di layar Anda, di inti mereka,
file tidak lebih dari urutan nol dan satu.
Jadi mari kita menyelam dalam dan melihat bagaimana kita benar-benar memanipulasi angka satu dan nol
ketika datang untuk menulis dan membaca dari file.
>> Saya akan mulai dengan memecahnya ke dalam suatu proses 3-bagian yang sederhana.
Selanjutnya, saya akan menyelam ke dalam dua contoh kode yang menunjukkan tiga bagian.
Akhirnya, saya akan meninjau proses dan beberapa detail yang paling penting.
Seperti halnya file yang berada pada desktop Anda,
hal pertama yang harus dilakukan adalah untuk membukanya.
Dalam C kita melakukan hal ini dengan menyatakan pointer ke struct standar
yang mewakili sebuah file pada disk.
Dalam pemanggilan fungsi, kami juga memutuskan apakah kita ingin menulis atau membaca dari file.
Selanjutnya, kita melakukan membaca dan menulis yang sebenarnya.
Ada beberapa fungsi khusus dapat kita gunakan dalam bagian ini,
dan hampir semua dari mereka mulai dengan huruf F, yang merupakan singkatan dari file.
Terakhir, mirip dengan X merah kecil di sudut atas dari file terbuka pada komputer Anda,
kita menutup file dengan panggilan fungsi akhir.
Sekarang bahwa kita memiliki gambaran umum tentang apa yang akan kita lakukan,
mari kita menyelam ke dalam kode.
>> Dalam direktori ini, kita memiliki dua file C dan file yang berhubungan executable.
Program Mesin tik mengambil satu argumen baris perintah,
nama dokumen yang ingin kita ciptakan.
Dalam kasus ini, kita akan menyebutnya doc.txt.
Mari kita jalankan program dan masukkan beberapa baris.
Hi. Nama saya adalah Jason.
Akhirnya, kita akan ketik "berhenti."
Jika sekarang kita daftar semua file dalam direktori ini,
kita melihat bahwa dokumen baru eksis disebut doc.txt.
Itulah file program ini baru saja dibuat.
Dan tentu saja, juga tidak lebih dari urutan panjang nol dan satu.
Jika kita membuka file baru,
kita melihat 3 baris kode kami mengadakan program kami -
Hi. Nama Mei adalah Jason.
Tapi apa yang sebenarnya terjadi ketika typewriter.c berjalan?
Baris pertama yang menarik bagi kami adalah baris 24.
Dalam baris ini, kami menyatakan pointer file kita.
Fungsi yang mengembalikan pointer ini, fopen, membutuhkan dua argumen.
Yang pertama adalah nama file termasuk ekstensi file jika sesuai.
Ingatlah bahwa ekstensi file tidak mempengaruhi file pada level terendah.
Kami selalu berhadapan dengan urutan panjang nol dan satu.
Tapi itu tidak mempengaruhi bagaimana file ditafsirkan dan aplikasi apa yang digunakan untuk membukanya.
Argumen kedua fopen adalah satu huruf
yang berdiri untuk apa yang kita rencanakan untuk lakukan setelah kita membuka file tersebut.
Ada tiga pilihan untuk argumen ini - W, R, dan A.
Kami telah memilih w dalam kasus ini karena kita ingin menulis ke file.
R, karena Anda mungkin bisa menebak, adalah untuk membaca ke file.
Dan adalah untuk menambahkan ke file.
Sementara kedua w dan dapat digunakan untuk menulis ke file,
w akan mulai menulis dari awal file
dan berpotensi menghapus semua data yang sebelumnya telah disimpan.
Secara default, file yang kita buka, jika tidak sudah ada,
dibuat dalam direktori saat ini kami bekerja.
Namun, jika kita ingin mengakses atau membuat sebuah file di lokasi yang berbeda,
dalam argumen pertama fopen,
kita dapat menentukan path file di samping nama file.
Sementara bagian pertama dari proses ini adalah hanya satu baris kode yang panjang,
itu selalu praktek yang baik untuk menyertakan satu set baris
yang memeriksa untuk memastikan bahwa file berhasil dibuka atau dibuat.
Jika fopen mengembalikan null, kita tidak ingin untuk maju dengan program kami,
dan ini mungkin terjadi jika sistem operasi kehabisan memori
atau jika kita mencoba untuk membuka file dalam sebuah direktori yang kami tidak memiliki izin yang tepat.
>> Bagian kedua dari proses berlangsung di loop sementara mesin tik.
Kami menggunakan fungsi perpustakaan CS50 untuk mendapatkan masukan dari pengguna,
dan dengan asumsi mereka tidak ingin berhenti program,
kita menggunakan fungsi fputs untuk mengambil string dan menulis ke file.
fputs hanya salah satu dari banyak fungsi yang bisa kita gunakan untuk menulis ke file.
Lainnya termasuk fwrite, fputc, dan bahkan fprintf.
Terlepas dari fungsi tertentu kita akhirnya menggunakan, meskipun,
mereka semua perlu tahu, melalui argumen mereka,
setidaknya dua hal -
apa yang perlu ditulis dan di mana perlu ditulis.
Dalam kasus kami, masukan adalah string yang perlu ditulis
dan fp adalah pointer yang mengarahkan kita di mana kita sedang menulis.
Dalam program ini, bagian kedua dari proses agak mudah.
Kami hanya mengambil string dari pengguna
dan menambahkannya langsung ke file kita dengan sedikit-untuk-tidak validasi input atau pemeriksaan keamanan.
Seringkali, bagaimanapun, bagian kedua akan mengambil sebagian besar kode Anda.
Akhirnya, bagian ketiga adalah on line 58, di mana kita menutup file.
Di sini kita sebut fclose dan menyebarkannya pointer file asli kita.
Pada baris berikutnya, kita kembali nol, menandakan akhir dari program kami.
Dan, ya, bagian tiga adalah sesederhana itu.
>> Mari kita beralih ke membaca dari file.
Kembali di direktori kami kita memiliki sebuah file bernama printer.c.
Mari kita menjalankannya dengan file yang baru kita buat -
doc.txt.
Program ini, seperti namanya, hanya akan mencetak isi dari file tersebut dikirimkan ke sana.
Dan di sana kita memilikinya.
Baris kode kami telah diketik sebelumnya dan disimpan dalam doc.txt.
Hi. Nama saya adalah Jason.
Jika kita menyelam ke printer.c,
kita melihat bahwa banyak kode terlihat mirip dengan apa yang kita hanya berjalan melalui di typewriter.c.
Memang baris 22, di mana kita membuka file tersebut,
dan garis 39, di mana kami menutup file,
keduanya hampir identik dengan typewriter.c, kecuali argumen fopen kedua.
Kali ini kita membaca dari sebuah file,
jadi kita telah memilih r bukan w.
Jadi, mari kita fokus pada bagian kedua dari proses.
Sejalan 35, sebagai syarat kedua di 4 lingkaran kami,
kita membuat panggilan ke fgets,
fungsi pendamping untuk fputs dari sebelumnya.
Kali ini kami memiliki tiga argumen.
Yang pertama adalah pointer ke array karakter di mana string akan disimpan.
Yang kedua adalah jumlah maksimal karakter untuk dibaca.
Dan yang ketiga adalah pointer ke file yang kita kerjakan.
Anda akan melihat bahwa untuk loop berakhir ketika fgets mengembalikan null.
Ada dua alasan bahwa hal ini mungkin telah terjadi.
Pertama, kesalahan mungkin terjadi.
Kedua, dan lebih mungkin, akhir file tersebut tercapai dan tidak ada lagi karakter yang dibaca.
Dalam kasus Anda bertanya-tanya, dua fungsi memang ada yang memungkinkan kami untuk memberitahu
yang alasannya adalah penyebab ini pointer null tertentu.
Dan, tidak mengherankan, karena mereka harus dilakukan dengan bekerja dengan file,
baik fungsi ferror dan mulai fungsi feof dengan huruf f.
>> Akhirnya, sebelum kita menyimpulkan, satu catatan singkat tentang akhir fungsi file,
yang, seperti yang baru saja disebutkan, ditulis sebagai feof.
Sering kali Anda akan menemukan diri Anda menggunakan sementara dan untuk loop untuk semakin membaca jalan Anda melalui file.
Dengan demikian, Anda akan membutuhkan suatu cara untuk mengakhiri loop ini setelah Anda mencapai akhir dari file-file ini.
Memanggil feof pada pointer file Anda dan memeriksa untuk melihat apakah itu benar
akan melakukan hal itu.
Dengan demikian, loop sementara dengan kondisi (feof (fp)!) Mungkin tampak seperti solusi yang sangat tepat.
Namun, katakanlah kita memiliki satu baris tersisa di file teks kami.
Kami akan masuk ke loop sementara kami dan semuanya akan bekerja seperti yang direncanakan.
Di babak berikutnya melalui, program kami akan memeriksa untuk melihat apakah feof dari fp adalah benar,
tapi - dan ini adalah titik penting untuk dipahami di sini -
itu tidak akan menjadi kenyataan dulu.
Itu karena tujuan feof bukanlah untuk memeriksa
jika panggilan berikutnya ke fungsi membaca akan memukul akhir file,
melainkan untuk memeriksa apakah atau tidak akhir file telah dicapai.
Dalam kasus contoh ini,
membaca baris terakhir file kita berjalan sempurna lancar,
namun program ini belum tahu bahwa kita telah memukul akhir file kami.
Ini tidak sampai melakukan satu membaca tambahan yang counter akhir file.
Dengan demikian, suatu kondisi yang benar akan menjadi sebagai berikut:
fgets dan tiga argumen - output, ukuran output, dan fp -
dan semua itu tidak sama dengan null.
Ini adalah pendekatan yang kami mengambil di printer.c,
dan dalam kasus ini, setelah keluar loop,
Anda bisa menelepon feof atau ferror untuk menginformasikan pengguna untuk alasan tertentu untuk keluar loop ini.
>> Menulis dan membaca dari sebuah file, paling dasar,
proses 3-bagian yang sederhana.
Pertama, kita buka file tersebut.
Kedua, kami menempatkan beberapa hal ke dalam file kami atau mengambil beberapa hal dari itu.
Ketiga, kita menutup file tersebut.
Bagian pertama dan terakhir yang mudah.
Bagian tengah adalah di mana hal-hal yang rumit kebohongan.
Dan meskipun di bawah kap mesin kita selalu berhadapan dengan urutan panjang nol dan satu,
itu tidak membantu ketika coding untuk menambahkan lapisan abstraksi
yang mengubah urutan menjadi sesuatu yang lebih menyerupai apa yang kita digunakan untuk melihat.
Sebagai contoh, jika kita sedang bekerja dengan file bitmap 24-bit,
kita mungkin akan membaca atau menulis tiga byte pada suatu waktu.
Dalam hal ini, akan masuk akal untuk mendefinisikan dan tepat nama
struct yaitu 3 byte besar.
>> Meskipun bekerja dengan file mungkin tampak rumit,
memanfaatkan mereka memungkinkan kita untuk melakukan sesuatu yang benar-benar luar biasa.
Kita bisa mengubah keadaan dunia luar program kami,
kita dapat membuat sesuatu yang hidup di luar kehidupan program kami,
atau kita bahkan dapat mengubah sesuatu yang dibuat sebelum program kami mulai berjalan.
Berinteraksi dengan file adalah bagian yang benar-benar kuat dari pemrograman di C.
dan aku bersemangat untuk melihat apa yang Anda akan membuat dengan itu dalam kode yang akan datang.
Nama saya Jason Hirschhorn. Ini adalah CS50.
[CS50.TV]
>> [Tertawa]
Oke. Satu ambil. Di sini kita pergi.
Ketika kita berpikir tentang file - >> Oh, tunggu. Maaf.
[Tertawa] Oke.
Hey ada.
Ketika kita berpikir tentang file -
Ketika Anda berpikir tentang file - Oke. Beritahu saya bila Anda siap.
Oh, bagus.
Meskipun membaca dari teleprompter mungkin tampak - tidak ada. Saya buruk.