1 00:00:00,000 --> 00:00:09,780 >> [MUSIC PLAYING] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Mari kita mengatasi pulih. 3 00:00:11,150 --> 00:00:14,030 Recover mungkin PSET favorit saya, dan terutama karena saya pikir itu 4 00:00:14,030 --> 00:00:15,650 benar-benar, benar-benar keren. 5 00:00:15,650 --> 00:00:19,040 Pada dasarnya, Anda diberi memori File kartu di mana 6 00:00:19,040 --> 00:00:20,900 gambar telah dihapus. 7 00:00:20,900 --> 00:00:23,650 Tapi apa Anda akan lakukan adalah memulihkan mereka semua. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Jadi itu benar-benar menarik, tapi mungkin sedikit menakutkan, karena kau 10 00:00:28,230 --> 00:00:32,430 diberikan file C kosong dan Anda harus mengisi masuk 11 00:00:32,430 --> 00:00:36,250 OK, jadi mari kita istirahat ini menjadi bagian-bagian dikelola. 12 00:00:36,250 --> 00:00:38,160 Anda akan ingin membuka File kartu memori. 13 00:00:38,160 --> 00:00:39,900 Tampaknya cukup sederhana. 14 00:00:39,900 --> 00:00:43,030 Kemudian, cari awal dari gambar JPG. 15 00:00:43,030 --> 00:00:46,740 Semua file di memori ini kartu akan menjadi JPGs. 16 00:00:46,740 --> 00:00:50,840 Kemudian, setelah Anda menemukan awal, Anda akan membuka JPG baru, yang 17 00:00:50,840 --> 00:00:57,610 adalah, seperti, membuat JPG, dan menulis 512 byte pada suatu waktu sampai JPG baru 18 00:00:57,610 --> 00:01:02,930 ditemukan, dan mengakhiri program, setelah Anda mendeteksi akhir file. 19 00:01:02,930 --> 00:01:06,400 >> Jadi langkah pertama pertama adalah untuk membuka file kartu memori. 20 00:01:06,400 --> 00:01:09,850 Tapi kau tahu ini sudah, dan ada file I / O fungsi yang akan 21 00:01:09,850 --> 00:01:12,030 terbukti sangat berguna. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Jadi apa yang JPGs? 24 00:01:14,760 --> 00:01:16,330 Karena kita perlu awal itu. 25 00:01:16,330 --> 00:01:21,310 Nah, JPGs, seperti peta bit, hanya urutan byte. 26 00:01:21,310 --> 00:01:30,660 Untungnya, setiap JPG dimulai dengan baik 0xff, 0xD8, 0xff, 0xE0, satu urutan 27 00:01:30,660 --> 00:01:33,610 byte, atau yang lain urutan byte. 28 00:01:33,610 --> 00:01:37,250 >> Jadi mereka empat byte menunjukkan awal JPG. 29 00:01:37,250 --> 00:01:40,780 Tidak ada selain yang dua kombinasi dari empat byte. 30 00:01:40,780 --> 00:01:44,840 Dan untungnya bagi kita, fakta lain bahwa kita dapat mengambil keuntungan dari adalah bahwa setiap 31 00:01:44,840 --> 00:01:48,550 JPG disimpan side-by-side pada kartu memori. 32 00:01:48,550 --> 00:01:52,210 Aku sudah mewakili struktur kartu memori skema ini 33 00:01:52,210 --> 00:01:53,310 geser sini. 34 00:01:53,310 --> 00:01:59,270 Di sini, setiap persegi, persegi panjang setiap, mewakili 512 byte, dan mulai 35 00:01:59,270 --> 00:02:01,750 dengan abu-abu dalam bahwa kita tidak benar-benar memiliki sebuah JPG. 36 00:02:01,750 --> 00:02:05,700 >> Tapi kemudian kami akhirnya memukul blok dengan bintang. 37 00:02:05,700 --> 00:02:10,940 Itu berarti bahwa empat byte pertama keluar 512 dari mereka adalah salah satu dari dua 38 00:02:10,940 --> 00:02:13,230 mulai urutan JPG. 39 00:02:13,230 --> 00:02:17,340 Dan kami pergi dari sana, dan kemudian sekali satu JPG berakhir, yang berikutnya dimulai. 40 00:02:17,340 --> 00:02:20,990 Kami tidak pernah memiliki lagi ruang abu-abu di antara keduanya. 41 00:02:20,990 --> 00:02:25,550 >> Tapi bagaimana kita benar-benar membaca ini, dan membaca 512 byte sehingga kita dapat membuat 42 00:02:25,550 --> 00:02:27,500 perbandingan tempat pertama? 43 00:02:27,500 --> 00:02:33,470 Nah, mari kita kembali ke fread, yang mengambil dalam struct yang akan berisi 44 00:02:33,470 --> 00:02:34,470 byte yang Anda baca. 45 00:02:34,470 --> 00:02:36,570 Jadi Anda akan menempatkan mereka yang ada - 46 00:02:36,570 --> 00:02:42,192 ukuran, jumlah, dan kemudian inpointer bahwa Anda membaca dari. 47 00:02:42,192 --> 00:02:49,900 Sekarang, kita ingin membaca 512 pada satu waktu, dan kita ingin menyimpan ini dalam buffer, 48 00:02:49,900 --> 00:02:50,700 Aku akan menyebutnya. 49 00:02:50,700 --> 00:02:54,100 >> Pada dasarnya, kita akan terus ke mereka 512 byte dan melakukan 50 00:02:54,100 --> 00:02:55,500 hal dengan itu, kan? 51 00:02:55,500 --> 00:02:58,260 Kita juga akan membandingkan pertama empat byte, atau kita akan 52 00:02:58,260 --> 00:02:59,830 membacanya dalam, OK? 53 00:02:59,830 --> 00:03:05,050 Jadi data pointer kemudian akan berfungsi sebagai buffer Anda, dan 54 00:03:05,050 --> 00:03:07,745 inpointer, well, itu hanya akan menjadi kartu memori Anda. 55 00:03:07,745 --> 00:03:09,500 >> Kembali ke skema kartu memori kita. 56 00:03:09,500 --> 00:03:14,690 Kita akan membaca 512 byte pada suatu waktu, menyimpan setiap blok 512-byte 57 00:03:14,690 --> 00:03:19,190 ke dalam buffer, memegang mereka penyangga, mereka 512 byte, sampai kita tahu 58 00:03:19,190 --> 00:03:22,000 apa yang harus dilakukan mereka. 59 00:03:22,000 --> 00:03:25,960 Jadi awalnya tidak apa-apa, jadi kita akan membaca buffer, membandingkannya, dan 60 00:03:25,960 --> 00:03:28,160 kita tidak perlu melakukan apa-apa dengan itu. 61 00:03:28,160 --> 00:03:32,030 Dan kemudian, kami akhirnya memukul sebuah bintang blok, yang berarti bahwa kita sudah 62 00:03:32,030 --> 00:03:33,630 menemukan JPG pertama kami. 63 00:03:33,630 --> 00:03:36,560 Jadi buffer sekarang memegang byte dari JPG itu. 64 00:03:36,560 --> 00:03:40,220 >> Lain kali 512 byte, karena mereka bukan blok bintang, juga 65 00:03:40,220 --> 00:03:41,740 bagian dari JPG itu. 66 00:03:41,740 --> 00:03:47,630 Dan JPGs adalah kontinu dari sana di dalam, sampai kita memukul JPG berikutnya. 67 00:03:47,630 --> 00:03:51,880 Dan kemudian buffer kemudian memegang 512 byte untuk JPG itu, dan 68 00:03:51,880 --> 00:03:53,580 seterusnya, dan sebagainya. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Jadi setelah Anda menekan pertama starred blok, pertama JPG, bagaimana Anda 71 00:03:58,980 --> 00:04:01,910 sebenarnya, baik, membukanya? 72 00:04:01,910 --> 00:04:04,990 Mari kita membuat JPG baru. 73 00:04:04,990 --> 00:04:08,846 Nama file untuk file JPG akan dalam format, nomor, nomor, 74 00:04:08,846 --> 00:04:13,830 number.jpg, dalam bahwa mereka disebutkan dalam urutan di mana mereka ditemukan, 75 00:04:13,830 --> 00:04:14,780 mulai dari 0. 76 00:04:14,780 --> 00:04:19,890 >> Jadi JPG pertama yang Anda menemukan akan 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Jadi, mungkin ide yang baik untuk melacak berapa banyak JPGs Anda telah menemukan sejauh ini. 78 00:04:26,560 --> 00:04:27,610 Jadi itulah nama file. 79 00:04:27,610 --> 00:04:29,660 Tapi bagaimana Anda benar-benar membuat itu? 80 00:04:29,660 --> 00:04:34,310 Nah, kita akan menggunakan fungsi yang disebut sprintf. 81 00:04:34,310 --> 00:04:38,260 Sedikit mirip dengan printf, di mana Anda dapat menggunakan penampung untuk string, 82 00:04:38,260 --> 00:04:42,420 kecuali dalam hal ini, sprintf akan mencetak file keluar ke saat ini 83 00:04:42,420 --> 00:04:45,550 direktori, bukan ke terminal. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Jadi di sini kita melihat bahwa kita memiliki judul, array char yang akan menyimpan 86 00:04:49,950 --> 00:04:55,120 string yang dihasilkan, dan kami lulus dalam judul string yang sebenarnya dengan 87 00:04:55,120 --> 00:04:58,720 placeholder, sama seperti kita belajar untuk melakukan dengan printf. 88 00:04:58,720 --> 00:05:05,530 Tapi kode ini yang saya miliki di sini akan memberikan 2.jpg, bukan 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Jadi aku akan meninggalkan Anda untuk mengetahui bagaimana memodifikasi placeholder untuk membuat 90 00:05:09,920 --> 00:05:11,920 nama yang benar. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Jadi setelah Anda sprintf'd maka Anda dapat membuka file itu, karena itu ada dalam 93 00:05:17,390 --> 00:05:22,690 direktori Anda, dengan fopen, menggunakan judul, dan kemudian modus apapun yang Anda inginkan 94 00:05:22,690 --> 00:05:25,140 untuk membuka file yang masuk 95 00:05:25,140 --> 00:05:30,260 Jadi sekarang kita telah membuka file JPG baru, sekarang kita dapat menulis 512 byte pada 96 00:05:30,260 --> 00:05:33,320 waktu, sampai JPG baru ditemukan. 97 00:05:33,320 --> 00:05:36,640 Jadi mari kita lihat lagi pada sintaks fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Aku tahu bahwa aku menunjukkan geser ini banyak, tapi aku hanya ingin memastikan bahwa 99 00:05:40,060 --> 00:05:43,530 kalian jangan terlalu bingung, karena Aku tahu bahwa itu sangat mudah untuk 100 00:05:43,530 --> 00:05:47,000 mencampur pertama dan terakhir argumen, khususnya. 101 00:05:47,000 --> 00:05:54,390 Tapi ingat bahwa Anda sedang menulis dari penyangga Anda ke gambar file yang keluar. 102 00:05:54,390 --> 00:05:59,250 >> Sekarang Anda tahu bagaimana menulis 512 byte ke dalam file JPG Anda bahwa Anda telah 103 00:05:59,250 --> 00:06:03,230 diciptakan, baik, kita ingin menghentikan itu Proses setelah kami telah mencapai akhir dari 104 00:06:03,230 --> 00:06:06,720 kartu kami, karena tidak akan ada lagi gambar yang akan ditemukan. 105 00:06:06,720 --> 00:06:10,760 Jadi mari kita kembali ke fread sekali lagi, aku janji. 106 00:06:10,760 --> 00:06:15,600 fread kembali berapa banyak item ukuran, ukuran, sudah siap di berhasil. 107 00:06:15,600 --> 00:06:19,440 Idealnya, ini akan menjadi apa pun Anda lulus dalam nomor, kan? 108 00:06:19,440 --> 00:06:24,140 Karena Anda mencoba untuk membaca nomor elemen ukuran, ukuran. 109 00:06:24,140 --> 00:06:29,380 Tapi jika fread tidak mampu membaca bahwa jumlah elemen, maka akan kembali 110 00:06:29,380 --> 00:06:32,530 apapun nomor itu membaca sukses. 111 00:06:32,530 --> 00:06:36,310 >> Sekarang, satu hal penting yang perlu diperhatikan adalah bahwa jika Anda menggunakan file lain I / O 112 00:06:36,310 --> 00:06:43,860 berfungsi seperti fgetc, juga akan kembali berapa banyak item yang membaca berhasil. 113 00:06:43,860 --> 00:06:48,000 Apa yang berguna tentang fungsi ini bahwa jika Anda menggunakan fungsi dalam sebuah 114 00:06:48,000 --> 00:06:53,190 kondisi, itu akan mengeksekusi dirinya sendiri sementara menentukan kondisi tersebut, yang 115 00:06:53,190 --> 00:06:54,340 hanya benar-benar berguna. 116 00:06:54,340 --> 00:07:00,440 Jadi jika Anda memiliki kondisi ini, misalnya, jika buffer fread, DOG sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 pointer, sama sama dengan 1, yang berarti bahwa saya ingin membaca 118 00:07:04,870 --> 00:07:06,540 2 anjing pada saat itu. 119 00:07:06,540 --> 00:07:13,490 Tetapi jika fread kembali 1 bukan 2 sebagai diharapkan, itu berarti bahwa ada 2 120 00:07:13,490 --> 00:07:16,480 anjing yang tersisa di file saya, melainkan 1. 121 00:07:16,480 --> 00:07:22,450 Namun jika ia mengembalikan 2, maka saya masih memiliki orang-2 anjing di dalam buffer saya. 122 00:07:22,450 --> 00:07:26,280 >> Jadi sekarang yang memberi Anda rasa bagaimana memeriksa akhir file, tapi 123 00:07:26,280 --> 00:07:28,940 mari kita pergi melalui sekarang logika. 124 00:07:28,940 --> 00:07:32,460 Bagaimana kita benar-benar sepotong semua elemen ini bersama-sama? 125 00:07:32,460 --> 00:07:36,880 Setelah kita memukul JPG pertama kami, karena kita tahu bahwa JPGs disimpan 126 00:07:36,880 --> 00:07:40,910 contiguously, kita akan menulis sampai kita mencapai akhir dari file kartu. 127 00:07:40,910 --> 00:07:43,950 Tapi kita tidak ingin menulis apa-apa sampai saat itu. 128 00:07:43,950 --> 00:07:48,710 Jadi itu penting, bukan hanya itu kita berada di awal dari JPG baru, tapi apakah 129 00:07:48,710 --> 00:07:50,655 kita sudah menemukan JPG atau tidak. 130 00:07:50,655 --> 00:07:55,390 >> Jika Ini adalah awal dari sebuah JPG baru, kita akan ingin menutup file JPG kami saat ini jika 131 00:07:55,390 --> 00:07:59,110 kami memiliki satu terbuka, dan terbuka yang baru untuk menulis ke dalam. 132 00:07:59,110 --> 00:08:03,340 Jika tidak awal JPG baru, Namun, kami akan menyimpan file JPG yang sama 133 00:08:03,340 --> 00:08:05,910 membuka dan menulis ke dalam. 134 00:08:05,910 --> 00:08:10,100 Kami akan menulis penyangga kami ke mana JPG file yang kita buka, asalkan 135 00:08:10,100 --> 00:08:12,120 kita memiliki satu terbuka, tentu saja. 136 00:08:12,120 --> 00:08:16,190 Jika kita belum menemukan JPG pertama kami Namun, kami tidak menulis apa-apa. 137 00:08:16,190 --> 00:08:20,290 Dan proses ini terus berlanjut sampai Anda mencapai akhir file kartu. 138 00:08:20,290 --> 00:08:23,410 >> Dan akhirnya, Anda akan ingin untuk membuat Pastikan bahwa Anda fclose setiap 139 00:08:23,410 --> 00:08:25,800 file yang telah Anda fopened. 140 00:08:25,800 --> 00:08:28,360 Setelah Anda merasa nyaman dengan konsep, lihatlah beberapa 141 00:08:28,360 --> 00:08:30,840 pseudocode, yang saya sudah disertakan di sini. 142 00:08:30,840 --> 00:08:34,830 Pertama, Anda ingin membuka file kartu, dan kemudian ulangi proses berikut 143 00:08:34,830 --> 00:08:37,144 sampai Anda telah mencapai akhir kartu. 144 00:08:37,144 --> 00:08:40,880 Anda ingin membaca 512 byte ke dalam buffer. 145 00:08:40,880 --> 00:08:43,934 Menggunakan penyangga itu, Anda akan ingin memeriksa apakah Anda di awal dari sebuah 146 00:08:43,934 --> 00:08:45,300 JPG baru atau tidak. 147 00:08:45,300 --> 00:08:48,400 Dan jawaban untuk pertanyaan yang akan mempengaruhi manajemen file Anda - 148 00:08:48,400 --> 00:08:51,940 file yang Anda buka, yang mana yang anda tutup. 149 00:08:51,940 --> 00:08:55,220 >> Lalu, apakah Anda sudah menemukan JPG? 150 00:08:55,220 --> 00:08:57,740 Bagaimana Anda telah menjaga track itu? 151 00:08:57,740 --> 00:09:01,735 Kemudian, tergantung pada itu, Anda akan baik menulis ke JPG saat ini yang Anda 152 00:09:01,735 --> 00:09:07,090 telah terbuka, atau tidak menulis sama sekali, karena Anda belum menemukan JPG belum. 153 00:09:07,090 --> 00:09:10,870 Akhirnya, setelah Anda mencapai akhir file, Anda akan ingin untuk menutup 154 00:09:10,870 --> 00:09:12,590 file yang telah Anda buka tersisa. 155 00:09:12,590 --> 00:09:14,590 Kami ingin menjadi rapi di sini. 156 00:09:14,590 --> 00:09:18,790 >> Dan dengan itu, Anda telah pulih semua file yang hilang dari memori yang 157 00:09:18,790 --> 00:09:21,620 kartu, yang merupakan prestasi yang cukup menakjubkan. 158 00:09:21,620 --> 00:09:23,430 Jadi menepuk diri di bagian belakang. 159 00:09:23,430 --> 00:09:27,560 Tapi, ada satu elemen lagi untuk yang PSET, yang merupakan kontes. 160 00:09:27,560 --> 00:09:30,920 Anda akan menemukan bahwa semua gambar bahwa Anda telah benar-benar pulih 161 00:09:30,920 --> 00:09:32,820 gambar staf CS50 itu. 162 00:09:32,820 --> 00:09:38,500 Jadi jika Anda berada di kampus atau di suatu tempat dekat, maka Anda dapat mengambil gambar dengan 163 00:09:38,500 --> 00:09:42,600 staf, dan bagian yang memiliki sebagian gambar dengan anggota staf 164 00:09:42,600 --> 00:09:46,940 dari file mereka dipulihkan akan mendapatkan hadiah yang mengagumkan. 165 00:09:46,940 --> 00:09:50,650 Dengan itu, maka Anda telah selesai sembuh PSET. 166 00:09:50,650 --> 00:09:53,600 Nama saya adalah Zamyla, dan ini adalah CS50. 167 00:09:53,600 --> 00:10:01,835