1 00:00:00,000 --> 00:00:09,780 >> [MUZIK Bermain] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Mari kita menangani pulih. 3 00:00:11,150 --> 00:00:14,030 Pulih mungkin Serangga kegemaran saya, dan terutamanya kerana saya rasa ia 4 00:00:14,030 --> 00:00:15,650 benar-benar, benar-benar sejuk. 5 00:00:15,650 --> 00:00:19,040 Pada asasnya, anda diberi ingatan yang file kad di mana 6 00:00:19,040 --> 00:00:20,900 gambar telah dipadam. 7 00:00:20,900 --> 00:00:23,650 Tetapi apa yang anda akan lakukan adalah mendapatkan semula mereka semua. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Jadi ia benar-benar menarik, tetapi mungkin sedikit menakutkan, kerana anda 10 00:00:28,230 --> 00:00:32,430 diberi fail C kosong dan anda perlu mengisi ia masuk 11 00:00:32,430 --> 00:00:36,250 OK, jadi mari kita memecahkan ini ke dalam bahagian-bahagian terkawal. 12 00:00:36,250 --> 00:00:38,160 Anda akan mahu untuk membuka file kad memori. 13 00:00:38,160 --> 00:00:39,900 Itu seolah-olah cukup mudah. 14 00:00:39,900 --> 00:00:43,030 Kemudian, cari awal daripada imej JPG. 15 00:00:43,030 --> 00:00:46,740 Semua fail pada memori ini kad akan menjadi JPGs. 16 00:00:46,740 --> 00:00:50,840 Kemudian, apabila anda mencari awal, anda akan membuka JPG baru, yang 17 00:00:50,840 --> 00:00:57,610 adalah, seperti, mewujudkan JPG, dan menulis 512 bait pada satu masa sehingga JPG baru 18 00:00:57,610 --> 00:01:02,930 ditemui, dan berakhir program ini, sekali anda mengesan akhir fail. 19 00:01:02,930 --> 00:01:06,400 >> Langkah-langkah supaya pertama yang pertama adalah untuk membuka fail kad memori. 20 00:01:06,400 --> 00:01:09,850 Tetapi anda tahu ini sudah, dan ada fail I / O fungsi yang akan 21 00:01:09,850 --> 00:01:12,030 membuktikan yang sangat berguna. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Jadi apakah JPGs? 24 00:01:14,760 --> 00:01:16,330 Kerana kita perlu mulanya ia. 25 00:01:16,330 --> 00:01:21,310 Nah, JPGs, seperti peta bit, hanya urutan bait. 26 00:01:21,310 --> 00:01:30,660 Nasib baik, setiap JPG bermula dengan sama ada 0xFF, 0xd8, 0xFF, 0xe0, satu urutan 27 00:01:30,660 --> 00:01:33,610 bait, atau yang lain ulangan bait. 28 00:01:33,610 --> 00:01:37,250 >> Maka orang-orang empat bait menunjukkan permulaan JPG. 29 00:01:37,250 --> 00:01:40,780 Tidak lain daripada kedua-dua kombinasi empat bait. 30 00:01:40,780 --> 00:01:44,840 Dan bernasib baik untuk kita, satu lagi fakta yang kita boleh mengambil kesempatan daripada adalah bahawa setiap 31 00:01:44,840 --> 00:01:48,550 JPG disimpan sebelah-sebelah pada kad memori. 32 00:01:48,550 --> 00:01:52,210 Saya mewakili struktur yang kad memori secara skema pada ini 33 00:01:52,210 --> 00:01:53,310 slaid di sini. 34 00:01:53,310 --> 00:01:59,270 Di sini, setiap persegi, setiap persegi panjang, mewakili 512 bait, dan ia bermula 35 00:01:59,270 --> 00:02:01,750 dengan kelabu, kerana aku tidak melakukan benar-benar mempunyai JPG. 36 00:02:01,750 --> 00:02:05,700 >> Tetapi kita akhirnya melanda blok dengan bintang. 37 00:02:05,700 --> 00:02:10,940 Ini bermakna bahawa empat bait pertama keluar dari orang-orang 512 adalah salah satu daripada kedua-dua 38 00:02:10,940 --> 00:02:13,230 bermula urutan JPG. 39 00:02:13,230 --> 00:02:17,340 Dan kita pergi dari sana, dan kemudian sekali satu JPG berakhir, yang seterusnya bermula. 40 00:02:17,340 --> 00:02:20,990 Kami tidak pernah mempunyai apa-apa lebih ruang kelabu di-antara. 41 00:02:20,990 --> 00:02:25,550 >> Tetapi bagaimana kita benar-benar membaca ini, dan membaca 512 bytes supaya kita boleh 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 masa dalam struct yang akan mengandungi 44 00:02:33,470 --> 00:02:34,470 bait yang anda baca. 45 00:02:34,470 --> 00:02:36,570 Jadi, anda akan meletakkan mereka di sana - 46 00:02:36,570 --> 00:02:42,192 saiz, bilangan, dan kemudian inpointer bahawa anda membaca dari. 47 00:02:42,192 --> 00:02:49,900 Sekarang, kita mahu membaca 512 pada satu masa, dan kami ingin menyimpan ini dalam penampan, 48 00:02:49,900 --> 00:02:50,700 Saya akan memanggilnya. 49 00:02:50,700 --> 00:02:54,100 >> Pada asasnya, kita akan mengadakan ke mereka 512 bait dan melakukan 50 00:02:54,100 --> 00:02:55,500 perkara dengannya, bukan? 51 00:02:55,500 --> 00:02:58,260 Kami sama ada akan membandingkan pertama empat bait, atau kita akan 52 00:02:58,260 --> 00:02:59,830 membacanya dalam, OK? 53 00:02:59,830 --> 00:03:05,050 Demikian maka penunjuk data kemudian akan bertindak sebagai penampan anda, dan 54 00:03:05,050 --> 00:03:07,745 inpointer, baik, yang hanya akan sebagai kad ingatan anda. 55 00:03:07,745 --> 00:03:09,500 >> Kembali kepada skema kad ingatan kita. 56 00:03:09,500 --> 00:03:14,690 Kita akan membaca 512 bait pada satu masa, menyimpan setiap blok 512-bait 57 00:03:14,690 --> 00:03:19,190 ke dalam penampan, memegang mereka penampan, mereka 512 bait, sehingga kita tahu 58 00:03:19,190 --> 00:03:22,000 apa yang perlu dilakukan mereka. 59 00:03:22,000 --> 00:03:25,960 Jadi awal tidak apa-apa, jadi kami akan membaca penimbal, bandingkan, dan 60 00:03:25,960 --> 00:03:28,160 kita tidak perlu berbuat apa-apa dengannya. 61 00:03:28,160 --> 00:03:32,030 Dan kemudian, kami akhirnya melanda bintang menghalang, bermakna kita telah 62 00:03:32,030 --> 00:03:33,630 didapati JPG pertama kami. 63 00:03:33,630 --> 00:03:36,560 Jadi penimbal kini memegang bait dari JPG itu. 64 00:03:36,560 --> 00:03:40,220 >> Masa depan 512 bait, kerana mereka bukan blok bintang, juga 65 00:03:40,220 --> 00:03:41,740 sebahagian daripada JPG itu. 66 00:03:41,740 --> 00:03:47,630 Dan JPGs adalah berterusan dari sana di dalam, sehingga kita melanda JPG depan. 67 00:03:47,630 --> 00:03:51,880 Dan kemudian penimbal kemudian memegang 512 bait untuk JPG itu, dan 68 00:03:51,880 --> 00:03:53,580 sebagainya, dan sebagainya. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Jadi apabila anda melanda pertama yang berbintang blok, yang JPG pertama, 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 fail yang untuk JPG yang akan dalam format, nombor, nombor, 74 00:04:08,846 --> 00:04:13,830 number.jpg, dalam bahawa mereka yang dinamakan dalam perintah itu di mana mereka berada, 75 00:04:13,830 --> 00:04:14,780 bermula pada 0. 76 00:04:14,780 --> 00:04:19,890 >> Jadi JPG pertama yang anda mencari akan 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Jadi, mungkin idea yang baik untuk mengesan berapa JPGs anda dapati setakat ini. 78 00:04:26,560 --> 00:04:27,610 Jadi, itu nama fail. 79 00:04:27,610 --> 00:04:29,660 Tetapi bagaimana anda sebenarnya membuat itu? 80 00:04:29,660 --> 00:04:34,310 Nah, kita akan menggunakan fungsi dipanggil sprintf. 81 00:04:34,310 --> 00:04:38,260 Sedikit sama dengan printf, di mana anda boleh menggunakan ruang letak untuk tali, 82 00:04:38,260 --> 00:04:42,420 kecuali dalam kes ini, sprintf akan mencetak fail keluar ke semasa 83 00:04:42,420 --> 00:04:45,550 direktori, bukan ke dalam 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 bahawa kita mempunyai tajuk, pelbagai char yang akan menyimpan 86 00:04:49,950 --> 00:04:55,120 tali paduan, dan kita lulus dalam tajuk rentetan sebenar dengan 87 00:04:55,120 --> 00:04:58,720 pemegang tempat, sama seperti kami belajar untuk melakukan dengan printf. 88 00:04:58,720 --> 00:05:05,530 Tetapi kod ini yang saya ada di sini akan memberikan 2.jpg, tidak 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Jadi saya akan meninggalkan kepada anda untuk mengetahui bagaimana untuk mengubah suai ruang letak untuk membuat 90 00:05:09,920 --> 00:05:11,920 nama betul. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Jadi apabila anda telah sprintf'd maka anda boleh membuka fail itu, kerana ia wujud dalam 93 00:05:17,390 --> 00:05:22,690 direktori anda, dengan fopen, menggunakan tajuk, dan kemudian apa sahaja yang anda mahu mod 94 00:05:22,690 --> 00:05:25,140 untuk membuka fail yang masuk 95 00:05:25,140 --> 00:05:30,260 Jadi sekarang kita telah membuka fail JPG baru, sekarang kita boleh menulis 512 bytes pada 96 00:05:30,260 --> 00:05:33,320 masa, sehingga JPG baru ditemui. 97 00:05:33,320 --> 00:05:36,640 Jadi mari kita lihat satu lagi pada sintaks fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Saya tahu bahawa saya menunjukkan slaid ini banyak, tetapi saya hanya ingin memastikan bahawa 99 00:05:40,060 --> 00:05:43,530 anda lelaki tidak terlalu keliru, kerana Saya tahu bahawa ia sangat mudah untuk 100 00:05:43,530 --> 00:05:47,000 adukkan pertama dan yang terakhir hujah, khususnya. 101 00:05:47,000 --> 00:05:54,390 Tetapi ingat bahawa anda menulis dari penampan anda ke dalam imej fail keluar. 102 00:05:54,390 --> 00:05:59,250 >> Sekarang anda tahu bagaimana menulis 512 bait ke dalam fail JPG anda bahawa anda telah 103 00:05:59,250 --> 00:06:03,230 dicipta, baik, kita mahu berhenti bahawa proses setelah kami sampai ke penghujung 104 00:06:03,230 --> 00:06:06,720 kad kita, kerana tidak akan ada lagi imej untuk dijumpai. 105 00:06:06,720 --> 00:06:10,760 Jadi mari kita kembali ke fread sekali lagi, saya janji. 106 00:06:10,760 --> 00:06:15,600 fread kembali berapa banyak barangan saiz, saiz, bersedia dengan jayanya. 107 00:06:15,600 --> 00:06:19,440 Sebaik-baiknya, ini akan menjadi apa sahaja anda meninggal dalam nombor, bukan? 108 00:06:19,440 --> 00:06:24,140 Oleh kerana anda cuba untuk membaca nombor unsur-unsur saiz, saiz. 109 00:06:24,140 --> 00:06:29,380 Tetapi jika fread tidak dapat membaca bahawa beberapa elemen, maka ia akan kembali 110 00:06:29,380 --> 00:06:32,530 apa sahaja bilangan ia membaca dengan jayanya. 111 00:06:32,530 --> 00:06:36,310 >> Sekarang, satu perkara penting untuk diperhatikan adalah bahawa jika anda menggunakan fail lain I / O 112 00:06:36,310 --> 00:06:43,860 berfungsi seperti fgetc, ia juga akan kembali berapa banyak perkara ia membaca dengan jayanya. 113 00:06:43,860 --> 00:06:48,000 Apa yang berguna mengenai fungsi ini adalah bahawa jika anda menggunakan fungsi-fungsi di dalam satu 114 00:06:48,000 --> 00:06:53,190 syarat, ia akan melaksanakan sendiri manakala menentukan keadaan itu, yang merupakan 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 mempunyai keadaan ini, berkata, jika penampan fread, ANJING sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 penunjuk, sama sama 1, yang bermakna saya suka membaca 118 00:07:04,870 --> 00:07:06,540 2 anjing pada masa itu. 119 00:07:06,540 --> 00:07:13,490 Tetapi jika fread mengembalikan 1 bukan 2 seperti yang dijangka, ini bermakna bahawa terdapat 2 120 00:07:13,490 --> 00:07:16,480 anjing ditinggalkan di dalam fail saya, tetapi sebaliknya 1. 121 00:07:16,480 --> 00:07:22,450 Tetapi jika ia kembali 2, kemudian saya masih mempunyai mereka 2 anjing dalam buffer saya. 122 00:07:22,450 --> 00:07:26,280 >> Jadi sekarang yang memberikan anda rasa bagaimana untuk periksa akhir fail tersebut, tetapi 123 00:07:26,280 --> 00:07:28,940 mari kita pergi melalui sekarang logik. 124 00:07:28,940 --> 00:07:32,460 Bagaimana kita sebenarnya sekeping semua elemen-elemen ini bersama-sama? 125 00:07:32,460 --> 00:07:36,880 Apabila kita mencapai JPG pertama kami, kerana kita tahu bahawa JPGs disimpan 126 00:07:36,880 --> 00:07:40,910 contiguously, kami akan menulis sehingga kami sampai ke akhir fail kad. 127 00:07:40,910 --> 00:07:43,950 Tetapi kita tidak mahu menulis apa-apa sehingga kemudian. 128 00:07:43,950 --> 00:07:48,710 Jadi perkara-perkara, bukan sahaja bahawa kami di permulaan JPG baru, tetapi sama ada 129 00:07:48,710 --> 00:07:50,655 kita sudah menjumpai JPG atau tidak. 130 00:07:50,655 --> 00:07:55,390 >> Jika Ia permulaan JPG baru, kita akan ingin menutup fail JPG semasa kami jika 131 00:07:55,390 --> 00:07:59,110 kita mempunyai satu terbuka, dan terbuka yang baru untuk menulis ke dalam. 132 00:07:59,110 --> 00:08:03,340 Jika ia bukan permulaan JPG baru, walaupun, kami akan menyimpan fail JPG yang sama 133 00:08:03,340 --> 00:08:05,910 membuka dan menulis ke dalam itu. 134 00:08:05,910 --> 00:08:10,100 Kita harus menulis penampan kami ke dalam mana-mana Fail JPG kita terbuka, dengan syarat bahawa 135 00:08:10,100 --> 00:08:12,120 kita mempunyai satu terbuka, sudah tentu. 136 00:08:12,120 --> 00:08:16,190 Jika kita tidak menemui JPG pertama kami lagi, kita tidak menulis apa-apa. 137 00:08:16,190 --> 00:08:20,290 Dan proses ini berterusan sehingga anda sampai ke akhir fail kad. 138 00:08:20,290 --> 00:08:23,410 >> Dan akhirnya, anda akan mahu untuk membuat memastikan bahawa anda fclose apa-apa 139 00:08:23,410 --> 00:08:25,800 fail yang telah anda fopened. 140 00:08:25,800 --> 00:08:28,360 Sebaik sahaja anda selesa dengan konsep, mengambil lihat beberapa 141 00:08:28,360 --> 00:08:30,840 kod pseudo, yang saya telah dimasukkan di sini. 142 00:08:30,840 --> 00:08:34,830 Pertama, anda ingin membuka fail kad, dan kemudian mengulangi proses berikut 143 00:08:34,830 --> 00:08:37,144 sehingga anda telah mencapai akhir kad. 144 00:08:37,144 --> 00:08:40,880 Anda mahu membaca 512 bytes ke dalam penampan. 145 00:08:40,880 --> 00:08:43,934 Menggunakan penampan itu, anda akan mahu untuk menyemak sama ada anda pada permulaan yang 146 00:08:43,934 --> 00:08:45,300 JPG baru atau tidak. 147 00:08:45,300 --> 00:08:48,400 Dan jawapan kepada soalan yang akan menjejaskan pengurusan fail anda - 148 00:08:48,400 --> 00:08:51,940 yang fail yang anda buka, yang orang-orang yang anda ditutup. 149 00:08:51,940 --> 00:08:55,220 >> Kemudian, adakah anda sudah menemui JPG? 150 00:08:55,220 --> 00:08:57,740 Bagaimana anda telah menyimpan trek itu? 151 00:08:57,740 --> 00:09:01,735 Kemudian, bergantung kepada itu, anda akan sama ada menulis ke JPG semasa yang anda 152 00:09:01,735 --> 00:09:07,090 buka, atau tidak menulisnya pada semua, kerana anda tidak menemui JPG lagi. 153 00:09:07,090 --> 00:09:10,870 Akhir sekali, apabila anda telah sampai ke penghujung fail, anda akan mahu untuk menutup mana-mana 154 00:09:10,870 --> 00:09:12,590 baki fail yang terbuka. 155 00:09:12,590 --> 00:09:14,590 Kami mahu menjadi kemas di sini. 156 00:09:14,590 --> 00:09:18,790 >> Dan dengan itu, anda telah pulih semua gambar-gambar yang hilang dari memori yang 157 00:09:18,790 --> 00:09:21,620 kad, yang merupakan satu pencapaian yang cukup menakjubkan. 158 00:09:21,620 --> 00:09:23,430 Jadi tepuk diri anda di belakang. 159 00:09:23,430 --> 00:09:27,560 Tetapi, ada satu unsur yang lebih kepada Serangga, yang merupakan pertandingan. 160 00:09:27,560 --> 00:09:30,920 Anda akan mendapati bahawa semua gambar-gambar bahawa anda telah pulih sebenarnya 161 00:09:30,920 --> 00:09:32,820 gambar-gambar kakitangan CS50 ini. 162 00:09:32,820 --> 00:09:38,500 Jadi, jika anda di kampus atau di suatu tempat terdekat, maka anda boleh mengambil gambar dengan 163 00:09:38,500 --> 00:09:42,600 kakitangan, dan bahagian yang mempunyai paling gambar dengan kakitangan 164 00:09:42,600 --> 00:09:46,940 daripada fail pulih mereka akan mendapatkan hadiah hebat. 165 00:09:46,940 --> 00:09:50,650 Dengan itu, maka anda selesai itu pulih Serangga. 166 00:09:50,650 --> 00:09:53,600 Nama saya Zamyla, dan ini adalah CS50. 167 00:09:53,600 --> 00:10:01,835