Tip:
Highlight text to annotate it
X
>> [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.