>> [MUSIC PLAYING]
>> ZAMYLA CHAN: Mari kita mengatasi pulih.
Recover mungkin PSET favorit saya, dan terutama karena saya pikir itu
benar-benar, benar-benar keren.
Pada dasarnya, Anda diberi memori File kartu di mana
gambar telah dihapus.
Tapi apa Anda akan lakukan adalah memulihkan mereka semua.
>> OK.
Jadi itu benar-benar menarik, tapi mungkin sedikit menakutkan, karena kau
diberikan file C kosong dan Anda harus mengisi masuk
OK, jadi mari kita istirahat ini menjadi bagian-bagian dikelola.
Anda akan ingin membuka File kartu memori.
Tampaknya cukup sederhana.
Kemudian, cari awal dari gambar JPG.
Semua file di memori ini kartu akan menjadi JPGs.
Kemudian, setelah Anda menemukan awal, Anda akan membuka JPG baru, yang
adalah, seperti, membuat JPG, dan menulis 512 byte pada suatu waktu sampai JPG baru
ditemukan, dan mengakhiri program, setelah Anda mendeteksi akhir file.
>> Jadi langkah pertama pertama adalah untuk membuka file kartu memori.
Tapi kau tahu ini sudah, dan ada file I / O fungsi yang akan
terbukti sangat berguna.
OK.
Jadi apa yang JPGs?
Karena kita perlu awal itu.
Nah, JPGs, seperti peta bit, hanya urutan byte.
Untungnya, setiap JPG dimulai dengan baik 0xff, 0xD8, 0xff, 0xE0, satu urutan
byte, atau yang lain urutan byte.
>> Jadi mereka empat byte menunjukkan awal JPG.
Tidak ada selain yang dua kombinasi dari empat byte.
Dan untungnya bagi kita, fakta lain bahwa kita dapat mengambil keuntungan dari adalah bahwa setiap
JPG disimpan side-by-side pada kartu memori.
Aku sudah mewakili struktur kartu memori skema ini
geser sini.
Di sini, setiap persegi, persegi panjang setiap, mewakili 512 byte, dan mulai
dengan abu-abu dalam bahwa kita tidak benar-benar memiliki sebuah JPG.
>> Tapi kemudian kami akhirnya memukul blok dengan bintang.
Itu berarti bahwa empat byte pertama keluar 512 dari mereka adalah salah satu dari dua
mulai urutan JPG.
Dan kami pergi dari sana, dan kemudian sekali satu JPG berakhir, yang berikutnya dimulai.
Kami tidak pernah memiliki lagi ruang abu-abu di antara keduanya.
>> Tapi bagaimana kita benar-benar membaca ini, dan membaca 512 byte sehingga kita dapat membuat
perbandingan tempat pertama?
Nah, mari kita kembali ke fread, yang mengambil dalam struct yang akan berisi
byte yang Anda baca.
Jadi Anda akan menempatkan mereka yang ada -
ukuran, jumlah, dan kemudian inpointer bahwa Anda membaca dari.
Sekarang, kita ingin membaca 512 pada satu waktu, dan kita ingin menyimpan ini dalam buffer,
Aku akan menyebutnya.
>> Pada dasarnya, kita akan terus ke mereka 512 byte dan melakukan
hal dengan itu, kan?
Kita juga akan membandingkan pertama empat byte, atau kita akan
membacanya dalam, OK?
Jadi data pointer kemudian akan berfungsi sebagai buffer Anda, dan
inpointer, well, itu hanya akan menjadi kartu memori Anda.
>> Kembali ke skema kartu memori kita.
Kita akan membaca 512 byte pada suatu waktu, menyimpan setiap blok 512-byte
ke dalam buffer, memegang mereka penyangga, mereka 512 byte, sampai kita tahu
apa yang harus dilakukan mereka.
Jadi awalnya tidak apa-apa, jadi kita akan membaca buffer, membandingkannya, dan
kita tidak perlu melakukan apa-apa dengan itu.
Dan kemudian, kami akhirnya memukul sebuah bintang blok, yang berarti bahwa kita sudah
menemukan JPG pertama kami.
Jadi buffer sekarang memegang byte dari JPG itu.
>> Lain kali 512 byte, karena mereka bukan blok bintang, juga
bagian dari JPG itu.
Dan JPGs adalah kontinu dari sana di dalam, sampai kita memukul JPG berikutnya.
Dan kemudian buffer kemudian memegang 512 byte untuk JPG itu, dan
seterusnya, dan sebagainya.
OK.
>> Jadi setelah Anda menekan pertama starred blok, pertama JPG, bagaimana Anda
sebenarnya, baik, membukanya?
Mari kita membuat JPG baru.
Nama file untuk file JPG akan dalam format, nomor, nomor,
number.jpg, dalam bahwa mereka disebutkan dalam urutan di mana mereka ditemukan,
mulai dari 0.
>> Jadi JPG pertama yang Anda menemukan akan 000.jpg.
Jadi, mungkin ide yang baik untuk melacak berapa banyak JPGs Anda telah menemukan sejauh ini.
Jadi itulah nama file.
Tapi bagaimana Anda benar-benar membuat itu?
Nah, kita akan menggunakan fungsi yang disebut sprintf.
Sedikit mirip dengan printf, di mana Anda dapat menggunakan penampung untuk string,
kecuali dalam hal ini, sprintf akan mencetak file keluar ke saat ini
direktori, bukan ke terminal.
>> OK.
Jadi di sini kita melihat bahwa kita memiliki judul, array char yang akan menyimpan
string yang dihasilkan, dan kami lulus dalam judul string yang sebenarnya dengan
placeholder, sama seperti kita belajar untuk melakukan dengan printf.
Tapi kode ini yang saya miliki di sini akan memberikan 2.jpg, bukan 002.jpg.
Jadi aku akan meninggalkan Anda untuk mengetahui bagaimana memodifikasi placeholder untuk membuat
nama yang benar.
>> OK.
Jadi setelah Anda sprintf'd maka Anda dapat membuka file itu, karena itu ada dalam
direktori Anda, dengan fopen, menggunakan judul, dan kemudian modus apapun yang Anda inginkan
untuk membuka file yang masuk
Jadi sekarang kita telah membuka file JPG baru, sekarang kita dapat menulis 512 byte pada
waktu, sampai JPG baru ditemukan.
Jadi mari kita lihat lagi pada sintaks fwrite.
>> Aku tahu bahwa aku menunjukkan geser ini banyak, tapi aku hanya ingin memastikan bahwa
kalian jangan terlalu bingung, karena Aku tahu bahwa itu sangat mudah untuk
mencampur pertama dan terakhir argumen, khususnya.
Tapi ingat bahwa Anda sedang menulis dari penyangga Anda ke gambar file yang keluar.
>> Sekarang Anda tahu bagaimana menulis 512 byte ke dalam file JPG Anda bahwa Anda telah
diciptakan, baik, kita ingin menghentikan itu Proses setelah kami telah mencapai akhir dari
kartu kami, karena tidak akan ada lagi gambar yang akan ditemukan.
Jadi mari kita kembali ke fread sekali lagi, aku janji.
fread kembali berapa banyak item ukuran, ukuran, sudah siap di berhasil.
Idealnya, ini akan menjadi apa pun Anda lulus dalam nomor, kan?
Karena Anda mencoba untuk membaca nomor elemen ukuran, ukuran.
Tapi jika fread tidak mampu membaca bahwa jumlah elemen, maka akan kembali
apapun nomor itu membaca sukses.
>> Sekarang, satu hal penting yang perlu diperhatikan adalah bahwa jika Anda menggunakan file lain I / O
berfungsi seperti fgetc, juga akan kembali berapa banyak item yang membaca berhasil.
Apa yang berguna tentang fungsi ini bahwa jika Anda menggunakan fungsi dalam sebuah
kondisi, itu akan mengeksekusi dirinya sendiri sementara menentukan kondisi tersebut, yang
hanya benar-benar berguna.
Jadi jika Anda memiliki kondisi ini, misalnya, jika buffer fread, DOG sizeof, 2,
pointer, sama sama dengan 1, yang berarti bahwa saya ingin membaca
2 anjing pada saat itu.
Tetapi jika fread kembali 1 bukan 2 sebagai diharapkan, itu berarti bahwa ada 2
anjing yang tersisa di file saya, melainkan 1.
Namun jika ia mengembalikan 2, maka saya masih memiliki orang-2 anjing di dalam buffer saya.
>> Jadi sekarang yang memberi Anda rasa bagaimana memeriksa akhir file, tapi
mari kita pergi melalui sekarang logika.
Bagaimana kita benar-benar sepotong semua elemen ini bersama-sama?
Setelah kita memukul JPG pertama kami, karena kita tahu bahwa JPGs disimpan
contiguously, kita akan menulis sampai kita mencapai akhir dari file kartu.
Tapi kita tidak ingin menulis apa-apa sampai saat itu.
Jadi itu penting, bukan hanya itu kita berada di awal dari JPG baru, tapi apakah
kita sudah menemukan JPG atau tidak.
>> Jika Ini adalah awal dari sebuah JPG baru, kita akan ingin menutup file JPG kami saat ini jika
kami memiliki satu terbuka, dan terbuka yang baru untuk menulis ke dalam.
Jika tidak awal JPG baru, Namun, kami akan menyimpan file JPG yang sama
membuka dan menulis ke dalam.
Kami akan menulis penyangga kami ke mana JPG file yang kita buka, asalkan
kita memiliki satu terbuka, tentu saja.
Jika kita belum menemukan JPG pertama kami Namun, kami tidak menulis apa-apa.
Dan proses ini terus berlanjut sampai Anda mencapai akhir file kartu.
>> Dan akhirnya, Anda akan ingin untuk membuat Pastikan bahwa Anda fclose setiap
file yang telah Anda fopened.
Setelah Anda merasa nyaman dengan konsep, lihatlah beberapa
pseudocode, yang saya sudah disertakan di sini.
Pertama, Anda ingin membuka file kartu, dan kemudian ulangi proses berikut
sampai Anda telah mencapai akhir kartu.
Anda ingin membaca 512 byte ke dalam buffer.
Menggunakan penyangga itu, Anda akan ingin memeriksa apakah Anda di awal dari sebuah
JPG baru atau tidak.
Dan jawaban untuk pertanyaan yang akan mempengaruhi manajemen file Anda -
file yang Anda buka, yang mana yang anda tutup.
>> Lalu, apakah Anda sudah menemukan JPG?
Bagaimana Anda telah menjaga track itu?
Kemudian, tergantung pada itu, Anda akan baik menulis ke JPG saat ini yang Anda
telah terbuka, atau tidak menulis sama sekali, karena Anda belum menemukan JPG belum.
Akhirnya, setelah Anda mencapai akhir file, Anda akan ingin untuk menutup
file yang telah Anda buka tersisa.
Kami ingin menjadi rapi di sini.
>> Dan dengan itu, Anda telah pulih semua file yang hilang dari memori yang
kartu, yang merupakan prestasi yang cukup menakjubkan.
Jadi menepuk diri di bagian belakang.
Tapi, ada satu elemen lagi untuk yang PSET, yang merupakan kontes.
Anda akan menemukan bahwa semua gambar bahwa Anda telah benar-benar pulih
gambar staf CS50 itu.
Jadi jika Anda berada di kampus atau di suatu tempat dekat, maka Anda dapat mengambil gambar dengan
staf, dan bagian yang memiliki sebagian gambar dengan anggota staf
dari file mereka dipulihkan akan mendapatkan hadiah yang mengagumkan.
Dengan itu, maka Anda telah selesai sembuh PSET.
Nama saya adalah Zamyla, dan ini adalah CS50.