1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Fail I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Universiti Harvard] 3 00:00:04,000 --> 00:00:07,000 [Ini adalah CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Apabila kita berfikir tentang fail, apa yang datang ke fikiran adalah dokumen Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 imej JPEG, atau sebuah lagu MP3, 6 00:00:14,000 --> 00:00:17,000 dan kita berinteraksi dengan setiap jenis fail dengan cara yang berbeza. 7 00:00:17,000 --> 00:00:20,000 Sebagai contoh, dalam dokumen Word kita menambah teks 8 00:00:20,000 --> 00:00:24,000 manakala dengan imej JPEG kita mungkin timbul keluar tepi atau mengemas warna. 9 00:00:24,000 --> 00:00:28,000 Namun di bawah hood semua fail di komputer kita tidak lebih 10 00:00:28,000 --> 00:00:31,000 daripada urutan panjang sifar dan orang-orang yang. 11 00:00:31,000 --> 00:00:33,000 Ia terpulang kepada permohonan tertentu yang berinteraksi dengan fail 12 00:00:33,000 --> 00:00:38,000 untuk memutuskan bagaimana untuk memproses ini urutan panjang dan membentangkan kepada pengguna. 13 00:00:38,000 --> 00:00:41,000 Dari satu segi, dokumen boleh melihat pada hanya satu bait, 14 00:00:41,000 --> 00:00:45,000 atau 8 sifar dan orang-orang, dan memaparkan aksara ASCII pada skrin. 15 00:00:45,000 --> 00:00:48,000 Sebaliknya, imej bitmap mungkin kelihatan pada 3 bait, 16 00:00:48,000 --> 00:00:50,000 atau 24 sifar dan orang-orang, 17 00:00:50,000 --> 00:00:53,000 dan mentafsir mereka sebagai 3 nombor perenambelasan 18 00:00:53,000 --> 00:00:56,000 yang mewakili nilai untuk merah, hijau, dan biru 19 00:00:56,000 --> 00:00:58,000 dalam satu pixel imej. 20 00:00:58,000 --> 00:01:01,000 Apa sahaja yang mereka mungkin kelihatan seperti di skrin anda, di teras mereka, 21 00:01:01,000 --> 00:01:05,000 fail adalah apa yang lebih daripada urutan sifar dan orang-orang. 22 00:01:05,000 --> 00:01:08,000 Jadi marilah menyelam dalam dan melihat bagaimana kita sebenarnya memanipulasi sifar dan orang-orang ini 23 00:01:08,000 --> 00:01:12,000 apabila ia datang untuk menulis dan membaca dari fail. 24 00:01:12,000 --> 00:01:15,000 >> Saya akan bermula dengan memecahkan ia ke dalam satu proses yang mudah 3-bahagian. 25 00:01:15,000 --> 00:01:19,000 Seterusnya, saya akan menyelam ke dalam dua contoh kod yang menunjukkan ketiga-tiga bahagian. 26 00:01:19,000 --> 00:01:23,000 Akhirnya, saya akan mengkaji semula proses dan beberapa butir-butir yang paling penting. 27 00:01:23,000 --> 00:01:25,000 Seperti dengan sebarang fail yang duduk di desktop anda, 28 00:01:25,000 --> 00:01:28,000 Perkara pertama untuk dilakukan ialah untuk membukanya. 29 00:01:28,000 --> 00:01:31,000 Dalam C yang kita lakukan ini dengan mengisytiharkan penunjuk struct yang dipratentukan 30 00:01:31,000 --> 00:01:33,000 yang mewakili fail pada cakera. 31 00:01:33,000 --> 00:01:38,460 Dalam panggilan fungsi ini, kami juga membuat keputusan sama ada kita mahu menulis atau membaca dari fail. 32 00:01:38,460 --> 00:01:41,660 Seterusnya, kita melakukan bacaan sebenar dan penulisan. 33 00:01:41,660 --> 00:01:44,800 Terdapat beberapa fungsi khusus kita boleh gunakan dalam bahagian ini, 34 00:01:44,800 --> 00:01:48,790 dan hampir semua daripada mereka bermula dengan huruf F, yang bermaksud untuk fail. 35 00:01:48,790 --> 00:01:53,560 Lepas, serupa dengan X sedikit merah di sudut atas fail-fail dibuka pada komputer anda, 36 00:01:53,560 --> 00:01:56,680 kita menutup fail dengan panggilan fungsi akhir. 37 00:01:56,680 --> 00:01:59,540 Sekarang bahawa kita mempunyai idea umum apa yang kita hendak lakukan, 38 00:01:59,540 --> 00:02:02,000 mari kita menyelam kepada kod. 39 00:02:02,000 --> 00:02:06,100 >> Dalam direktori ini, kita mempunyai dua C fail dan sama fail boleh laku mereka. 40 00:02:06,100 --> 00:02:09,710 Program mesin taip mengambil satu baris arahan hujah, 41 00:02:09,710 --> 00:02:12,060 nama dokumen itu kita mahu mencipta. 42 00:02:12,060 --> 00:02:16,160 Dalam kes ini, kita akan memanggil ia doc.txt. 43 00:02:16,160 --> 00:02:19,080 Mari kita menjalankan program dan masukkan beberapa baris. 44 00:02:19,080 --> 00:02:23,660 Hi. Nama saya ialah Jason. 45 00:02:23,660 --> 00:02:26,710 Akhirnya, kita akan menaip "berhenti." 46 00:02:26,710 --> 00:02:29,720 Jika kita kini menyenaraikan semua fail dalam direktori ini, 47 00:02:29,720 --> 00:02:33,770 kita lihat bahawa dokumen baru wujud dipanggil doc.txt. 48 00:02:34,190 --> 00:02:36,110 Itulah fail program ini hanya dicipta. 49 00:02:36,110 --> 00:02:40,520 Dan sudah tentu, ia juga adalah tidak lebih daripada urutan yang panjang sifar dan orang-orang yang. 50 00:02:41,100 --> 00:02:43,260 Jika kita membuka fail ini baru, 51 00:02:43,260 --> 00:02:45,870 kita lihat 3 baris kod yang kami memasuki program kami - 52 00:02:46,060 --> 00:02:49,060 Hi. Nama Mei Jason. 53 00:02:49,580 --> 00:02:52,090 Tetapi apa yang sebenarnya berlaku apabila typewriter.c berjalan? 54 00:02:52,810 --> 00:02:55,520 Barisan pertama faedah bagi kami adalah baris 24. 55 00:02:55,560 --> 00:02:58,490 Di baris ini, kita mengisytiharkan penunjuk fail kami. 56 00:02:59,080 --> 00:03:03,140 Fungsi yang mengembalikan penunjuk ini, fopen, mengambil dua hujah. 57 00:03:03,140 --> 00:03:07,440 Yang pertama adalah nama fail termasuk lanjutan fail jika sesuai. 58 00:03:07,440 --> 00:03:10,980 Ingat bahawa lanjutan fail tidak mempengaruhi fail pada tahap terendah. 59 00:03:10,980 --> 00:03:14,640 Kami sentiasa berurusan dengan urutan panjang sifar dan orang-orang yang. 60 00:03:14,640 --> 00:03:19,630 Tetapi ia tidak pengaruh bagaimana fail ditafsirkan dan aplikasi apa yang digunakan untuk membuka mereka. 61 00:03:19,630 --> 00:03:22,290 Hujah kedua fopen adalah surat tunggal 62 00:03:22,290 --> 00:03:25,300 yang berdiri untuk apa yang kita merancang untuk lakukan selepas kita membuka fail. 63 00:03:25,300 --> 00:03:30,630 Terdapat tiga pilihan untuk hujah ini - W, R, dan A. 64 00:03:30,630 --> 00:03:34,900 Kami telah memilih w dalam kes ini kerana kita mahu untuk menulis ke fail. 65 00:03:34,900 --> 00:03:38,820 R, seperti yang anda mungkin boleh meneka, adalah untuk membaca fail. 66 00:03:38,820 --> 00:03:41,760 Dan adalah untuk appending ke fail. 67 00:03:41,760 --> 00:03:44,960 Walaupun kedua-dua w dan boleh digunakan untuk menulis kepada fail, 68 00:03:44,960 --> 00:03:47,460 w akan mula menulis dari awal fail 69 00:03:47,460 --> 00:03:50,810 dan berpotensi overwrite sebarang data yang telah sebelum ini telah disimpan. 70 00:03:50,810 --> 00:03:54,070 Secara lalai, fail kita membuka, jika ia tidak sudah wujud, 71 00:03:54,070 --> 00:03:57,180 dicipta dalam direktori semasa kita bekerja. 72 00:03:57,180 --> 00:04:00,540 Walau bagaimanapun, jika kita mahu mengakses atau mencipta fail dalam lokasi yang berbeza, 73 00:04:00,540 --> 00:04:02,650 dalam hujah pertama fopen, 74 00:04:02,650 --> 00:04:05,840 kita boleh menentukan laluan fail di samping nama fail. 75 00:04:05,840 --> 00:04:09,490 Walaupun bahagian pertama proses ini adalah hanya satu baris kod lama, 76 00:04:09,490 --> 00:04:12,350 ia sentiasa amalan yang baik untuk memasukkan satu lagi set garisan 77 00:04:12,350 --> 00:04:15,930 bahawa daftar untuk memastikan bahawa fail telah berjaya dibuka atau dicipta. 78 00:04:15,930 --> 00:04:20,300 Jika fopen mengembalikan null, kita tidak mahu melangkah ke hadapan dengan program kami, 79 00:04:20,300 --> 00:04:23,270 dan ini boleh berlaku jika sistem operasi adalah daripada ingatan 80 00:04:23,270 --> 00:04:27,940 atau jika kita cuba membuka fail dalam direktori yang mana kita tidak mempunyai kebenaran yang betul. 81 00:04:27,940 --> 00:04:31,780 >> Bahagian dua proses berlaku dalam gelung sementara mesin taip. 82 00:04:31,780 --> 00:04:35,000 Kami menggunakan fungsi CS50 perpustakaan untuk mendapatkan input dari pengguna, 83 00:04:35,000 --> 00:04:37,190 dan menganggap mereka tidak mahu untuk berhenti program ini, 84 00:04:37,190 --> 00:04:41,940 kita menggunakan fputs fungsi untuk mengambil tali dan menulis ke fail. 85 00:04:41,940 --> 00:04:46,700 fputs adalah hanya salah satu daripada banyak fungsi yang kita boleh gunakan untuk menulis ke fail. 86 00:04:46,700 --> 00:04:51,920 Lain-lain termasuk fwrite, fputc, dan walaupun fprintf. 87 00:04:51,920 --> 00:04:54,840 Tanpa mengira fungsi tertentu, kita akhirnya menggunakan, walaupun, 88 00:04:54,840 --> 00:04:57,480 mereka semua perlu tahu, melalui hujah-hujah mereka, 89 00:04:57,480 --> 00:04:59,670 sekurang-kurangnya dua perkara - 90 00:04:59,670 --> 00:05:03,140 apa yang perlu ditulis dan di mana ia perlu ditulis untuk. 91 00:05:03,140 --> 00:05:07,240 Dalam kes kami, input adalah rentetan yang perlu ditulis 92 00:05:07,240 --> 00:05:11,290 dan fp adalah penunjuk yang mengarahkan kita ke mana kita menulis. 93 00:05:11,290 --> 00:05:15,330 Dalam program ini, bahagian dua proses agak mudah. 94 00:05:15,330 --> 00:05:17,360 Kami hanya mengambil rentetan daripada pengguna 95 00:05:17,360 --> 00:05:22,120 dan menambah ia secara langsung ke fail kami dengan sedikit-ke-tiada input validasi atau pemeriksaan keselamatan. 96 00:05:22,120 --> 00:05:26,160 Selalunya, bagaimanapun, dua bahagian akan mengambil sebahagian besar kod anda. 97 00:05:26,160 --> 00:05:30,580 Akhirnya, sebahagian ketiga adalah mengenai 58 baris, di mana kita menutup fail. 98 00:05:30,580 --> 00:05:34,860 Sini kita panggil fclose dan lulus penunjuk fail asal kita. 99 00:05:34,860 --> 00:05:39,500 Dalam baris berikutnya, kita kembali sifar, menandakan berakhirnya program kami. 100 00:05:39,500 --> 00:05:42,630 Dan, ya, bahagian ketiga adalah semudah itu. 101 00:05:42,630 --> 00:05:45,260 >> Mari kita bergerak untuk membaca dari fail. 102 00:05:45,260 --> 00:05:48,220 Kembali dalam direktori kami, kami mempunyai fail yang dipanggil printer.c. 103 00:05:48,220 --> 00:05:50,910 Mari kita jalankan ia dengan fail kita hanya mencipta - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Program ini, seperti namanya, hanya akan mencetak kandungan fail tersebut diserahkan kepadanya. 106 00:05:58,150 --> 00:06:00,230 Dan ada kita mempunyai. 107 00:06:00,230 --> 00:06:03,780 Baris kod kita telah ditaip awal dan disimpan dalam doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Nama saya ialah Jason. 109 00:06:06,980 --> 00:06:09,120 Jika kita menyelam ke printer.c, 110 00:06:09,120 --> 00:06:13,570 kita lihat bahawa banyak kod kelihatan serupa dengan apa yang kita hanya berjalan melalui typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Sesungguhnya baris 22, di mana kita membuka fail, 112 00:06:16,720 --> 00:06:19,220 dan baris 39, di mana kita menutup fail, 113 00:06:19,220 --> 00:06:23,890 kedua-duanya adalah hampir sama dengan typewriter.c, menjimatkan untuk perdebatan fopen kedua. 114 00:06:23,890 --> 00:06:26,510 Kali ini kita membaca dari fail, 115 00:06:26,510 --> 00:06:29,040 jadi kami telah memilih r bukannya w. 116 00:06:29,040 --> 00:06:31,950 Oleh itu, marilah kita memberi tumpuan kepada bahagian kedua proses. 117 00:06:31,950 --> 00:06:36,060 Dalam baris 35, sebagai syarat kedua dalam gelung 4, 118 00:06:36,060 --> 00:06:38,590 kita membuat panggilan fgets, 119 00:06:38,590 --> 00:06:42,190 fungsi sahabat fputs dari sebelum. 120 00:06:42,190 --> 00:06:44,660 Kali ini kita mempunyai tiga hujah. 121 00:06:44,660 --> 00:06:48,810 Yang pertama ialah penunjuk kepada pelbagai watak di mana tali akan disimpan. 122 00:06:48,810 --> 00:06:52,670 Yang kedua adalah bilangan maksimum aksara untuk dibaca. 123 00:06:52,670 --> 00:06:56,010 Dan ketiga ialah penunjuk kepada fail yang kita sedang bekerja. 124 00:06:56,010 --> 00:07:00,780 Anda akan melihat bahawa untuk gelung berakhir apabila fgets mengembalikan null. 125 00:07:00,780 --> 00:07:02,940 Terdapat dua sebab yang ini mungkin telah berlaku. 126 00:07:02,940 --> 00:07:05,380 Pertama, ralat mungkin telah berlaku. 127 00:07:05,380 --> 00:07:10,740 Kedua, dan lebih berkemungkinan, akhir fail dicapai dan tiada lagi watak membaca. 128 00:07:10,740 --> 00:07:14,040 Dalam kes anda tertanya-tanya, dua fungsi memang wujud yang membolehkan kita untuk memberitahu 129 00:07:14,040 --> 00:07:17,160 sebab yang adalah punca bagi penunjuk batal ini tertentu. 130 00:07:17,160 --> 00:07:21,090 Dan, tidak menghairankan, kerana mereka mempunyai kaitan dengan bekerja dengan fail, 131 00:07:21,090 --> 00:07:26,940 kedua-dua fungsi ferror dan permulaan feof fungsi dengan huruf f. 132 00:07:26,940 --> 00:07:32,130 >> Akhirnya, sebelum kita membuat kesimpulan, satu nota ringkas tentang akhir fungsi fail, 133 00:07:32,130 --> 00:07:36,690 yang, seperti yang hanya disebut, ditulis sebagai feof. 134 00:07:36,690 --> 00:07:41,550 Selalunya anda akan mendapati diri anda menggunakan manakala untuk gelung progresif membaca cara anda melalui fail. 135 00:07:41,550 --> 00:07:45,790 Oleh itu, anda akan memerlukan satu cara untuk menamatkan gelung ini selepas anda mencapai akhir fail-fail ini. 136 00:07:45,790 --> 00:07:50,510 Memanggil feof pada penunjuk fail anda dan memeriksa untuk melihat jika ia benar 137 00:07:50,510 --> 00:07:52,310 akan berbuat demikian. 138 00:07:52,310 --> 00:07:59,820 Oleh itu, gelung sementara dengan keadaan (! Feof (fp)) mungkin kelihatan seperti penyelesaian yang sempurna yang sesuai. 139 00:07:59,820 --> 00:08:03,770 Walau bagaimanapun, katakan kita mempunyai satu baris kiri dalam fail teks kami. 140 00:08:03,770 --> 00:08:07,130 Kami akan memasukkan gelung sementara kita dan semuanya akan berjalan lancar seperti yang dirancang. 141 00:08:07,130 --> 00:08:12,750 Pada pusingan seterusnya melalui, program kami akan memeriksa untuk melihat jika feof fp adalah benar, 142 00:08:12,750 --> 00:08:15,430 tetapi - dan ini adalah titik penting untuk memahami di sini - 143 00:08:15,430 --> 00:08:17,770 ia tidak akan menjadi benar hanya lagi. 144 00:08:17,770 --> 00:08:21,110 Itu kerana tujuan feof tidak adalah untuk menyemak 145 00:08:21,110 --> 00:08:24,400 jika panggilan seterusnya kepada fungsi membaca akan melanda akhir fail, 146 00:08:24,400 --> 00:08:28,190 tetapi untuk memeriksa sama ada atau tidak akhir fail telah tercapai. 147 00:08:28,190 --> 00:08:30,140 Dalam kes contoh ini, 148 00:08:30,140 --> 00:08:32,780 membaca baris terakhir fail kami pergi dengan sempurna dengan lancar, 149 00:08:32,780 --> 00:08:36,210 tetapi program ini tidak lagi tahu bahawa kita telah melanda akhir fail kami. 150 00:08:36,210 --> 00:08:40,549 Ia bukan sehingga ia tidak salah membaca tambahan bahawa ia kaunter akhir fail. 151 00:08:40,549 --> 00:08:43,210 Oleh itu, satu keadaan yang betul akan menjadi berikut: 152 00:08:43,210 --> 00:08:49,330 fgets dan hujah tiga - output, saiz output, dan fp - 153 00:08:49,330 --> 00:08:52,570 dan semua yang tidak sama untuk menyeimbangkan. 154 00:08:52,570 --> 00:08:55,260 Ini adalah pendekatan kita mengambil dalam printer.c, 155 00:08:55,260 --> 00:08:57,890 dan dalam kes ini, selepas keluar gelung, 156 00:08:57,890 --> 00:09:04,290 anda boleh memanggil feof atau ferror untuk memaklumkan pengguna kepada pertimbangan khusus untuk keluar gelung ini. 157 00:09:04,290 --> 00:09:08,100 >> Menulis dan membaca dari fail adalah, yang paling asas, 158 00:09:08,100 --> 00:09:10,150 3-bahagian proses yang mudah. 159 00:09:10,150 --> 00:09:12,530 Pertama, kita membuka fail tersebut. 160 00:09:12,530 --> 00:09:16,740 Kedua, kita meletakkan beberapa perkara ke dalam fail kami atau mengambil beberapa perkara daripada itu. 161 00:09:16,740 --> 00:09:19,200 Ketiga, kita menutup fail. 162 00:09:19,200 --> 00:09:21,170 Bahagian pertama dan terakhir mudah. 163 00:09:21,170 --> 00:09:23,920 Bahagian tengah adalah mana barangan rumit terletak. 164 00:09:23,920 --> 00:09:27,760 Dan walaupun di bawah hood kita sentiasa berurusan dengan urutan panjang sifar dan orang-orang, 165 00:09:27,760 --> 00:09:30,710 ia tidak membantu apabila pengekodan untuk menambah lapisan abstraksi 166 00:09:30,710 --> 00:09:35,350 yang bertukar urutan ke dalam sesuatu yang lebih hampir menyerupai apa yang kita digunakan untuk melihat. 167 00:09:35,350 --> 00:09:39,570 Sebagai contoh, jika kita sedang bekerja dengan fail bitmap 24-bit, 168 00:09:39,570 --> 00:09:43,290 kita mungkin akan membaca atau menulis tiga bait pada satu-satu masa. 169 00:09:43,290 --> 00:09:46,450 Di mana, ia akan masuk akal untuk menentukan dan sewajarnya menamakan 170 00:09:46,450 --> 00:09:48,980 struct yang 3 bytes besar. 171 00:09:48,980 --> 00:09:51,410 >> Walaupun bekerja dengan fail mungkin kelihatan rumit, 172 00:09:51,410 --> 00:09:54,530 menggunakan mereka membolehkan kita untuk melakukan sesuatu yang benar-benar luar biasa. 173 00:09:54,530 --> 00:09:58,880 Kita boleh mengubah keadaan dunia luar program kami, 174 00:09:58,880 --> 00:10:01,730 kita boleh mencipta sesuatu yang tinggal di luar kehidupan program kami, 175 00:10:01,730 --> 00:10:07,190 atau kita juga boleh mengubah sesuatu yang telah diwujudkan sebelum program kami mula berjalan. 176 00:10:07,190 --> 00:10:11,210 Berinteraksi dengan fail adalah sebahagian yang benar-benar kuat pengaturcaraan C. 177 00:10:11,210 --> 00:10:15,300 dan saya teruja untuk melihat apa yang anda akan buat dengan dalam kod akan datang. 178 00:10:15,300 --> 00:10:19,770 Nama saya Jason Hirschhorn. Ini adalah CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Ketawa] 181 00:10:25,940 --> 00:10:29,330 Okay. Satu mengambil. Di sini kita pergi. 182 00:10:49,000 --> 00:10:52,140 Apabila kita berfikir tentang fail - >> Oh, tunggu. Maaf. 183 00:10:52,140 --> 00:10:56,800 [Ketawa] Okay. 184 00:11:06,620 --> 00:11:09,970 Hey there. 185 00:11:13,670 --> 00:11:16,310 Apabila kita berfikir tentang fail - 186 00:11:17,610 --> 00:11:20,710 Apabila anda berfikir fail - Okay. Beritahu saya apabila anda sudah bersedia. 187 00:11:20,710 --> 00:11:22,520 Oh, hebat. 188 00:11:22,520 --> 00:11:26,180 Walaupun membaca dari teleprompter mungkin kelihatan - tidak. Saya buruk.