1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [File I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Universitas Harvard] 3 00:00:04,000 --> 00:00:07,000 [Ini adalah CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Ketika kita berpikir tentang sebuah file, apa yang terlintas dalam pikiran adalah dokumen Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 JPEG gambar, atau lagu MP3, 6 00:00:14,000 --> 00:00:17,000 dan kita berinteraksi dengan masing-masing jenis file dengan cara yang berbeda. 7 00:00:17,000 --> 00:00:20,000 Misalnya, dalam dokumen Word kita menambahkan teks 8 00:00:20,000 --> 00:00:24,000 sementara dengan gambar JPEG kita bisa memotong keluar tepi atau retouch warna. 9 00:00:24,000 --> 00:00:28,000 Namun di bawah tenda semua file di komputer kita tidak lebih 10 00:00:28,000 --> 00:00:31,000 dari urutan panjang nol dan satu. 11 00:00:31,000 --> 00:00:33,000 Terserah aplikasi tertentu yang berinteraksi dengan file 12 00:00:33,000 --> 00:00:38,000 untuk memutuskan bagaimana untuk memproses urutan panjang dan menyampaikannya kepada pengguna. 13 00:00:38,000 --> 00:00:41,000 Di satu sisi, dokumen dapat melihat hanya satu byte, 14 00:00:41,000 --> 00:00:45,000 atau 8 angka satu dan nol, dan menampilkan karakter ASCII pada layar. 15 00:00:45,000 --> 00:00:48,000 Di sisi lain, gambar bitmap dapat melihat 3 byte, 16 00:00:48,000 --> 00:00:50,000 atau 24 angka satu dan nol, 17 00:00:50,000 --> 00:00:53,000 dan menafsirkan mereka sebagai 3 angka heksadesimal 18 00:00:53,000 --> 00:00:56,000 yang mewakili nilai-nilai untuk merah, hijau, dan biru 19 00:00:56,000 --> 00:00:58,000 dalam satu pixel dari suatu gambar. 20 00:00:58,000 --> 00:01:01,000 Apapun yang mereka mungkin terlihat seperti di layar Anda, di inti mereka, 21 00:01:01,000 --> 00:01:05,000 file tidak lebih dari urutan nol dan satu. 22 00:01:05,000 --> 00:01:08,000 Jadi mari kita menyelam dalam dan melihat bagaimana kita benar-benar memanipulasi angka satu dan nol 23 00:01:08,000 --> 00:01:12,000 ketika datang untuk menulis dan membaca dari file. 24 00:01:12,000 --> 00:01:15,000 >> Saya akan mulai dengan memecahnya ke dalam suatu proses 3-bagian yang sederhana. 25 00:01:15,000 --> 00:01:19,000 Selanjutnya, saya akan menyelam ke dalam dua contoh kode yang menunjukkan tiga bagian. 26 00:01:19,000 --> 00:01:23,000 Akhirnya, saya akan meninjau proses dan beberapa detail yang paling penting. 27 00:01:23,000 --> 00:01:25,000 Seperti halnya file yang berada pada desktop Anda, 28 00:01:25,000 --> 00:01:28,000 hal pertama yang harus dilakukan adalah untuk membukanya. 29 00:01:28,000 --> 00:01:31,000 Dalam C kita melakukan hal ini dengan menyatakan pointer ke struct standar 30 00:01:31,000 --> 00:01:33,000 yang mewakili sebuah file pada disk. 31 00:01:33,000 --> 00:01:38,460 Dalam pemanggilan fungsi, kami juga memutuskan apakah kita ingin menulis atau membaca dari file. 32 00:01:38,460 --> 00:01:41,660 Selanjutnya, kita melakukan membaca dan menulis yang sebenarnya. 33 00:01:41,660 --> 00:01:44,800 Ada beberapa fungsi khusus dapat kita gunakan dalam bagian ini, 34 00:01:44,800 --> 00:01:48,790 dan hampir semua dari mereka mulai dengan huruf F, yang merupakan singkatan dari file. 35 00:01:48,790 --> 00:01:53,560 Terakhir, mirip dengan X merah kecil di sudut atas dari file terbuka pada komputer Anda, 36 00:01:53,560 --> 00:01:56,680 kita menutup file dengan panggilan fungsi akhir. 37 00:01:56,680 --> 00:01:59,540 Sekarang bahwa kita memiliki gambaran umum tentang apa yang akan kita lakukan, 38 00:01:59,540 --> 00:02:02,000 mari kita menyelam ke dalam kode. 39 00:02:02,000 --> 00:02:06,100 >> Dalam direktori ini, kita memiliki dua file C dan file yang berhubungan executable. 40 00:02:06,100 --> 00:02:09,710 Program Mesin tik mengambil satu argumen baris perintah, 41 00:02:09,710 --> 00:02:12,060 nama dokumen yang ingin kita ciptakan. 42 00:02:12,060 --> 00:02:16,160 Dalam kasus ini, kita akan menyebutnya doc.txt. 43 00:02:16,160 --> 00:02:19,080 Mari kita jalankan program dan masukkan beberapa baris. 44 00:02:19,080 --> 00:02:23,660 Hi. Nama saya adalah Jason. 45 00:02:23,660 --> 00:02:26,710 Akhirnya, kita akan ketik "berhenti." 46 00:02:26,710 --> 00:02:29,720 Jika sekarang kita daftar semua file dalam direktori ini, 47 00:02:29,720 --> 00:02:33,770 kita melihat bahwa dokumen baru eksis disebut doc.txt. 48 00:02:34,190 --> 00:02:36,110 Itulah file program ini baru saja dibuat. 49 00:02:36,110 --> 00:02:40,520 Dan tentu saja, juga tidak lebih dari urutan panjang nol dan satu. 50 00:02:41,100 --> 00:02:43,260 Jika kita membuka file baru, 51 00:02:43,260 --> 00:02:45,870 kita melihat 3 baris kode kami mengadakan program kami - 52 00:02:46,060 --> 00:02:49,060 Hi. Nama Mei adalah Jason. 53 00:02:49,580 --> 00:02:52,090 Tapi apa yang sebenarnya terjadi ketika typewriter.c berjalan? 54 00:02:52,810 --> 00:02:55,520 Baris pertama yang menarik bagi kami adalah baris 24. 55 00:02:55,560 --> 00:02:58,490 Dalam baris ini, kami menyatakan pointer file kita. 56 00:02:59,080 --> 00:03:03,140 Fungsi yang mengembalikan pointer ini, fopen, membutuhkan dua argumen. 57 00:03:03,140 --> 00:03:07,440 Yang pertama adalah nama file termasuk ekstensi file jika sesuai. 58 00:03:07,440 --> 00:03:10,980 Ingatlah bahwa ekstensi file tidak mempengaruhi file pada level terendah. 59 00:03:10,980 --> 00:03:14,640 Kami selalu berhadapan dengan urutan panjang nol dan satu. 60 00:03:14,640 --> 00:03:19,630 Tapi itu tidak mempengaruhi bagaimana file ditafsirkan dan aplikasi apa yang digunakan untuk membukanya. 61 00:03:19,630 --> 00:03:22,290 Argumen kedua fopen adalah satu huruf 62 00:03:22,290 --> 00:03:25,300 yang berdiri untuk apa yang kita rencanakan untuk lakukan setelah kita membuka file tersebut. 63 00:03:25,300 --> 00:03:30,630 Ada tiga pilihan untuk argumen ini - W, R, dan A. 64 00:03:30,630 --> 00:03:34,900 Kami telah memilih w dalam kasus ini karena kita ingin menulis ke file. 65 00:03:34,900 --> 00:03:38,820 R, karena Anda mungkin bisa menebak, adalah untuk membaca ke file. 66 00:03:38,820 --> 00:03:41,760 Dan adalah untuk menambahkan ke file. 67 00:03:41,760 --> 00:03:44,960 Sementara kedua w dan dapat digunakan untuk menulis ke file, 68 00:03:44,960 --> 00:03:47,460 w akan mulai menulis dari awal file 69 00:03:47,460 --> 00:03:50,810 dan berpotensi menghapus semua data yang sebelumnya telah disimpan. 70 00:03:50,810 --> 00:03:54,070 Secara default, file yang kita buka, jika tidak sudah ada, 71 00:03:54,070 --> 00:03:57,180 dibuat dalam direktori saat ini kami bekerja. 72 00:03:57,180 --> 00:04:00,540 Namun, jika kita ingin mengakses atau membuat sebuah file di lokasi yang berbeda, 73 00:04:00,540 --> 00:04:02,650 dalam argumen pertama fopen, 74 00:04:02,650 --> 00:04:05,840 kita dapat menentukan path file di samping nama file. 75 00:04:05,840 --> 00:04:09,490 Sementara bagian pertama dari proses ini adalah hanya satu baris kode yang panjang, 76 00:04:09,490 --> 00:04:12,350 itu selalu praktek yang baik untuk menyertakan satu set baris 77 00:04:12,350 --> 00:04:15,930 yang memeriksa untuk memastikan bahwa file berhasil dibuka atau dibuat. 78 00:04:15,930 --> 00:04:20,300 Jika fopen mengembalikan null, kita tidak ingin untuk maju dengan program kami, 79 00:04:20,300 --> 00:04:23,270 dan ini mungkin terjadi jika sistem operasi kehabisan memori 80 00:04:23,270 --> 00:04:27,940 atau jika kita mencoba untuk membuka file dalam sebuah direktori yang kami tidak memiliki izin yang tepat. 81 00:04:27,940 --> 00:04:31,780 >> Bagian kedua dari proses berlangsung di loop sementara mesin tik. 82 00:04:31,780 --> 00:04:35,000 Kami menggunakan fungsi perpustakaan CS50 untuk mendapatkan masukan dari pengguna, 83 00:04:35,000 --> 00:04:37,190 dan dengan asumsi mereka tidak ingin berhenti program, 84 00:04:37,190 --> 00:04:41,940 kita menggunakan fungsi fputs untuk mengambil string dan menulis ke file. 85 00:04:41,940 --> 00:04:46,700 fputs hanya salah satu dari banyak fungsi yang bisa kita gunakan untuk menulis ke file. 86 00:04:46,700 --> 00:04:51,920 Lainnya termasuk fwrite, fputc, dan bahkan fprintf. 87 00:04:51,920 --> 00:04:54,840 Terlepas dari fungsi tertentu kita akhirnya menggunakan, meskipun, 88 00:04:54,840 --> 00:04:57,480 mereka semua perlu tahu, melalui argumen mereka, 89 00:04:57,480 --> 00:04:59,670 setidaknya dua hal - 90 00:04:59,670 --> 00:05:03,140 apa yang perlu ditulis dan di mana perlu ditulis. 91 00:05:03,140 --> 00:05:07,240 Dalam kasus kami, masukan adalah string yang perlu ditulis 92 00:05:07,240 --> 00:05:11,290 dan fp adalah pointer yang mengarahkan kita di mana kita sedang menulis. 93 00:05:11,290 --> 00:05:15,330 Dalam program ini, bagian kedua dari proses agak mudah. 94 00:05:15,330 --> 00:05:17,360 Kami hanya mengambil string dari pengguna 95 00:05:17,360 --> 00:05:22,120 dan menambahkannya langsung ke file kita dengan sedikit-untuk-tidak validasi input atau pemeriksaan keamanan. 96 00:05:22,120 --> 00:05:26,160 Seringkali, bagaimanapun, bagian kedua akan mengambil sebagian besar kode Anda. 97 00:05:26,160 --> 00:05:30,580 Akhirnya, bagian ketiga adalah on line 58, di mana kita menutup file. 98 00:05:30,580 --> 00:05:34,860 Di sini kita sebut fclose dan menyebarkannya pointer file asli kita. 99 00:05:34,860 --> 00:05:39,500 Pada baris berikutnya, kita kembali nol, menandakan akhir dari program kami. 100 00:05:39,500 --> 00:05:42,630 Dan, ya, bagian tiga adalah sesederhana itu. 101 00:05:42,630 --> 00:05:45,260 >> Mari kita beralih ke membaca dari file. 102 00:05:45,260 --> 00:05:48,220 Kembali di direktori kami kita memiliki sebuah file bernama printer.c. 103 00:05:48,220 --> 00:05:50,910 Mari kita menjalankannya dengan file yang baru kita buat - 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 isi dari file tersebut dikirimkan ke sana. 106 00:05:58,150 --> 00:06:00,230 Dan di sana kita memilikinya. 107 00:06:00,230 --> 00:06:03,780 Baris kode kami telah diketik sebelumnya dan disimpan dalam doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Nama saya adalah 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 melihat bahwa banyak kode terlihat mirip dengan apa yang kita hanya berjalan melalui di typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Memang baris 22, di mana kita membuka file tersebut, 112 00:06:16,720 --> 00:06:19,220 dan garis 39, di mana kami menutup file, 113 00:06:19,220 --> 00:06:23,890 keduanya hampir identik dengan typewriter.c, kecuali argumen fopen kedua. 114 00:06:23,890 --> 00:06:26,510 Kali ini kita membaca dari sebuah file, 115 00:06:26,510 --> 00:06:29,040 jadi kita telah memilih r bukan w. 116 00:06:29,040 --> 00:06:31,950 Jadi, mari kita fokus pada bagian kedua dari proses. 117 00:06:31,950 --> 00:06:36,060 Sejalan 35, sebagai syarat kedua di 4 lingkaran kami, 118 00:06:36,060 --> 00:06:38,590 kita membuat panggilan ke fgets, 119 00:06:38,590 --> 00:06:42,190 fungsi pendamping untuk fputs dari sebelumnya. 120 00:06:42,190 --> 00:06:44,660 Kali ini kami memiliki tiga argumen. 121 00:06:44,660 --> 00:06:48,810 Yang pertama adalah pointer ke array karakter di mana string akan disimpan. 122 00:06:48,810 --> 00:06:52,670 Yang kedua adalah jumlah maksimal karakter untuk dibaca. 123 00:06:52,670 --> 00:06:56,010 Dan yang ketiga adalah pointer ke file yang kita kerjakan. 124 00:06:56,010 --> 00:07:00,780 Anda akan melihat bahwa untuk loop berakhir ketika fgets mengembalikan null. 125 00:07:00,780 --> 00:07:02,940 Ada dua alasan bahwa hal ini mungkin telah terjadi. 126 00:07:02,940 --> 00:07:05,380 Pertama, kesalahan mungkin terjadi. 127 00:07:05,380 --> 00:07:10,740 Kedua, dan lebih mungkin, akhir file tersebut tercapai dan tidak ada lagi karakter yang dibaca. 128 00:07:10,740 --> 00:07:14,040 Dalam kasus Anda bertanya-tanya, dua fungsi memang ada yang memungkinkan kami untuk memberitahu 129 00:07:14,040 --> 00:07:17,160 yang alasannya adalah penyebab ini pointer null tertentu. 130 00:07:17,160 --> 00:07:21,090 Dan, tidak mengherankan, karena mereka harus dilakukan dengan bekerja dengan file, 131 00:07:21,090 --> 00:07:26,940 baik fungsi ferror dan mulai fungsi feof dengan huruf f. 132 00:07:26,940 --> 00:07:32,130 >> Akhirnya, sebelum kita menyimpulkan, satu catatan singkat tentang akhir fungsi file, 133 00:07:32,130 --> 00:07:36,690 yang, seperti yang baru saja disebutkan, ditulis sebagai feof. 134 00:07:36,690 --> 00:07:41,550 Sering kali Anda akan menemukan diri Anda menggunakan sementara dan untuk loop untuk semakin membaca jalan Anda melalui file. 135 00:07:41,550 --> 00:07:45,790 Dengan demikian, Anda akan membutuhkan suatu cara untuk mengakhiri loop ini setelah Anda mencapai akhir dari file-file ini. 136 00:07:45,790 --> 00:07:50,510 Memanggil feof pada pointer file Anda dan memeriksa untuk melihat apakah itu benar 137 00:07:50,510 --> 00:07:52,310 akan melakukan hal itu. 138 00:07:52,310 --> 00:07:59,820 Dengan demikian, loop sementara dengan kondisi (feof (fp)!) Mungkin tampak seperti solusi yang sangat tepat. 139 00:07:59,820 --> 00:08:03,770 Namun, katakanlah kita memiliki satu baris tersisa di file teks kami. 140 00:08:03,770 --> 00:08:07,130 Kami akan masuk ke loop sementara kami dan semuanya akan bekerja seperti yang direncanakan. 141 00:08:07,130 --> 00:08:12,750 Di babak berikutnya melalui, program kami akan memeriksa untuk melihat apakah feof dari fp adalah benar, 142 00:08:12,750 --> 00:08:15,430 tapi - dan ini adalah titik penting untuk dipahami di sini - 143 00:08:15,430 --> 00:08:17,770 itu tidak akan menjadi kenyataan dulu. 144 00:08:17,770 --> 00:08:21,110 Itu karena tujuan feof bukanlah untuk memeriksa 145 00:08:21,110 --> 00:08:24,400 jika panggilan berikutnya ke fungsi membaca akan memukul akhir file, 146 00:08:24,400 --> 00:08:28,190 melainkan untuk memeriksa apakah atau tidak akhir file telah dicapai. 147 00:08:28,190 --> 00:08:30,140 Dalam kasus contoh ini, 148 00:08:30,140 --> 00:08:32,780 membaca baris terakhir file kita berjalan sempurna lancar, 149 00:08:32,780 --> 00:08:36,210 namun program ini belum tahu bahwa kita telah memukul akhir file kami. 150 00:08:36,210 --> 00:08:40,549 Ini tidak sampai melakukan satu membaca tambahan yang counter akhir file. 151 00:08:40,549 --> 00:08:43,210 Dengan demikian, suatu kondisi yang benar akan menjadi sebagai berikut: 152 00:08:43,210 --> 00:08:49,330 fgets dan tiga argumen - output, ukuran output, dan fp - 153 00:08:49,330 --> 00:08:52,570 dan semua itu tidak sama dengan null. 154 00:08:52,570 --> 00:08:55,260 Ini adalah pendekatan yang kami mengambil di printer.c, 155 00:08:55,260 --> 00:08:57,890 dan dalam kasus ini, setelah keluar loop, 156 00:08:57,890 --> 00:09:04,290 Anda bisa menelepon feof atau ferror untuk menginformasikan pengguna untuk alasan tertentu untuk keluar loop ini. 157 00:09:04,290 --> 00:09:08,100 >> Menulis dan membaca dari sebuah file, paling dasar, 158 00:09:08,100 --> 00:09:10,150 proses 3-bagian yang sederhana. 159 00:09:10,150 --> 00:09:12,530 Pertama, kita buka file tersebut. 160 00:09:12,530 --> 00:09:16,740 Kedua, kami menempatkan beberapa hal ke dalam file kami atau mengambil beberapa hal dari itu. 161 00:09:16,740 --> 00:09:19,200 Ketiga, kita menutup file tersebut. 162 00:09:19,200 --> 00:09:21,170 Bagian pertama dan terakhir yang mudah. 163 00:09:21,170 --> 00:09:23,920 Bagian tengah adalah di mana hal-hal yang rumit kebohongan. 164 00:09:23,920 --> 00:09:27,760 Dan meskipun di bawah kap mesin kita selalu berhadapan dengan urutan panjang nol dan satu, 165 00:09:27,760 --> 00:09:30,710 itu tidak membantu ketika coding untuk menambahkan lapisan abstraksi 166 00:09:30,710 --> 00:09:35,350 yang mengubah urutan menjadi sesuatu yang lebih menyerupai apa yang kita digunakan untuk melihat. 167 00:09:35,350 --> 00:09:39,570 Sebagai contoh, jika kita sedang bekerja dengan file bitmap 24-bit, 168 00:09:39,570 --> 00:09:43,290 kita mungkin akan membaca atau menulis tiga byte pada suatu waktu. 169 00:09:43,290 --> 00:09:46,450 Dalam hal ini, akan masuk akal untuk mendefinisikan dan tepat nama 170 00:09:46,450 --> 00:09:48,980 struct yaitu 3 byte besar. 171 00:09:48,980 --> 00:09:51,410 >> Meskipun bekerja dengan file mungkin tampak rumit, 172 00:09:51,410 --> 00:09:54,530 memanfaatkan mereka memungkinkan kita untuk melakukan sesuatu yang benar-benar luar biasa. 173 00:09:54,530 --> 00:09:58,880 Kita bisa mengubah keadaan dunia luar program kami, 174 00:09:58,880 --> 00:10:01,730 kita dapat membuat sesuatu yang hidup di luar kehidupan program kami, 175 00:10:01,730 --> 00:10:07,190 atau kita bahkan dapat mengubah sesuatu yang dibuat sebelum program kami mulai berjalan. 176 00:10:07,190 --> 00:10:11,210 Berinteraksi dengan file adalah bagian yang benar-benar kuat dari pemrograman di C. 177 00:10:11,210 --> 00:10:15,300 dan aku bersemangat untuk melihat apa yang Anda akan membuat dengan itu dalam kode yang 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 >> [Tertawa] 181 00:10:25,940 --> 00:10:29,330 Oke. Satu ambil. Di sini kita pergi. 182 00:10:49,000 --> 00:10:52,140 Ketika kita berpikir tentang file - >> Oh, tunggu. Maaf. 183 00:10:52,140 --> 00:10:56,800 [Tertawa] Oke. 184 00:11:06,620 --> 00:11:09,970 Hey ada. 185 00:11:13,670 --> 00:11:16,310 Ketika kita berpikir tentang file - 186 00:11:17,610 --> 00:11:20,710 Ketika Anda berpikir tentang file - Oke. Beritahu saya bila Anda siap. 187 00:11:20,710 --> 00:11:22,520 Oh, bagus. 188 00:11:22,520 --> 00:11:26,180 Meskipun membaca dari teleprompter mungkin tampak - tidak ada. Saya buruk.