[Powered by Google Translate] [Fail I / O] [Jason Hirschhorn, Universiti Harvard] [Ini adalah CS50, CS50.TV] Apabila kita berfikir tentang fail, apa yang datang ke fikiran adalah dokumen Microsoft Word, imej JPEG, atau sebuah lagu MP3, dan kita berinteraksi dengan setiap jenis fail dengan cara yang berbeza. Sebagai contoh, dalam dokumen Word kita menambah teks manakala dengan imej JPEG kita mungkin timbul keluar tepi atau mengemas warna. Namun di bawah hood semua fail di komputer kita tidak lebih daripada urutan panjang sifar dan orang-orang yang. Ia terpulang kepada permohonan tertentu yang berinteraksi dengan fail untuk memutuskan bagaimana untuk memproses ini urutan panjang dan membentangkan kepada pengguna. Dari satu segi, dokumen boleh melihat pada hanya satu bait, atau 8 sifar dan orang-orang, dan memaparkan aksara ASCII pada skrin. Sebaliknya, imej bitmap mungkin kelihatan pada 3 bait, atau 24 sifar dan orang-orang, dan mentafsir mereka sebagai 3 nombor perenambelasan yang mewakili nilai untuk merah, hijau, dan biru dalam satu pixel imej. Apa sahaja yang mereka mungkin kelihatan seperti di skrin anda, di teras mereka, fail adalah apa yang lebih daripada urutan sifar dan orang-orang. Jadi marilah menyelam dalam dan melihat bagaimana kita sebenarnya memanipulasi sifar dan orang-orang ini apabila ia datang untuk menulis dan membaca dari fail. Saya akan bermula dengan memecahkan ia ke dalam satu proses yang mudah 3-bahagian. Seterusnya, saya akan menyelam ke dalam dua contoh kod yang menunjukkan ketiga-tiga bahagian. Akhirnya, saya akan mengkaji semula proses dan beberapa butir-butir yang paling penting. Seperti dengan sebarang fail yang duduk di desktop anda, Perkara pertama untuk dilakukan ialah untuk membukanya. Dalam C yang kita lakukan ini dengan mengisytiharkan penunjuk struct yang dipratentukan yang mewakili fail pada cakera. Dalam panggilan fungsi ini, kami juga membuat keputusan sama ada kita mahu menulis atau membaca dari fail. Seterusnya, kita melakukan bacaan sebenar dan penulisan. Terdapat beberapa fungsi khusus kita boleh gunakan dalam bahagian ini, dan hampir semua daripada mereka bermula dengan huruf F, yang bermaksud untuk fail. Lepas, serupa dengan X sedikit merah di sudut atas fail-fail dibuka pada komputer anda, kita menutup fail dengan panggilan fungsi akhir. Sekarang bahawa kita mempunyai idea umum apa yang kita hendak lakukan, mari kita menyelam kepada kod. Dalam direktori ini, kita mempunyai dua C fail dan sama fail boleh laku mereka. Program mesin taip mengambil satu baris arahan hujah, nama dokumen itu kita mahu mencipta. Dalam kes ini, kita akan memanggil ia doc.txt. Mari kita menjalankan program dan masukkan beberapa baris. Hi. Nama saya ialah Jason. Akhirnya, kita akan menaip "berhenti." Jika kita kini menyenaraikan semua fail dalam direktori ini, kita lihat bahawa dokumen baru wujud dipanggil doc.txt. Itulah fail program ini hanya dicipta. Dan sudah tentu, ia juga adalah tidak lebih daripada urutan yang panjang sifar dan orang-orang yang. Jika kita membuka fail ini baru, kita lihat 3 baris kod yang kami memasuki program kami - Hi. Nama Mei Jason. Tetapi apa yang sebenarnya berlaku apabila typewriter.c berjalan? Barisan pertama faedah bagi kami adalah baris 24. Di baris ini, kita mengisytiharkan penunjuk fail kami. Fungsi yang mengembalikan penunjuk ini, fopen, mengambil dua hujah. Yang pertama adalah nama fail termasuk lanjutan fail jika sesuai. Ingat bahawa lanjutan fail tidak mempengaruhi fail pada tahap terendah. Kami sentiasa berurusan dengan urutan panjang sifar dan orang-orang yang. Tetapi ia tidak pengaruh bagaimana fail ditafsirkan dan aplikasi apa yang digunakan untuk membuka mereka. Hujah kedua fopen adalah surat tunggal yang berdiri untuk apa yang kita merancang untuk lakukan selepas kita membuka fail. Terdapat tiga pilihan untuk hujah ini - W, R, dan A. Kami telah memilih w dalam kes ini kerana kita mahu untuk menulis ke fail. R, seperti yang anda mungkin boleh meneka, adalah untuk membaca fail. Dan adalah untuk appending ke fail. Walaupun kedua-dua w dan boleh digunakan untuk menulis kepada fail, w akan mula menulis dari awal fail dan berpotensi overwrite sebarang data yang telah sebelum ini telah disimpan. Secara lalai, fail kita membuka, jika ia tidak sudah wujud, dicipta dalam direktori semasa kita bekerja. Walau bagaimanapun, jika kita mahu mengakses atau mencipta fail dalam lokasi yang berbeza, dalam hujah pertama fopen, kita boleh menentukan laluan fail di samping nama fail. Walaupun bahagian pertama proses ini adalah hanya satu baris kod lama, ia sentiasa amalan yang baik untuk memasukkan satu lagi set garisan bahawa daftar untuk memastikan bahawa fail telah berjaya dibuka atau dicipta. Jika fopen mengembalikan null, kita tidak mahu melangkah ke hadapan dengan program kami, dan ini boleh berlaku jika sistem operasi adalah daripada ingatan atau jika kita cuba membuka fail dalam direktori yang mana kita tidak mempunyai kebenaran yang betul. Bahagian dua proses berlaku dalam gelung sementara mesin taip. Kami menggunakan fungsi CS50 perpustakaan untuk mendapatkan input dari pengguna, dan menganggap mereka tidak mahu untuk berhenti program ini, kita menggunakan fputs fungsi untuk mengambil tali dan menulis ke fail. fputs adalah hanya salah satu daripada banyak fungsi yang kita boleh gunakan untuk menulis ke fail. Lain-lain termasuk fwrite, fputc, dan walaupun fprintf. Tanpa mengira fungsi tertentu, kita akhirnya menggunakan, walaupun, mereka semua perlu tahu, melalui hujah-hujah mereka, sekurang-kurangnya dua perkara - apa yang perlu ditulis dan di mana ia perlu ditulis untuk. Dalam kes kami, input adalah rentetan yang perlu ditulis dan fp adalah penunjuk yang mengarahkan kita ke mana kita menulis. Dalam program ini, bahagian dua proses agak mudah. Kami hanya mengambil rentetan daripada pengguna dan menambah ia secara langsung ke fail kami dengan sedikit-ke-tiada input validasi atau pemeriksaan keselamatan. Selalunya, bagaimanapun, dua bahagian akan mengambil sebahagian besar kod anda. Akhirnya, sebahagian ketiga adalah mengenai 58 baris, di mana kita menutup fail. Sini kita panggil fclose dan lulus penunjuk fail asal kita. Dalam baris berikutnya, kita kembali sifar, menandakan berakhirnya program kami. Dan, ya, bahagian ketiga adalah semudah itu. Mari kita bergerak untuk membaca dari fail. Kembali dalam direktori kami, kami mempunyai fail yang dipanggil printer.c. Mari kita jalankan ia dengan fail kita hanya mencipta - doc.txt. Program ini, seperti namanya, hanya akan mencetak kandungan fail tersebut diserahkan kepadanya. Dan ada kita mempunyai. Baris kod kita telah ditaip awal dan disimpan dalam doc.txt. Hi. Nama saya ialah Jason. Jika kita menyelam ke printer.c, kita lihat bahawa banyak kod kelihatan serupa dengan apa yang kita hanya berjalan melalui typewriter.c. Sesungguhnya baris 22, di mana kita membuka fail, dan baris 39, di mana kita menutup fail, kedua-duanya adalah hampir sama dengan typewriter.c, menjimatkan untuk perdebatan fopen kedua. Kali ini kita membaca dari fail, jadi kami telah memilih r bukannya w. Oleh itu, marilah kita memberi tumpuan kepada bahagian kedua proses. Dalam baris 35, sebagai syarat kedua dalam gelung 4, kita membuat panggilan fgets, fungsi sahabat fputs dari sebelum. Kali ini kita mempunyai tiga hujah. Yang pertama ialah penunjuk kepada pelbagai watak di mana tali akan disimpan. Yang kedua adalah bilangan maksimum aksara untuk dibaca. Dan ketiga ialah penunjuk kepada fail yang kita sedang bekerja. Anda akan melihat bahawa untuk gelung berakhir apabila fgets mengembalikan null. Terdapat dua sebab yang ini mungkin telah berlaku. Pertama, ralat mungkin telah berlaku. Kedua, dan lebih berkemungkinan, akhir fail dicapai dan tiada lagi watak membaca. Dalam kes anda tertanya-tanya, dua fungsi memang wujud yang membolehkan kita untuk memberitahu sebab yang adalah punca bagi penunjuk batal ini tertentu. Dan, tidak menghairankan, kerana mereka mempunyai kaitan dengan bekerja dengan fail, kedua-dua fungsi ferror dan permulaan feof fungsi dengan huruf f. Akhirnya, sebelum kita membuat kesimpulan, satu nota ringkas tentang akhir fungsi fail, yang, seperti yang hanya disebut, ditulis sebagai feof. Selalunya anda akan mendapati diri anda menggunakan manakala untuk gelung progresif membaca cara anda melalui fail. Oleh itu, anda akan memerlukan satu cara untuk menamatkan gelung ini selepas anda mencapai akhir fail-fail ini. Memanggil feof pada penunjuk fail anda dan memeriksa untuk melihat jika ia benar akan berbuat demikian. Oleh itu, gelung sementara dengan keadaan (! Feof (fp)) mungkin kelihatan seperti penyelesaian yang sempurna yang sesuai. Walau bagaimanapun, katakan kita mempunyai satu baris kiri dalam fail teks kami. Kami akan memasukkan gelung sementara kita dan semuanya akan berjalan lancar seperti yang dirancang. Pada pusingan seterusnya melalui, program kami akan memeriksa untuk melihat jika feof fp adalah benar, tetapi - dan ini adalah titik penting untuk memahami di sini - ia tidak akan menjadi benar hanya lagi. Itu kerana tujuan feof tidak adalah untuk menyemak jika panggilan seterusnya kepada fungsi membaca akan melanda akhir fail, tetapi untuk memeriksa sama ada atau tidak akhir fail telah tercapai. Dalam kes contoh ini, membaca baris terakhir fail kami pergi dengan sempurna dengan lancar, tetapi program ini tidak lagi tahu bahawa kita telah melanda akhir fail kami. Ia bukan sehingga ia tidak salah membaca tambahan bahawa ia kaunter akhir fail. Oleh itu, satu keadaan yang betul akan menjadi berikut: fgets dan hujah tiga - output, saiz output, dan fp - dan semua yang tidak sama untuk menyeimbangkan. Ini adalah pendekatan kita mengambil dalam printer.c, dan dalam kes ini, selepas keluar gelung, anda boleh memanggil feof atau ferror untuk memaklumkan pengguna kepada pertimbangan khusus untuk keluar gelung ini. Menulis dan membaca dari fail adalah, yang paling asas, 3-bahagian proses yang mudah. Pertama, kita membuka fail tersebut. Kedua, kita meletakkan beberapa perkara ke dalam fail kami atau mengambil beberapa perkara daripada itu. Ketiga, kita menutup fail. Bahagian pertama dan terakhir mudah. Bahagian tengah adalah mana barangan rumit terletak. Dan walaupun di bawah hood kita sentiasa berurusan dengan urutan panjang sifar dan orang-orang, ia tidak membantu apabila pengekodan untuk menambah lapisan abstraksi yang bertukar urutan ke dalam sesuatu yang lebih hampir menyerupai apa yang kita digunakan untuk melihat. Sebagai contoh, jika kita sedang bekerja dengan fail bitmap 24-bit, kita mungkin akan membaca atau menulis tiga bait pada satu-satu masa. Di mana, ia akan masuk akal untuk menentukan dan sewajarnya menamakan struct yang 3 bytes besar. Walaupun bekerja dengan fail mungkin kelihatan rumit, menggunakan mereka membolehkan kita untuk melakukan sesuatu yang benar-benar luar biasa. Kita boleh mengubah keadaan dunia luar program kami, kita boleh mencipta sesuatu yang tinggal di luar kehidupan program kami, atau kita juga boleh mengubah sesuatu yang telah diwujudkan sebelum program kami mula berjalan. Berinteraksi dengan fail adalah sebahagian yang benar-benar kuat pengaturcaraan C. dan saya teruja untuk melihat apa yang anda akan buat dengan dalam kod akan datang. Nama saya Jason Hirschhorn. Ini adalah CS50. [CS50.TV] [Ketawa] Okay. Satu mengambil. Di sini kita pergi. Apabila kita berfikir tentang fail - >> Oh, tunggu. Maaf. [Ketawa] Okay. Hey there. Apabila kita berfikir tentang fail - Apabila anda berfikir fail - Okay. Beritahu saya apabila anda sudah bersedia. Oh, hebat. Walaupun membaca dari teleprompter mungkin kelihatan - tidak. Saya buruk.