>> SPEAKER: Sejauh ini, kemungkinan bahwa sebagian besar program Anda
telah sedikit singkat.
Anda menjalankan program seperti Mario atau Greedy.
Itu melakukan sesuatu, itu mungkin meminta pengguna untuk beberapa informasi,
mencetak beberapa output ke layar, tapi kemudian ketika program berakhir,
ada benar-benar ada bukti ada itu pernah berjalan di tempat pertama.
Maksudku, yakin, Anda mungkin telah meninggalkan terbuka di jendela terminal,
tetapi jika Anda menghapus layar Anda, ada benar-benar tidak ada bukti bahwa itu ada.
Kami tidak memiliki cara untuk menyimpan Informasi gigih, informasi
yang ada setelah kami Program telah berhenti berjalan,
atau kita belum sampai ke titik ini.
Untungnya meskipun, c tidak memberikan kami kemampuan
untuk melakukan hal ini dengan menerapkan sesuatu yang disebut
file, struktur yang pada dasarnya merupakan file yang akan Anda dua kali lipat
klik di komputer Anda, jika Anda digunakan untuk lingkungan pengguna grafis.
Umumnya ketika bekerja dengan c, kami benar-benar
akan bekerja dengan pointer ke files-- berkas stars--
kecuali sedikit ketika kita berbicara tentang beberapa
fungsi yang bekerja dengan berkas pointer.
Anda tidak perlu benar-benar menggali terlalu jauh ke dalam pemahaman pointer
sendiri.
Ada sedikit mungil sedikit di mana kita akan berbicara tentang mereka,
tetapi umumnya mengajukan pointer dan pointer, sedangkan saling terkait,
tidak persis hal yang sama.
>> Sekarang apa yang saya maksud ketika Saya mengatakan data persisten?
Apa data persisten?
Mengapa kita peduli tentang hal itu?
Katakanlah, misalnya, bahwa Anda menjalankan program
atau Anda sudah menulis ulang sebuah Program itu permainan,
dan Anda ingin melacak semua bergerak pengguna
sehingga mungkin jika sesuatu yang tidak beres, Anda dapat meninjau file setelah pertandingan.
Itulah yang kita maksud ketika kita berbicara tentang data persisten.
>> Dalam perjalanan menjalankan Program, sebuah file dibuat.
Dan ketika program Anda telah berhenti berjalan,
file yang masih ada di sistem Anda.
Dan kita dapat melihat itu dan memeriksanya.
Dan program yang akan ditetapkan untuk telah menciptakan beberapa data persisten,
data yang ada setelah program telah selesai berjalan.
>> Sekarang semua fungsi ini yang bekerja dengan membuat file dan memanipulasi
mereka dalam berbagai cara tinggal di io.h standar,
yang merupakan file header yang Anda mungkin sudah pernah pon
termasuk di bagian atas cukup banyak semua program Anda
karena mengandung salah satu kebanyakan fungsi yang berguna bagi kita,
printf, yang juga memungkinkan tinggal di io.h. standar
Jadi Anda tidak perlu pon termasuk file tambahan mungkin
dalam rangka untuk bekerja dengan file yang pointer.
>> Sekarang setiap fungsi pointer file tunggal, atau setiap file I / O, input output
fungsi, menerima sebagai salah satu parameter atau masukan
sebuah pointer-- berkas kecuali untuk satu, fopen, yang
adalah apa yang Anda gunakan untuk mendapatkan file pointer di tempat pertama.
Tapi setelah Anda membuka file dan Anda mendapatkan file pointer,
Anda kemudian dapat melewati mereka sebagai argumen untuk berbagai fungsi
kita akan berbicara tentang hari ini, serta banyak lainnya
sehingga Anda dapat bekerja dengan file.
>> Jadi ada enam cukup yang dasar umum
bahwa kita akan bicarakan hari ini.
fopen dan pendamping Fungsi fclose, fgetc
dan fungsi pendamping fputc, dan fread dan fungsi pendamping nya,
fwrite.
Jadi mari kita ke dalamnya.
>> fopen-- apa fungsinya?
Nah, ini akan membuka sebuah file dan memberi Anda pointer berkas untuk itu,
sehingga Anda kemudian dapat menggunakan mengajukan pointer sebagai argumen
ke salah satu file lain I / O fungsi.
Hal yang paling penting ingat dengan fopen
adalah bahwa setelah Anda membuka mengajukan atau membuat panggilan seperti di sini,
Anda perlu memeriksa untuk memastikan bahwa pointer yang kembali
tidak sama dengan nol.
Jika Anda belum menonton video di pointer, ini mungkin tidak masuk akal.
Tetapi jika Anda mencoba dan dereference pointer recall null,
program anda mungkin akan menderita segmentasi sebuah [tidak terdengar].
Kami ingin memastikan bahwa kami mendapat pointer kembali yang sah.
Sebagian besar waktu kita akan mendapatkan pointer yang sah kembali
dan itu tidak akan menjadi masalah.
>> Jadi bagaimana kita membuat panggilan ke fopen?
Ini terlihat cukup banyak seperti ini.
Bintang berkas ptr-- ptr menjadi generik nama file pointer-- fopen
dan kami lulus dalam dua hal, nama file dan operasi kami ingin melakukan.
Jadi kita mungkin memiliki panggilan yang terlihat seperti this-- ptr Bintang file 1 sama dengan fopen
file1.txt.
Dan operasi aku telah memilih adalah r.
>> Jadi apa yang Anda pikirkan r di sini?
Apa hal-hal yang kita mungkin bisa lakukan untuk file?
Jadi r adalah operasi yang kita memilih ketika kita ingin membaca file.
Jadi kita akan pada dasarnya ketika kami membuat panggilan seperti ini
mendapatkan diri pointer berkas seperti yang kita kemudian bisa membaca informasi
dari file1.txt.
>> Demikian pula, kita bisa membuka file 2.txt untuk menulis dan jadi kami bisa lulus ptr2,
pointer file yang saya buat di sini, sebagai argumen untuk fungsi apapun yang
menulis informasi ke file.
Dan mirip dengan tulisan, ada juga pilihan untuk menambahkan, a.
Perbedaan antara menulis dan menambahkan
adalah bahwa ketika Anda menulis ke file, jika Anda membuat panggilan ke fopen untuk menulis
dan file yang sudah ada, itu akan menimpa seluruh file.
Ini akan memulai di awal,
menghapus semua informasi yang sudah ada.
>> Sedangkan jika Anda membukanya untuk menambahkan, ia akan pergi ke akhir file
jika sudah ada teks dalam atau informasi di dalamnya,
dan kemudian akan mulai menulis dari sana.
Jadi Anda tidak akan kehilangan salah satu informasi yang telah Anda lakukan sebelumnya.
Apakah Anda ingin menulis atau menambahkan semacam tergantung pada situasi.
Tapi Anda mungkin akan tahu apa yang operasi yang tepat adalah ketika saatnya tiba.
Jadi itu fopen.
>> Bagaimana fclose?
Nah, cukup sederhana, fclose hanya menerima file pointer.
Dan seperti yang Anda harapkan, menutup file itu.
Dan setelah kami menutup file, kita tidak bisa melakukan setiap file yang lebih I / O fungsi,
membaca atau menulis, pada file tersebut.
Kita harus membuka ulang mengajukan waktu lain dalam rangka
untuk terus bekerja dengan menggunakan fungsi I / O.
Berarti sehingga fclose kita sudah selesai bekerja dengan file ini.
Dan semua yang kita butuhkan untuk lulus di adalah nama pointer berkas.
Jadi pada beberapa slide yang lalu, kami fopened file 1 dot teks untuk membaca
dan kami ditugaskan bahwa mengajukan pointer ke ptr1.
Sekarang kita sudah memutuskan kami selesai membaca dari file itu.
Kami tidak perlu melakukan lagi dengan itu.
Kita bisa ptr1 hanya fclose.
Dan sama, bisa kita fclose yang lain.
Baiklah.
Jadi yang membuka dan menutup.
Mereka adalah dua dasar mulai operasi.
>> Sekarang kita ingin benar-benar melakukan beberapa hal menarik,
dan fungsi pertama yang kita akan melihat bahwa akan melakukannya adalah fgetc--
mengajukan mendapatkan karakter.
Itulah yang fgetc umumnya akan menerjemahkan ke.
Tujuannya dalam hidup adalah membaca karakter berikutnya,
atau jika ini sangat Anda panggilan pertama untuk fgetc
untuk file tertentu, karakter pertama.
Tapi kemudian setelah itu, Anda mendapatkan yang berikutnya,
karakter berikutnya dari file tersebut, dan menyimpannya dalam variabel karakter.
Seperti yang telah kita lakukan di sini, Char ch sama fgetc,
lulus dalam nama pointer berkas.
Sekali lagi, itu sangat penting di sini untuk diingat
bahwa dalam rangka untuk memiliki operasi ini berhasil,
file pointer itu sendiri pasti telah dibuka untuk membaca.
Kita tidak bisa membaca karakter dari file pointer yang kita dibuka untuk menulis.
Jadi itulah salah satu keterbatasan fopen, kan?
Kita harus membatasi diri untuk hanya melakukan
satu operasi dengan satu file pointer.
Jika kita ingin membaca dan menulis dari file yang sama,
kita akan buka dua terpisah pointer file ke file-- sama
satu untuk membaca, satu untuk menulis.
>> Jadi sekali lagi, satu-satunya alasan Saya membawa bahwa sampai saat ini adalah
karena jika kita akan membuat panggilan untuk fgetc, file pointer pasti
telah dibuka untuk membaca.
Dan kemudian cukup sederhana, semua yang perlu kita lakukan
adalah lulus dalam nama file pointer.
Jadi ch arang sama ptr1 fgetc.
>> Itu akan membuat kita yang character-- berikutnya
atau lagi, jika ini adalah pertama waktu kami telah membuat panggilan ini,
yang character-- pertama apa pun file ditunjukkan oleh ptr1.
Ingat bahwa itu adalah file 1 dot teks.
Ini akan mendapatkan karakter pertama yang dan kami akan menyimpannya di ch variabel.
Cukup sederhana.
Jadi kita hanya melihat tiga fungsi dan sudah kami
dapat melakukan sesuatu yang cukup rapi.
>> Jadi jika kita mengambil kemampuan ini mendapatkan karakter
dan kami lingkaran itu-- jadi kami terus mendapatkan karakter
dari file lebih dan lebih dan over-- sekarang kami
dapat membaca setiap satu karakter dari sebuah file.
Dan jika kita mencetak setiap karakter segera setelah kita membaca itu,
kita sekarang telah membaca dari sebuah file dan dicetak isinya ke layar.
Kami telah digabungkan secara efektif file di layar.
Dan itulah yang Linux perintah cat tidak.
>> Jika Anda mengetik kucing dalam nama file, itu akan mencetak seluruh isi
dari file dalam jendela terminal Anda.
Dan lingkaran kecil di sini, hanya tiga baris kode,
tapi efektif duplikat perintah cat Linux.
Jadi sintaks ini mungkin terlihat sedikit aneh,
tapi inilah yang terjadi di sini.
Sementara ch sama fgetc, ptr tidak sama dengan EOF-- itu seluruh seteguk,
tapi mari kita jatuhkan itu hanya jadi jelas pada sintaks.
Saya sudah dikonsolidasikan itu demi ruang,
meskipun itu sedikit sintaksis rumit.
>> Jadi bagian ini di kanan hijau sekarang, apa itu lakukan?
Nah, itu hanya panggilan fgetc kami, kan?
Kami telah melihat itu sebelumnya.
Ini memperoleh satu karakter dari file.
Kemudian kita bandingkan bahwa karakter terhadap EOF.
EOF adalah nilai khusus yang didefinisikan dalam io.h standar, yang
adalah akhir file karakter.
Jadi pada dasarnya apa yang akan terjadi adalah lingkaran ini akan membaca karakter,
bandingkan dengan EoF, yang akhir file karakter.
Jika mereka tidak cocok, jadi kami belum mencapai akhir file,
kami akan mencetak karakter yang keluar.
Kemudian kita akan kembali ke mulai dari loop lagi.
Kita akan mendapatkan karakter, periksa terhadap EOF, mencetaknya, dan sebagainya
dan seterusnya dan seterusnya, perulangan melalui cara yang
sampai kita telah mencapai akhir dari file.
Dan kemudian pada saat itu, kita akan dicetak
keluar seluruh isi file.
Jadi sekali lagi, kita hanya melihat fopen, fclose, dan fgetc
dan sudah kita dapat menduplikasi perintah terminal Linux.
>> Seperti yang saya katakan di awal, kami memiliki fgetc dan fputc,
dan fputc adalah pendamping fungsi fgetc.
Dan, seperti yang Anda bayangkan, itu adalah setara menulis.
Hal ini memungkinkan kita untuk menulis karakter ke file.
>> Sekali lagi, peringatan sementara, hanya seperti itu adalah dengan fgetc, file
bahwa kita sedang menulis ke harus sudah dibuka untuk menulis atau untuk menambahkan.
Jika kita mencoba dan menggunakan fputc pada file bahwa kita telah membuka untuk membaca,
kita akan menderita sedikit kesalahan.
Tetapi panggilan ini cukup sederhana.
modal fputc A ptr2, semua yang akan dilakukan adalah itu
akan menulis surat menjadi A ke dalam file 2 dot
teks, yang merupakan nama mengajukan bahwa kami membuka dan ditugaskan
pointer ke ptr2.
Jadi kita akan menulis Modal A untuk mengajukan 2 dot teks.
Dan kami akan menulis seru menunjuk ke file 3 dot
teks, yang ditunjuk oleh ptr3.
Jadi sekali lagi, cukup sederhana di sini.
>> Tapi sekarang kita bisa melakukan hal lain.
Kami memiliki contoh ini kami hanya akan lebih
tentang mampu mereplikasi kucing Perintah Linux, salah satu yang mencetak
ke layar.
Nah, sekarang kita memiliki kemampuan membaca karakter dari file
dan menulis karakter ke file, kenapa tidak kita hanya mengganti yang
panggilan untuk printf dengan panggilan untuk fputc.
>> Dan sekarang kita sudah diduplikasi cp, perintah yang sangat dasar Linux
yang kita bicarakan jauh lalu di Linux perintah video.
Kami sudah efektif digandakan itu di sini.
Kami membaca karakter dan kemudian kami menulis bahwa karakter ke file lain.
Membaca dari satu file, menulis lain, berulang
dan lagi sampai kita memukul EOF.
Kita harus akhir mengajukan kita mencoba untuk menyalin dari.
Dan dengan itu kita akan menulis semua karakter kita perlu file
bahwa kita sedang menulis ke.
Jadi ini adalah cp, perintah copy Linux.
>> Pada awal video ini, saya memiliki peringatan yang
bahwa kita akan berbicara sedikit tentang pointer.
Berikut adalah khusus di mana kami akan berbicara tentang pointer
selain file pointer.
Jadi fungsi ini terlihat agak menakutkan.
Itu punya beberapa parameter.
Ada banyak hal yang terjadi di sini.
Ada banyak yang berbeda warna dan teks.
Tapi sungguh, itu hanya versi generik dari fgetc
yang memungkinkan kita untuk mendapatkan jumlah informasi.
Hal ini dapat sedikit tidak efisien jika kita mendapatkan karakter satu per satu,
iterasi melalui file satu karakter pada satu waktu.
Bukankah lebih baik untuk mendapatkan 100 pada waktu atau 500 pada suatu waktu?
>> Nah, fread dan fungsi pendamping fwrite, yang akan kita bicarakan
dalam kedua, memungkinkan kita untuk melakukan hal itu.
Kita dapat membaca jumlah yang sewenang-wenang informasi dari sebuah file
dan kami menyimpannya di suatu tempat sementara.
Alih-alih mampu hanya muat di satu variabel,
kita mungkin perlu menyimpannya dalam array.
Dan, kita lulus dalam empat argumen untuk fread-- pointer
ke lokasi di mana kami akan menyimpan informasi,
seberapa besar setiap unit informasi akan, berapa banyak unit informasi
kami ingin memperoleh, dan dari File yang kita ingin mendapatkan mereka.
Mungkin terbaik diilustrasikan dengan contoh di sini.
Jadi mari kita mengatakan bahwa kita mendeklarasikan array 10 bilangan bulat.
Kami baru saja dideklarasikan pada tumpukan sewenang-wenang int arr 10.
Jadi itu cukup sederhana.
Sekarang apa yang kita lakukan meskipun adalah frecall ini kita membaca ukuran int
kali 10 byte informasi.
Ukuran int makhluk four-- itu ukuran integer di c.
>> Jadi apa yang kita lakukan adalah kita membaca 40 byte senilai informasi
dari file yang ditunjukkan oleh ptr.
Dan kita menyimpan mereka 40 byte di suatu tempat
di mana kami telah menyisihkan 40 byte senilai memori.
Untungnya, kami sudah melakukan itu dengan menyatakan arr, array itu di sana.
Yang mampu memegang 10 unit empat-byte.
Jadi secara total, dapat menahan 40 byte senilai informasi.
Dan kita sekarang membaca 40 byte informasi dari file,
dan kita menyimpannya di arr.
>> Ingat dari video pada pointer yang nama array, seperti arr,
benar-benar hanya sebuah pointer untuk elemen pertama.
Jadi ketika kita lulus dalam arr sana, kami , pada kenyataannya, lewat di pointer.
>> Demikian pula kita dapat melakukan this-- kita tidak perlu
perlu menyimpan penyangga kami di stack.
Kami juga bisa dinamis mengalokasikan sebuah penyangga seperti ini, menggunakan malloc.
Ingat, ketika kita dinamis mengalokasikan memori,
kita menyimpannya di tumpukan, tidak stack.
Tapi itu masih penyangga.
>> Masih, dalam hal ini, adalah memegang 640 byte informasi
karena ganda memakan delapan byte.
Dan kami meminta 80 dari mereka.
Kami ingin memiliki ruang untuk mengadakan 80 ganda.
Jadi 80 kali 8 adalah informasi 640 byte.
Dan bahwa panggilan untuk fread adalah mengumpulkan 640 byte informasi
dari file yang ditunjukkan oleh ptr dan menyimpannya sekarang di arr2.
>> Sekarang kita juga dapat mengobati fread seperti panggilan untuk fgetc.
Dalam hal ini, kami hanya mencoba untuk mendapatkan satu karakter dari file.
Dan kita tidak perlu array untuk memegang karakter.
Kami hanya dapat menyimpannya dalam variabel karakter.
>> Menangkap, meskipun, adalah bahwa ketika kita hanya memiliki variabel,
kita harus lulus dalam alamat variabel yang
karena ingat bahwa Argumen pertama yang fread
adalah pointer ke lokasi dan memori di mana kita ingin menyimpan informasi tersebut.
Sekali lagi, nama sebuah array pointer.
Jadi kita tidak perlu melakukan berbagai ampersand.
Tapi c, karakter c sini, tidak array.
Ini hanya variabel.
Dan jadi kita perlu untuk lulus ampersand c untuk menunjukkan
bahwa itulah alamat mana kita ingin untuk menyimpan ini satu byte informasi,
satu karakter ini yang kami mengumpulkan dari ptr.
Fwrite-- Aku akan pergi melalui ini sedikit lebih
quickly-- cukup banyak setara tepat dari fread
kecuali itu untuk menulis bukannya membaca, hanya
seperti other-- kami sudah terbuka dan dekat, dapatkan karakter,
menulis karakter.
Sekarang mendapatkan sewenang-wenang jumlah informasi,
tepat jumlah sewenang-wenang informasi.
Jadi sama seperti sebelumnya, kita dapat memiliki sebuah array dari 10 bilangan bulat
di mana kita sudah memiliki informasi yang tersimpan, mungkin.
>> Itu mungkin beberapa baris kode yang harus pergi antara kedua
di mana saya mengisi arr dengan sesuatu yang berarti.
Aku mengisinya dengan 10 bilangan bulat yang berbeda.
Dan sebaliknya, apa yang saya lakukan adalah menulis dari arr
dan mengumpulkan informasi dari arr.
Dan aku mengambil informasi yang dan memasukkannya ke dalam file.
>> Jadi, bukannya itu menjadi dari file ke buffer,
kita sekarang pergi dari buffer ke file.
Jadi itu hanya sebaliknya.
Jadi sekali lagi, seperti sebelumnya, kita dapat juga memiliki sepotong tumpukan memori
bahwa kita sudah dinamis dialokasikan dan membaca dari itu
dan menulis yang ke file.
>> Dan kami juga memiliki satu variabel mampu menahan satu byte
informasi, seperti karakter.
Tapi sekali lagi, kita harus lulus dalam alamat variabel yang
ketika kita ingin membaca dari itu.
Jadi kita dapat menulis informasi kita menemukan di alamat itu
ke file pointer, ptr.
>> Ada banyak lainnya File besar I / O fungsi
yang melakukan berbagai hal selain yang kita bicarakan hari ini.
Beberapa yang Anda mungkin menemukan berguna
adalah fgets dan fputs, yang setara dengan
dari fgetc dan fputc tapi untuk membaca satu string dari sebuah file.
Alih-alih satu karakter, itu akan membaca seluruh string.
fprintf, yang pada dasarnya memungkinkan Anda menggunakan printf untuk menulis ke file.
Jadi seperti yang Anda dapat melakukan substitusi variabel menggunakan
i penampung persen dan persen d, dan seterusnya, dengan printf
Anda sama dapat mengambil printf tali dan cetak sesuatu
seperti itu ke sebuah file.
>> fseek-- jika Anda memiliki DVD player adalah analogi saya biasanya menggunakan di sini-
adalah semacam seperti menggunakan Anda mundur dan maju cepat
tombol untuk bergerak di sekitar film.
Demikian pula, Anda dapat bergerak di sekitar file.
Salah satu hal dalam bahwa struktur file
yang c menciptakan untuk Anda adalah indikator dari mana Anda berada dalam file.
Apakah Anda di bagian paling mulai, di byte nol?
Apakah Anda di byte 100, byte 1000, dan seterusnya?
Anda dapat menggunakan fseek untuk sewenang-wenang memindahkan bahwa indikator maju atau mundur.
>> Dan ftell, lagi mirip dengan DVD player,
adalah seperti sebuah jam kecil yang memberitahu Anda berapa menit dan detik Anda
adalah menjadi film tertentu.
Demikian pula, ftell memberitahu Anda bagaimana banyak byte Anda ke file.
feof adalah versi yang berbeda mendeteksi apakah Anda sudah
mencapai akhir file.
Dan ferror adalah fungsi Anda dapat menggunakan
untuk mendeteksi apakah sesuatu memiliki pergi kerja yang salah dengan file.
Sekali lagi, ini hanya menggaruk permukaan.
Masih banyak lagi file I / O fungsi dalam io.h. standar
Tapi ini mungkin akan membuat Anda mulai bekerja dengan berkas pointer.
Aku Doug Lloyd.
Ini adalah CS50.