SPEAKER: Setakat ini, kemungkinan bahawa kebanyakan program anda menjadi sedikit tidak kekal. Anda menjalankan program seperti Mario atau tamak. Ia melakukan sesuatu, ia mungkin meminta pengguna untuk beberapa maklumat, mencetak beberapa output dengan skrin, tetapi kemudian apabila program anda lebih, ada benar-benar ada bukti terdapat ia pernah berjalan di tempat pertama. Maksud saya, pasti, anda mungkin telah meninggalkan ia membuka dalam tetingkap terminal, tetapi jika anda mengosongkan skrin anda, ada benar-benar ada bukti bahawa ia wujud. Kami tidak mempunyai satu cara untuk menyimpan maklumat yang berterusan, maklumat yang wujud selepas kami program telah berhenti berjalan, atau kita tidak mempunyai sehingga ke tahap ini. Nasib baik walaupun, c tidak memberikan kami keupayaan untuk melakukan ini dengan melaksanakan sesuatu yang dinamakan fail, struktur yang yang pada dasarnya mewakili fail yang anda akan menggandakan klik pada komputer anda, jika anda digunakan untuk persekitaran pengguna grafik. Secara umumnya apabila bekerja dengan c, kami sebenarnya akan bekerja dengan petunjuk untuk files-- fail stars-- kecuali sedikit apabila kita bercakap mengenai pasangan fungsi yang bekerja dengan petunjuk fail. Anda tidak perlu telah benar-benar menggali terlalu dalam ke dalam petunjuk pemahaman diri mereka sendiri. Ada sedikit pemudi kecil di mana kita akan bercakap tentang mereka, tetapi secara umumnya memfailkan petunjuk dan petunjuk, manakala yang saling berkaitan, tidak betul-betul perkara yang sama. Sekarang apa yang saya maksudkan apabila Aku berkata data kekal? Apakah data kekal? Mengapa kita mengambil berat tentang perkara ini? Berkata, sebagai contoh, yang anda menjalankan program yang atau anda telah ditulis semula yang program itu satu permainan, dan anda mahu untuk mengesan semua bergerak pengguna supaya mungkin jika ada masalah, anda boleh menyemak fail selepas permainan. Itulah apa yang kita maksudkan apabila kita bercakap mengenai data kekal. Dalam perjalanan berjalan anda program, fail yang dicipta. Dan apabila program anda telah berhenti berjalan, fail yang masih wujud pada sistem anda. Dan kita boleh melihat dan memeriksanya. Dan supaya program yang akan ditetapkan untuk telah mencipta beberapa data yang berterusan, data wujud selepas program telah selesai berjalan. Sekarang semua fungsi-fungsi yang bekerja dengan mewujudkan fail dan memanipulasi mereka dalam pelbagai cara hidup dalam io.h standard, yang merupakan fail kepala yang anda mungkin telah paun termasuk di bahagian atas cukup banyak semua program anda kerana ia mengandungi salah satu daripada paling fungsi yang berguna untuk kita, printf, yang juga membolehkan tinggal di io.h. standard Jadi anda tidak perlu untuk menumbuk termasuk apa-apa fail tambahan mungkin untuk bekerja dengan petunjuk fail. Sekarang setiap fungsi penunjuk fail, atau setiap fail I / O, output input fungsi, menerima sebagai salah parameter atau input yang pointer-- fail kecuali untuk satu, fopen, yang adalah apa yang anda gunakan untuk mendapatkan fail penunjuk di tempat pertama. Tetapi selepas anda membuka memfailkan dan anda mendapat petunjuk fail, anda boleh lulus mereka sebagai hujah untuk pelbagai fungsi kita akan bercakap tentang hari ini, serta lain-lain lagi supaya anda boleh bekerja dengan fail. Jadi terdapat enam cantik yang asas biasa bahawa kita akan bercakap tentang hari ini. fopen dan temannya fungsi fclose, fgetc dan fputc fungsi temannya, dan fread dan fungsi temannya, fwrite. Jadi mari kita mendapatkan hak ke dalamnya. fopen-- apa yang ia buat? Nah, ia membuka fail dan ia memberikan penunjuk fail kepadanya, supaya anda boleh menggunakannya memfailkan penunjuk sebagai hujah kepada mana-mana fail lain I / O fungsi. Perkara yang paling penting ingat dengan fopen adalah bahawa selepas anda telah membuka fail atau membuat panggilan seperti yang di sini, anda perlu periksa untuk memastikan bahawa penunjuk bahawa anda mendapat kembali tidak sama dengan nol. Jika anda tidak menonton video pada petunjuk, ini tidak mungkin masuk akal. Tetapi jika anda cuba dan dereference penarikan balik penunjuk null, program anda mungkin akan mengalami segmentasi yang [didengar]. Kami mahu memastikan bahawa kita mendapat kembali penunjuk sah. Sebahagian besar masa kita akan telah mendapat pointer yang sah balik dan ia tidak akan menjadi masalah. Jadi bagaimana kita membuat panggilan kepada fopen? Ia kelihatan cukup banyak seperti ini. Fail bintang ptr-- PTR menjadi generik menamakan fail pointer-- fopen dan kami lulus dalam dua perkara, nama fail dan operasi yang kami mahu lakukan. Oleh itu, kita mungkin mempunyai panggilan yang kelihatan seperti this-- ptr fail bintang 1 sama fopen file1.txt. Dan operasi yang saya telah dipilih adalah r. Jadi, apa yang anda berfikir r adalah di sini? Apakah jenis perkara yang kita mungkin boleh lakukan untuk fail? Jadi r adalah operasi yang kita memilih apabila kita mahu membaca fail. Oleh itu, kita akan pada dasarnya apabila kita membuat panggilan seperti ini akan mendapat diri kita penunjuk fail seperti yang kita kemudian boleh membaca maklumat dari file1.txt. Begitu juga, kita boleh membuka fail 2.txt untuk menulis dan dengan itu kita boleh lulus ptr2, penunjuk fail saya telah membuat di sini, sebagai hujah kepada mana-mana fungsi yang menulis maklumat ke fail. Dan sama dengan bertulis, ada juga pilihan untuk menambah, a. Perbezaan antara menulis dan appending adalah bahawa apabila anda menulis ke fail, jika anda membuat panggilan kepada fopen untuk menulis dan fail yang telah wujud, ia adalah akan menulis ganti keseluruhan fail. Ia akan mula pada awal-awal, memotong semua maklumat yang yang sudah ada. Manakala jika anda membukanya untuk melampirkan, ia akan pergi ke akhir fail jika ada sudah teks dalam atau maklumat di dalamnya, dan ia akan mula menulis dari sana. Jadi, anda tidak akan kehilangan mana-mana daripada maklumat yang anda lakukan sebelum ini. Sama ada anda mahu untuk menulis atau menambah jenis bergantung kepada keadaan. Tetapi anda mungkin akan tahu apa yang operasi betul adalah apabila tiba masanya. Jadi itulah fopen. Bagaimana pula fclose? Nah, cukup mudah, fclose hanya menerima penunjuk fail. Dan seperti yang anda jangkakan, ia menutup fail itu. Dan sebaik sahaja kami telah ditutup fail, kita tidak boleh melaksanakan apa-apa fail lebih I / O fungsi, membaca atau menulis, pada fail itu. Kita perlu membuka semula memfailkan satu masa yang lain untuk untuk terus bekerja dengan dengan menggunakan fungsi I / O. Cara supaya fclose kita selesai bekerja dengan fail ini. Dan semua kita perlu lulus dalam adalah nama penunjuk fail. Maka pada pasangan slaid yang lalu, kami fail fopened 1 dot teks untuk membaca dan kami diberikan bahawa memfailkan penunjuk kepada ptr1. Sekarang kita telah membuat keputusan kami selesai membaca dari fail itu. Kita tidak perlu melakukan apa-apa lagi dengannya. Kita boleh ptr1 hanya fclose. Begitu juga, boleh kita fclose orang-orang lain. Baiklah. Jadi yang yang membuka dan menutup. Mereka adalah dua asas memulakan operasi. Sekarang kita mahu sebenarnya melakukan beberapa perkara yang menarik, dan fungsi yang pertama yang kita akan melihat bahawa akan melakukan yang fgetc-- memfailkan mendapatkan watak. Itulah yang fgetc umumnya akan diterjemahkan kepada. Matlamatnya dalam hidup adalah untuk membaca aksara seterusnya, atau jika ini adalah sangat anda Panggilan pertama kepada fgetc untuk fail tertentu, watak pertama. Tetapi selepas itu, anda yang seterusnya, watak yang seterusnya fail itu, dan kedai dalam pembolehubah watak. Seperti yang kita telah dilakukan di sini, char ch sama fgetc, lulus dalam nama penunjuk fail. Sekali lagi, ia sangat penting di sini untuk mengingati bahawa untuk mempunyai operasi ini berjaya, penunjuk fail itu sendiri must've telah dibuka untuk membaca. Kita tidak boleh membaca watak dari fail penunjuk yang kami membuka untuk menulis. Jadi, itu salah satu daripada batasan fopen, bukan? Kita perlu menyekat diri kita hanya melaksanakan satu operasi dengan satu fail penunjuk. Jika kita mahu untuk membaca dan menulis dari fail yang sama, kita perlu terbuka dua berasingan petunjuk fail untuk file-- yang sama satu untuk membaca, satu untuk menulis. Jadi sekali lagi, satu-satunya sebab Saya membawa bahawa sehingga kini adalah kerana jika kita akan membuat panggilan untuk fgetc, bahawa penunjuk fail must've telah dibuka untuk membaca. Dan kemudian cantik semata-mata, semua yang perlu kita lakukan adalah lulus dalam nama penunjuk fail. Jadi ch char sama ptr1 fgetc. Yang akan membawa kita character-- seterusnya atau sekali lagi, jika ini adalah yang pertama masa kita telah membuat panggilan ini, character-- pertama apa sahaja fail ditunjukkan oleh ptr1. Ingat bahawa itu adalah fail 1 dot teks. Ia akan mendapat watak pertama yang dan kami akan menyimpannya di ch yang berubah-ubah. Agak mudah. Oleh itu, kita hanya melihat tiga fungsi dan sudah kita boleh melakukan sesuatu yang cukup kemas. Jadi, jika kita mengambil keupayaan ini untuk mendapatkan watak dan kami gelung kitab itu jadi kami terus mendapat watak-watak dari fail ke atas dan berulang-over-- sekarang kita boleh membaca setiap satu watak fail. Dan jika kita mencetak setiap watak serta-merta selepas kita membacanya, kita kini telah dibaca dari fail dan dicetak kandungannya ke skrin. Kami telah dirangkaikan dengan berkesan fail yang pada skrin. Dan itulah apa yang Linux arahan kucing tidak. Jika anda menaip kucing dalam nama fail, ia akan mencetak keseluruhan kandungan fail dalam tetingkap terminal anda. Dan supaya gelung ini sedikit di sini, hanya tiga baris kod, tetapi ia berkesan atau bertindih perintah kucing Linux. Jadi sintaks ini mungkin kelihatan sedikit pelik, tetapi di sini adalah apa yang berlaku di sini. Walaupun ch sama fgetc, ptr tidak sama dengan EOF-- ia adalah satu hal yg keseluruhan, tetapi mari kita memecahkan ia ke bawah hanya supaya lebih jelas mengenai sintaks. Saya telah disatukan ia demi ruang, walaupun ia sedikit sintaksis yang rumit. Jadi bahagian ini dalam hak hijau sekarang, apa yang ia lakukan? Nah, itu hanya panggilan fgetc kita, bukan? Kita telah melihat bahawa sebelum. Ia mendapatkan satu watak dari fail. Kemudian kita bandingkan bahawa watak terhadap EOF. EOF adalah nilai istimewa itulah ditakrifkan dalam io.h standard, yang adalah akhir watak fail. Jadi, pada asasnya apa yang akan berlaku adalah gelung ini akan membaca watak, membandingkannya dengan EOF, yang akhir watak fail. Jika mereka tidak sepadan, jadi kami tidak mempunyai sampai ke penghujung fail, kami akan mencetak watak yang keluar. Kemudian kami akan kembali kepada bermula gelung lagi. Kami akan mendapatkan watak, semak terhadap EOF, mencetak, dan sebagainya dan sebagainya dan sebagainya, menggelung melalui dengan cara itu sehingga kita telah sampai ke penghujung fail. Dan kemudian oleh ketika itu, kita akan dicetak daripada keseluruhan kandungan fail. Jadi sekali lagi, kami telah hanya dilihat fopen, fclose dan fgetc dan sudah kita boleh pendua arahan terminal Linux. Seperti yang saya katakan pada awal, kita mempunyai fgetc dan fputc, dan fputc adalah sahabat fungsi fgetc. Dan sebagainya, seperti yang anda bayangkan, ia adalah tulisan bersamaan. Ia membolehkan kita untuk memberi satu watak ke fail. Sekali lagi, kaveat ini, hanya seperti ia adalah dengan fgetc, fail yang kita menulis untuk must've telah dibuka untuk menulis atau untuk melampirkan. Jika kita cuba dan menggunakan fputc pada fail bahawa kita telah dibuka untuk membaca, kita akan mengalami sedikit kesilapan. Tetapi panggilan tersebut adalah agak mudah. modal fputc ptr2 A, semua yang akan lakukan adalah ia akan menulis surat kepada A ke dalam fail 2 dot teks, yang merupakan nama fail yang kita dibuka dan diberikan penunjuk kepada ptr2. Jadi, kita akan menulis modal A untuk memfailkan 2 dot teks. Dan kami akan menulis seru menunjukkan fail 3 dot teks, yang telah ditunjukkan oleh ptr3. Jadi sekali lagi, cukup jelas dan mudah di sini. Tetapi sekarang kita boleh melakukan perkara lain. Kami mempunyai contoh ini kami hanya pergi ke atas kira-kira yang dapat meniru kucing Arahan Linux, salah satu yang mencetak keluar ke skrin. Nah, sekarang kita mempunyai keupayaan untuk membaca aksara dari fail dan menulis aksara untuk fail, mengapa tidak kita hanya menggantikan yang panggilan untuk printf dengan panggilan untuk fputc. Dan sekarang kami telah diulang cp, perintah yang sangat asas Linux yang kita bercakap tentang cara lama lalu di Linux arahan video. Kami telah berkesan diulang bahawa di sini. Kami membaca watak dan kemudian kami bertulis bahawa watak untuk fail lain. Membaca dari satu fail, penulisan yang lain, berulang-ulang dan lagi sehingga kita mencapai EOF. Kita mesti akhir memfailkan kami cuba untuk menyalin dari. Dan dengan itu kita akan telah menulis semua satu watak kita perlu fail yang kita menulis kepada. Jadi ini adalah cp, perintah salinan Linux. Pada awal-awal video ini, saya mempunyai kaveat bahawa kita akan bercakap sedikit sedikit tentang petunjuk. Berikut adalah khusus di mana kita berada akan bercakap tentang petunjuk sebagai tambahan untuk memfailkan petunjuk. Jadi fungsi ini kelihatan jenis menakutkan. Ia mempunyai beberapa parameter. Ada banyak berlaku di sini. Ada banyak yang berbeza warna dan teks. Tetapi sebenarnya, ia hanya versi generik fgetc yang membolehkan kita untuk mendapat apa-apa jumlah maklumat. Ia boleh agak tidak cekap jika kita mendapat aksara satu demi satu, iterating melalui fail satu aksara pada satu masa. Bukankah lebih bagus untuk mendapatkan 100 pada satu masa atau 500 pada satu masa? Nah, fread dan fungsi temannya fwrite, yang kita akan bercakap tentang dalam kedua, membolehkan kita untuk melakukan hal itu. Kita boleh membaca satu jumlah yang sewenang-wenangnya maklumat dari fail dan kami menyimpannya di suatu tempat buat sementara waktu. Bukannya dapat hanya muat dalam pembolehubah tunggal, kita mungkin perlu menyimpannya di dalam array. Dan sebagainya, kita lulus dalam empat hujah untuk fread-- penunjuk ke lokasi di mana kami akan menyimpan maklumat, bagaimana besar setiap unit maklumat akan, berapa unit maklumat kita mahu untuk memperoleh, dan dari mana fail yang kita mahu untuk mendapatkan mereka. Mungkin boleh ditunjukkan dengan jelas dengan contoh di sini. Jadi mari kita mengatakan bahawa kita mengisytiharkan pelbagai 10 integer. Kami baru sahaja diisytiharkan pada stack sewenang-wenangnya int arr 10. Jadi, itu agak mudah. Sekarang apa yang kita lakukan walaupun adalah frecall adalah kita saiz int membaca kali 10 bait maklumat. Saiz int makhluk four-- itulah saiz integer di c. Jadi apa yang kita lakukan adalah kita membaca 40 bait bernilai maklumat dari fail yang ditunjukkan oleh ptr. Dan kami menyimpan orang-orang 40 bait di suatu tempat di mana kita telah mengetepikan 40 bait bernilai memori. Nasib baik, kami telah dibentangkan dengan mengisytiharkan arr, array yang di sana. Yang mampu pegangan 10 unit empat bait. Jadi dalam jumlah, ia boleh tahan 40 bait bernilai maklumat. Dan kita sedang baca 40 bytes maklumat dari fail, dan kami menyimpannya dalam arr. Ingat dari video pada petunjuk yang nama pelbagai, seperti arr, adalah benar-benar hanya penunjuk kepada unsur pertama. Oleh itu, apabila kita lulus dalam arr sana, kami , sebenarnya, lulus dalam penunjuk. Begitu juga kita boleh melakukan this-- kita tidak semestinya perlu untuk menyelamatkan penampan kami pada timbunan. Kita boleh juga dinamik memperuntukkan satu penampan seperti ini, menggunakan malloc. Ingat, apabila kita dinamik memperuntukkan ingatan, kita menyimpannya di timbunan, bukan timbunan. Tetapi ia masih penampan. Ia masih, dalam kes ini, adalah memegang 640 bait maklumat kerana double yang mengambil masa sehingga lapan bait. Dan kami meminta 80 daripada mereka. Kami mahu mempunyai ruang untuk memegang 80 beregu. Jadi 80 kali 8 adalah maklumat 640 bait. Dan panggilan ke fread adalah mengumpul 640 bait maklumat dari fail yang ditunjukkan oleh PTR dan menyimpannya kini dalam arr2. Sekarang kita juga boleh merawat fread seperti panggilan kepada fgetc. Dalam kes ini, kita hanya cuba untuk mendapat satu watak dari fail. Dan kita tidak memerlukan mudah untuk memegang watak. Kita hanya boleh menyimpannya dalam pembolehubah watak. Tangkapan, walaupun, adalah bahawa apabila kita hanya perlu berubah-ubah, kita perlu lulus dalam alamat pembolehubah yang kerana ingat bahawa Hujah pertama untuk fread adalah penunjuk kepada lokasi dan memori di mana kita mahu untuk menyimpan maklumat. Sekali lagi, nama seorang Pelbagai adalah penunjuk. Oleh itu, kita tidak perlu untuk melakukan pelbagai Ampersand. Tetapi c, c watak di sini, tidak array. Ia hanya pembolehubah. Dan dengan itu kita perlu lulus Ampersand c untuk menunjukkan bahawa itulah alamat di mana kita mahu untuk menyimpan ini bait salah satu maklumat, watak ini salah satu yang kita memungut daripada ptr. Fwrite-- saya akan pergi melalui ini sedikit lebih quickly-- adalah lebih kurang bersamaan tepat fread kecuali ia untuk menulis bukannya membaca, hanya seperti other-- kita telah mempunyai terbuka dan dekat, mendapatkan watak, menulis watak. Kini sudah tiba mendapat sewenang-wenangnya jumlah maklumat, jumlah yang sewenang-wenangnya tepat maklumat. Jadi sama seperti sebelum ini, kita boleh mempunyai pelbagai 10 integer di mana kita sudah mempunyai maklumat yang disimpan, mungkin. Ia mungkin beberapa baris kod yang harus pergi di antara kedua-dua di mana saya mengisi arr dengan sesuatu yang bermakna. Saya isi dengan 10 integer berbeza. Dan sebaliknya, apa yang saya lakukan adalah menulis dari arr dan mengumpul maklumat dari arr. Dan saya mengambil maklumat yang dan memasukkannya ke dalam fail. Jadi, daripada ia menjadi dari fail ke penimbal, kita sedang pergi dari penimbal ke fail. Jadi ia hanya sebaliknya. Jadi sekali lagi, sama seperti sebelum ini, kita boleh juga mempunyai sebahagian timbunan memori yang kami telah dinamik diperuntukkan dan membaca itu dan menulis bahawa untuk fail. Dan kami juga mempunyai pembolehubah tunggal mampu memegang satu bait maklumat, seperti watak. Tetapi sekali lagi, kita perlu lulus dalam alamat pembolehubah yang apabila kita mahu membaca daripadanya. Oleh itu, kita boleh menulis maklumat yang kita dapati di alamat itu untuk penunjuk fail, PTR. Ada banyak lain fail yang besar I / O Fungsi yang melakukan pelbagai perkara selain orang-orang yang kita telah bercakap tentang hari ini. Beberapa orang-orang yang anda mungkin dapati berguna adalah fgets dan fputs, yang bersamaan daripada fgetc dan fputc tetapi untuk membaca rentetan tunggal dari fail. Sebaliknya yang bersifat tunggal, ia akan membaca keseluruhan tali. fprintf, yang pada dasarnya membolehkan anda menggunakan printf untuk menulis ke fail. Jadi seperti anda boleh melakukan penggantian pembolehubah menggunakan ruang letak peratus i dan peratus d, dan sebagainya, dengan printf anda sama boleh mengambil rentetan printf dan mencetak sesuatu seperti itu ke fail. fseek-- jika anda mempunyai pemain DVD adalah analogi Saya biasanya menggunakan sini-- adalah jenis seperti menggunakan anda memutar balik dan ke hadapan yang laju butang untuk bergerak filem. Begitu juga, anda boleh bergerak di sekitar fail. Salah satu perkara yang di dalam bahawa struktur fail yang c mencipta untuk anda adalah petunjuk di mana anda berada dalam fail. Adakah anda sekurang- bermula, di bait sifar? Adakah anda di bait 100, bait 1000, dan sebagainya? Anda boleh menggunakan fseek untuk bergerak sewenang-wenangnya petunjuk yang ke hadapan atau ke belakang. Dan ftell, sekali lagi sama dengan pemain DVD, adalah seperti sebuah jam yang cantik yang memberitahu anda berapa minit dan saat anda adalah ke dalam filem tertentu. Begitu juga, ftell memberitahu anda bagaimana banyak bait anda ke dalam fail. feof adalah versi yang berbeza mengesan sama ada anda telah sampai ke penghujung fail. Dan ferror adalah fungsi yang boleh anda gunakan untuk mengesan sama ada sesuatu yang telah pergi kerja kena dengan fail. Sekali lagi, ini adalah hanya menggaru permukaan. Masih banyak lagi fail I / O fungsi dalam io.h. standard Tetapi ini mungkin akan membawa anda mula bekerja dengan petunjuk fail. Saya Doug Lloyd. Ini adalah cs50.