[MUZIK Bermain] ZAMYLA CHAN: Mari kita menangani pulih. Pulih mungkin Serangga kegemaran saya, dan terutamanya kerana saya rasa ia benar-benar, benar-benar sejuk. Pada asasnya, anda diberi ingatan yang file kad di mana gambar telah dipadam. Tetapi apa yang anda akan lakukan adalah mendapatkan semula mereka semua. OK. Jadi ia benar-benar menarik, tetapi mungkin sedikit menakutkan, kerana anda diberi fail C kosong dan anda perlu mengisi ia masuk OK, jadi mari kita memecahkan ini ke dalam bahagian-bahagian terkawal. Anda akan mahu untuk membuka file kad memori. Itu seolah-olah cukup mudah. Kemudian, cari awal daripada imej JPG. Semua fail pada memori ini kad akan menjadi JPGs. Kemudian, apabila anda mencari awal, anda akan membuka JPG baru, yang adalah, seperti, mewujudkan JPG, dan menulis 512 bait pada satu masa sehingga JPG baru ditemui, dan berakhir program ini, sekali anda mengesan akhir fail. Langkah-langkah supaya pertama yang pertama adalah untuk membuka fail kad memori. Tetapi anda tahu ini sudah, dan ada fail I / O fungsi yang akan membuktikan yang sangat berguna. OK. Jadi apakah JPGs? Kerana kita perlu mulanya ia. Nah, JPGs, seperti peta bit, hanya urutan bait. Nasib baik, setiap JPG bermula dengan sama ada 0xFF, 0xd8, 0xFF, 0xe0, satu urutan bait, atau yang lain ulangan bait. Maka orang-orang empat bait menunjukkan permulaan JPG. Tidak lain daripada kedua-dua kombinasi empat bait. Dan bernasib baik untuk kita, satu lagi fakta yang kita boleh mengambil kesempatan daripada adalah bahawa setiap JPG disimpan sebelah-sebelah pada kad memori. Saya mewakili struktur yang kad memori secara skema pada ini slaid di sini. Di sini, setiap persegi, setiap persegi panjang, mewakili 512 bait, dan ia bermula dengan kelabu, kerana aku tidak melakukan benar-benar mempunyai JPG. Tetapi kita akhirnya melanda blok dengan bintang. Ini bermakna bahawa empat bait pertama keluar dari orang-orang 512 adalah salah satu daripada kedua-dua bermula urutan JPG. Dan kita pergi dari sana, dan kemudian sekali satu JPG berakhir, yang seterusnya bermula. Kami tidak pernah mempunyai apa-apa lebih ruang kelabu di-antara. Tetapi bagaimana kita benar-benar membaca ini, dan membaca 512 bytes supaya kita boleh membuat perbandingan tempat pertama? Nah, mari kita kembali ke fread, yang mengambil masa dalam struct yang akan mengandungi bait yang anda baca. Jadi, anda akan meletakkan mereka di sana - saiz, bilangan, dan kemudian inpointer bahawa anda membaca dari. Sekarang, kita mahu membaca 512 pada satu masa, dan kami ingin menyimpan ini dalam penampan, Saya akan memanggilnya. Pada asasnya, kita akan mengadakan ke mereka 512 bait dan melakukan perkara dengannya, bukan? Kami sama ada akan membandingkan pertama empat bait, atau kita akan membacanya dalam, OK? Demikian maka penunjuk data kemudian akan bertindak sebagai penampan anda, dan inpointer, baik, yang hanya akan sebagai kad ingatan anda. Kembali kepada skema kad ingatan kita. Kita akan membaca 512 bait pada satu masa, menyimpan setiap blok 512-bait ke dalam penampan, memegang mereka penampan, mereka 512 bait, sehingga kita tahu apa yang perlu dilakukan mereka. Jadi awal tidak apa-apa, jadi kami akan membaca penimbal, bandingkan, dan kita tidak perlu berbuat apa-apa dengannya. Dan kemudian, kami akhirnya melanda bintang menghalang, bermakna kita telah didapati JPG pertama kami. Jadi penimbal kini memegang bait dari JPG itu. Masa depan 512 bait, kerana mereka bukan blok bintang, juga sebahagian daripada JPG itu. Dan JPGs adalah berterusan dari sana di dalam, sehingga kita melanda JPG depan. Dan kemudian penimbal kemudian memegang 512 bait untuk JPG itu, dan sebagainya, dan sebagainya. OK. Jadi apabila anda melanda pertama yang berbintang blok, yang JPG pertama, bagaimana anda sebenarnya, baik, membukanya? Mari kita membuat JPG baru. Nama fail yang untuk JPG yang akan dalam format, nombor, nombor, number.jpg, dalam bahawa mereka yang dinamakan dalam perintah itu di mana mereka berada, bermula pada 0. Jadi JPG pertama yang anda mencari akan 000.jpg. Jadi, mungkin idea yang baik untuk mengesan berapa JPGs anda dapati setakat ini. Jadi, itu nama fail. Tetapi bagaimana anda sebenarnya membuat itu? Nah, kita akan menggunakan fungsi dipanggil sprintf. Sedikit sama dengan printf, di mana anda boleh menggunakan ruang letak untuk tali, kecuali dalam kes ini, sprintf akan mencetak fail keluar ke semasa direktori, bukan ke dalam terminal. OK. Jadi di sini kita melihat bahawa kita mempunyai tajuk, pelbagai char yang akan menyimpan tali paduan, dan kita lulus dalam tajuk rentetan sebenar dengan pemegang tempat, sama seperti kami belajar untuk melakukan dengan printf. Tetapi kod ini yang saya ada di sini akan memberikan 2.jpg, tidak 002.jpg. Jadi saya akan meninggalkan kepada anda untuk mengetahui bagaimana untuk mengubah suai ruang letak untuk membuat nama betul. OK. Jadi apabila anda telah sprintf'd maka anda boleh membuka fail itu, kerana ia wujud dalam direktori anda, dengan fopen, menggunakan tajuk, dan kemudian apa sahaja yang anda mahu mod untuk membuka fail yang masuk Jadi sekarang kita telah membuka fail JPG baru, sekarang kita boleh menulis 512 bytes pada masa, sehingga JPG baru ditemui. Jadi mari kita lihat satu lagi pada sintaks fwrite. Saya tahu bahawa saya menunjukkan slaid ini banyak, tetapi saya hanya ingin memastikan bahawa anda lelaki tidak terlalu keliru, kerana Saya tahu bahawa ia sangat mudah untuk adukkan pertama dan yang terakhir hujah, khususnya. Tetapi ingat bahawa anda menulis dari penampan anda ke dalam imej fail keluar. Sekarang anda tahu bagaimana menulis 512 bait ke dalam fail JPG anda bahawa anda telah dicipta, baik, kita mahu berhenti bahawa proses setelah kami sampai ke penghujung kad kita, kerana tidak akan ada lagi imej untuk dijumpai. Jadi mari kita kembali ke fread sekali lagi, saya janji. fread kembali berapa banyak barangan saiz, saiz, bersedia dengan jayanya. Sebaik-baiknya, ini akan menjadi apa sahaja anda meninggal dalam nombor, bukan? Oleh kerana anda cuba untuk membaca nombor unsur-unsur saiz, saiz. Tetapi jika fread tidak dapat membaca bahawa beberapa elemen, maka ia akan kembali apa sahaja bilangan ia membaca dengan jayanya. Sekarang, satu perkara penting untuk diperhatikan adalah bahawa jika anda menggunakan fail lain I / O berfungsi seperti fgetc, ia juga akan kembali berapa banyak perkara ia membaca dengan jayanya. Apa yang berguna mengenai fungsi ini adalah bahawa jika anda menggunakan fungsi-fungsi di dalam satu syarat, ia akan melaksanakan sendiri manakala menentukan keadaan itu, yang merupakan hanya benar-benar berguna. Jadi, jika anda mempunyai keadaan ini, berkata, jika penampan fread, ANJING sizeof, 2, penunjuk, sama sama 1, yang bermakna saya suka membaca 2 anjing pada masa itu. Tetapi jika fread mengembalikan 1 bukan 2 seperti yang dijangka, ini bermakna bahawa terdapat 2 anjing ditinggalkan di dalam fail saya, tetapi sebaliknya 1. Tetapi jika ia kembali 2, kemudian saya masih mempunyai mereka 2 anjing dalam buffer saya. Jadi sekarang yang memberikan anda rasa bagaimana untuk periksa akhir fail tersebut, tetapi mari kita pergi melalui sekarang logik. Bagaimana kita sebenarnya sekeping semua elemen-elemen ini bersama-sama? Apabila kita mencapai JPG pertama kami, kerana kita tahu bahawa JPGs disimpan contiguously, kami akan menulis sehingga kami sampai ke akhir fail kad. Tetapi kita tidak mahu menulis apa-apa sehingga kemudian. Jadi perkara-perkara, bukan sahaja bahawa kami di permulaan JPG baru, tetapi sama ada kita sudah menjumpai JPG atau tidak. Jika Ia permulaan JPG baru, kita akan ingin menutup fail JPG semasa kami jika kita mempunyai satu terbuka, dan terbuka yang baru untuk menulis ke dalam. Jika ia bukan permulaan JPG baru, walaupun, kami akan menyimpan fail JPG yang sama membuka dan menulis ke dalam itu. Kita harus menulis penampan kami ke dalam mana-mana Fail JPG kita terbuka, dengan syarat bahawa kita mempunyai satu terbuka, sudah tentu. Jika kita tidak menemui JPG pertama kami lagi, kita tidak menulis apa-apa. Dan proses ini berterusan sehingga anda sampai ke akhir fail kad. Dan akhirnya, anda akan mahu untuk membuat memastikan bahawa anda fclose apa-apa fail yang telah anda fopened. Sebaik sahaja anda selesa dengan konsep, mengambil lihat beberapa kod pseudo, yang saya telah dimasukkan di sini. Pertama, anda ingin membuka fail kad, dan kemudian mengulangi proses berikut sehingga anda telah mencapai akhir kad. Anda mahu membaca 512 bytes ke dalam penampan. Menggunakan penampan itu, anda akan mahu untuk menyemak sama ada anda pada permulaan yang JPG baru atau tidak. Dan jawapan kepada soalan yang akan menjejaskan pengurusan fail anda - yang fail yang anda buka, yang orang-orang yang anda ditutup. Kemudian, adakah anda sudah menemui JPG? Bagaimana anda telah menyimpan trek itu? Kemudian, bergantung kepada itu, anda akan sama ada menulis ke JPG semasa yang anda buka, atau tidak menulisnya pada semua, kerana anda tidak menemui JPG lagi. Akhir sekali, apabila anda telah sampai ke penghujung fail, anda akan mahu untuk menutup mana-mana baki fail yang terbuka. Kami mahu menjadi kemas di sini. Dan dengan itu, anda telah pulih semua gambar-gambar yang hilang dari memori yang kad, yang merupakan satu pencapaian yang cukup menakjubkan. Jadi tepuk diri anda di belakang. Tetapi, ada satu unsur yang lebih kepada Serangga, yang merupakan pertandingan. Anda akan mendapati bahawa semua gambar-gambar bahawa anda telah pulih sebenarnya gambar-gambar kakitangan CS50 ini. Jadi, jika anda di kampus atau di suatu tempat terdekat, maka anda boleh mengambil gambar dengan kakitangan, dan bahagian yang mempunyai paling gambar dengan kakitangan daripada fail pulih mereka akan mendapatkan hadiah hebat. Dengan itu, maka anda selesai itu pulih Serangga. Nama saya Zamyla, dan ini adalah CS50.