[Powered by Google Translate] [Walkthrough - Masalah Set 4] [Zamyla Chan - Harvard University] [Ini adalah CS50. - CS50.TV] Baiklah. Halo, semua orang, dan selamat datang Walkthrough 4. Hari pset kami adalah Forensik. Forensik adalah pset benar-benar menyenangkan yang melibatkan berurusan dengan file bitmap untuk menemukan siapa melakukan kejahatan. Kemudian kita akan mengubah ukuran beberapa file bitmap, maka kita juga akan berurusan dengan bagian benar-benar menyenangkan disebut Recover, di mana kita pada dasarnya menyerahkan kartu memori di mana seseorang telah sengaja menghapus semua file mereka, dan kami diminta untuk memulihkan file-file. Tapi pertama-tama, sebelum kita masuk ke pset, saya benar-benar hanya ingin mengucapkan selamat kepada semua orang. Kami sekitar pada titik tengah dari kursus ini. Kuis 0 adalah di belakang kami, dan kami berada di pset4, jadi pada dasarnya, kita setengah. Kami telah datang jauh jika Anda melihat kembali ke psets Anda, pset0 dan pset1, jadi selamat kepada diri sendiri tentang hal itu, dan kita akan masuk ke beberapa hal yang sangat menyenangkan. Jadi toolbox kami untuk pset ini, sekali lagi, bukannya menjalankan sudo yum-y update, kami dapat hanya menjalankan update50 jika Anda berada di versi 17,3 dan di atas alat. Jadi pastikan untuk menjalankan update50 - itu jauh lebih mudah, karakter yang kurang beberapa - untuk memastikan bahwa Anda berada di versi terbaru dari alat. Terutama penting untuk update50 ketika kita mulai menggunakan CS50 Periksa. Jadi pastikan bahwa Anda melakukan itu. Untuk semua bagian untuk pset ini, kita akan berurusan dengan input file dan output, file I / O. Kita akan terjadi lebih banyak program yang berhubungan dengan array menunjuk ke file dan hal-hal seperti itu, jadi kami ingin memastikan bahwa kita benar-benar akrab dan nyaman berurusan dengan bagaimana input dan output ke dalam file. Dalam kode distribusi untuk pset ini adalah sebuah file yang bernama copy.c, dan itulah apa yang kita akan menemukan akan menjadi benar-benar berguna bagi kita karena kita akan benar-benar berakhir menyalin file copy.c dan hanya mengubah sedikit untuk bisa mencapai 2 bagian pertama dari sejumlah masalah. Dan begitu kemudian seperti yang saya sebutkan sebelumnya, kita berhadapan dengan bitmap serta JPEGs. Jadi benar-benar memahami struktur bagaimana file tersebut diatur, bagaimana kita benar-benar bisa menerjemahkan 0s dan 1s dalam structs dan hal-hal yang kita benar-benar bisa memahami dan menafsirkan dan mengedit, yang akan benar-benar penting, sehingga akan menjadi JPEG dan file bitmap dan memahami struktur dari mereka. Pset4, seperti biasa, dimulai dengan bagian pertanyaan. Mereka akan berurusan dengan file I / O dan membuat Anda terbiasa untuk itu. Kemudian bagian 1 adalah cerita detektif, di mana Anda diberi sebuah file bitmap yang terlihat jenis seperti titik-titik merah di seluruh. Dan kemudian pada dasarnya apa yang akan kita lakukan adalah mengambil file ini dan hanya mengeditnya sedikit menjadi versi yang dapat kita baca. Pada dasarnya, setelah kami selesai, kami akan memiliki file yang sama, kecuali kita akan dapat melihat pesan tersembunyi tersembunyi oleh semua titik merah. Kemudian Resize adalah program yang, mengingat file dan kemudian diberi nama dari file yang output dan kemudian diberi nomor juga, benar-benar akan mengubah ukuran bitmap bahwa dengan itu nilai integer. Kemudian yang terakhir, kita memiliki pset Recover. Kami diberi kartu memori dan kemudian harus memulihkan semua foto yang telah sengaja dihapus, tetapi, seperti yang akan kita pelajari, tidak benar-benar dihapus dan dihapus dari file; kita hanya semacam hilang di mana mereka berada di file, tapi kami akan memulihkan. Besar. Jadi pergi ke file I / O khusus, ini adalah daftar seluruh fungsi yang akan Anda gunakan. Anda sudah melihat sedikit dasar-dasar fopen, fread, dan fwrite, tapi kita akan melihat lebih jauh ke beberapa file I / O fungsi seperti fputc, di mana Anda hanya menulis satu karakter pada satu waktu, untuk fseek, di mana Anda jenis memindahkan indikator posisi file maju dan mundur, dan kemudian beberapa orang lain. Tapi kita akan pergi ke yang sedikit kemudian selama pset tersebut. Jadi pertama, hanya untuk masuk ke file I / O sebelum kita masuk ke pset tersebut, untuk membuka file, misalnya, apa yang harus Anda lakukan adalah benar-benar mengatur pointer ke file tersebut. Jadi kita memiliki pointer * FILE. Dalam kasus ini, saya menyebutnya sebagai pointer dalam karena itu akan menjadi saya infile. Dan jadi aku akan menggunakan fopen fungsi dan kemudian nama file dan kemudian mode di mana aku akan berurusan dengan file tersebut. Jadi ada "r" dalam kasus ini untuk membaca, "w" untuk menulis, dan kemudian "a" untuk menambahkan. Misalnya, ketika Anda sedang berhadapan dengan infile dan semua yang ingin Anda lakukan adalah membaca bit dan byte disimpan di sana, maka Anda mungkin akan ingin menggunakan "r" sebagai mode Anda. Bila Anda ingin benar-benar menulis, jenis membuat file baru, maka apa yang akan kita lakukan adalah kita akan membuka file baru dan menggunakan "w" modus untuk menulis. Jadi ketika Anda benar-benar membaca ke dalam file, struktur adalah sebagai berikut. Pertama Anda termasuk pointer ke struct yang akan berisi byte yang Anda baca. Sehingga akan menjadi lokasi akhir byte yang Anda baca. Anda kemudian akan mengindikasikan ukuran, seperti pada dasarnya berapa banyak byte Program Anda harus membaca ke file, ukuran dasarnya adalah satu elemen, dan kemudian Anda akan menentukan berapa banyak elemen yang ingin Anda baca. Dan akhirnya, Anda harus tahu di mana Anda membaca dari, sehingga akan menjadi pointer dalam Anda. Aku warna-kode ini karena fread juga sangat mirip dengan fwrite, kecuali Anda ingin memastikan bahwa Anda menggunakan urutan yang benar, pastikan bahwa Anda benar-benar menulis atau membaca dari file kanan. Jadi seperti sebelumnya, jika kita memiliki ukuran elemen serta jumlah elemen, maka kita bisa bermain-main di sini sedikit. Katakanlah saya memiliki struct DOG dan kemudian saya ingin membaca dua anjing pada suatu waktu. Apa yang saya bisa lakukan adalah mengatakan ukuran satu elemen akan menjadi ukuran satu ANJING dan aku akan benar-benar membaca dua dari mereka. Atau, apa yang bisa saya lakukan adalah mengatakan saya hanya akan membaca satu elemen dan bahwa salah satu unsur yang akan menjadi ukuran dari dua anjing. Jadi itulah bagaimana Anda dapat analog jenis bermain-main dengan ukuran dan jumlah tergantung pada apa yang lebih intuitif untuk Anda. Baiklah. Jadi sekarang kita bisa menulis file. Bila Anda ingin menulis file, argumen pertama sebenarnya di mana Anda membaca dari. Sehingga pada dasarnya data yang Anda akan menulis ke dalam file, yang merupakan pointer keluar di akhir. Jadi, ketika Anda sedang berhadapan dengan pset, pastikan Anda tidak bingung. Mungkin memiliki sisi definisi berdampingan. Anda dapat menarik definisi di manual dengan mengetikkan manusia dan kemudian fwrite, misalnya, di terminal, atau Anda dapat merujuk kembali ke slide ini dan pastikan bahwa Anda menggunakan yang tepat. Jadi sekali lagi, untuk fwrite, bila Anda memiliki file yang Anda ingin menulis ke, yang akan menjadi argumen terakhir dan itu akan menjadi pointer ke file tersebut. Jadi itulah bagaimana kita berurusan dengan menulis mungkin beberapa byte pada suatu waktu, tapi katakan Anda ingin hanya menulis hanya dalam satu karakter tunggal. Seperti yang akan kita lihat nanti dalam contoh ini, dalam bitmaps kita harus menggunakannya. Saat itulah kita dapat menggunakan fputc, pada dasarnya hanya menempatkan satu karakter pada satu waktu, chr, ke pointer file, dan itu keluar kami pointer sana. Jadi setiap kali kita mencari atau menulis dalam sebuah file, file melacak di mana kita berada. Jadi itu adalah semacam kursor, indikator posisi file. Dan sehingga setiap kali kita menulis atau membaca lagi ke sebuah file, file benar-benar mengingat di mana itu, dan begitu terus dari mana kursor berada. Hal ini dapat bermanfaat bila Anda ingin, katakanlah, baca dalam jumlah tertentu untuk melakukan sesuatu dan kemudian membaca dalam jumlah berikut, tapi kadang-kadang kita mungkin ingin kembali atau benar-benar mulai dari nilai referensi tertentu. Jadi fungsi fseek, apa yang dilakukannya adalah memungkinkan kita untuk memindahkan kursor dalam file tertentu sejumlah byte. Dan kemudian apa yang harus kita lakukan adalah menentukan di mana nilai referensi. Jadi baik itu bergerak maju atau mundur dari mana kursor saat ini, atau kita dapat menetapkan bahwa ia hanya harus bergerak dari awal file atau dari akhir file. Dan sehingga Anda dapat lulus dalam nilai negatif atau positif terhadap jumlah, dan itu akan seperti memindahkan kursor baik maju atau mundur. Sebelum kita masuk ke psets lainnya, pertanyaan pada file I / O? Oke. Ketika kita masuk ke lebih banyak contoh, jangan ragu untuk menghentikan saya untuk pertanyaan. Jadi dalam cerita detektif, Anda menyerahkan file bitmap yang mirip dengan ini satu merah pada slide, dan terlihat seperti ini - sekelompok titik-titik merah - dan Anda tidak benar-benar tahu apa yang tertulis. Jika Anda juling, Anda mungkin dapat melihat warna kebiruan sedikit di dalam tengah. Pada dasarnya, di situlah teks disimpan. Ada pembunuhan yang terjadi, dan kita perlu mencari tahu siapa yang melakukannya. Untuk melakukan itu, kita perlu semacam mengkonversi gambar ini ke dalam format yang mudah dibaca. Jika kalian pernah mengalami hal ini, terkadang akan ada sedikit kit di mana Anda akan memiliki kaca pembesar dengan film merah. Siapa saja? Ya. Jadi Anda akan menjadi sesuatu tangan seperti ini, Anda akan memiliki kaca pembesar dengan film merah di atasnya, Anda akan meletakkannya di atas gambar, dan Anda akan dapat melihat pesan tersembunyi di dalamnya. Kami tidak memiliki kaca pembesar dengan film merah, jadi alih-alih kita akan menciptakan jenis kita sendiri di pset ini. Dan sehingga pengguna akan cerita detektif masukan, maka petunjuk tersebut,. Bmp, sehingga itulah infile, itulah pesan red dot, dan kemudian mereka mengatakan verdict.bmp akan menjadi outfile kami. Jadi itu akan membuat gambar bitmap baru yang mirip dengan petunjuk yang kecuali dalam format yang mudah dibaca di mana kita dapat melihat pesan tersembunyi. Karena kita akan berurusan dengan mengedit dan memanipulasi bitmap dari beberapa macam, kita akan jenis menyelam di dalam struktur file-file bitmap. Kami pergi selama ini agak sedikit di kuliah, tapi mari kita melihat ke mereka lagi. Bitmaps pada dasarnya hanya sebuah susunan byte di mana kita telah ditentukan yang byte berarti apa. Jadi di sini adalah jenis seperti peta gambar bitmap mengatakan bahwa hal itu dimulai dengan beberapa file header, dimulai dengan beberapa informasi di sana. Anda lihat bahwa pada sekitar byte nomor 14 ukuran ditunjukkan gambar bitmap, dan terus selanjutnya. Tapi kemudian apa yang kita benar-benar tertarik di sini mulai di nomor byte 54. Kami memiliki tiga kali lipat tersebut RGB. Apa yang akan lakukan adalah mengandung piksel yang sebenarnya, nilai warna. Segala sesuatu di atas yang di header adalah beberapa informasi sesuai dengan ukuran gambar, lebar gambar, dan ketinggian. Ketika kita masuk ke bantalan nanti, kita akan melihat mengapa ukuran gambar mungkin berbeda dari lebar atau ketinggian. Jadi untuk mewakili ini - gambar-gambar bitmap adalah urutan byte - apa yang bisa kita lakukan adalah mengatakan apa-apa, aku akan ingat bahwa pada indeks 14, situlah ukurannya, misalnya, melainkan apa yang akan kita lakukan untuk membuat ini lebih mudah yang merangkum dalam sebuah struct. Dan jadi kita memiliki dua struct dibuat untuk kita, seorang BITMAPFILEHEADER dan BITMAPINFOHEADER a, dan sehingga setiap kali kita membaca ke file tersebut, secara default itu akan terjadi dalam rangka, dan sebagainya dalam rangka itu juga akan mengisi ke dalam variabel seperti biWidth dan biSize. Dan akhirnya, setiap pixel diwakili oleh tiga byte. Yang pertama adalah jumlah dari biru di pixel, yang kedua adalah jumlah warna hijau, dan akhirnya, jumlah warna merah, di mana 0 adalah tidak ada dasarnya hijau biru atau tidak ada atau tidak merah dan kemudian ff adalah nilai maksimum. Ini adalah nilai-nilai heksadesimal. Jadi jika kita memiliki ff0000, maka yang sesuai dengan jumlah maksimum biru dan kemudian tidak hijau dan tidak ada merah, jadi maka itu akan memberi kita pixel biru. Kemudian jika kita memiliki semua ff di seluruh papan, maka itu berarti bahwa kita memiliki piksel putih. Ini adalah jenis berlawanan dengan biasanya ketika kita mengatakan RGB. Ini benar-benar akan BGR. Jadi, jika kita benar-benar melihat ke contoh gambar bitmap - biarkan aku menarik satu di sini. Ini adalah kecil. Aku meluncur masuk, dan kita bisa melihat itu pixelated. Sepertinya blok warna. Anda memiliki blok putih dan kemudian blok merah. Jika Anda bermain di Microsoft Paint, misalnya, Anda bisa membuat sesuatu seperti itu by dasarnya hanya melukis kotak tertentu dalam urutan tertentu. Jadi apa ini diterjemahkan dalam bitmap adalah sebagai berikut. Di sini kita memiliki piksel putih pertama, bahwa semua adalah milik 6 f, dan kemudian kita memiliki piksel merah, ditunjukkan oleh 0000FF. Dan sehingga urutan byte yang kita miliki menunjukkan bagaimana gambar bitmap akan terlihat. Jadi apa yang saya lakukan di sini hanya ditulis semua byte dan kemudian berwarna merah sehingga Anda dapat melihat jenis, jika Anda juling sedikit, bagaimana semacam itu menunjukkan wajah tersenyum. Cara yang bitmap gambar kerja adalah saya membayangkannya dasarnya sebagai kotak. Dan sebagainya secara default, setiap baris dari grid harus kelipatan dari 4 byte. Jika kita melihat sebuah gambar bitmap, Anda mengisi nilai setiap. Misalnya, Anda mungkin memiliki merah di sini, di sini hijau, biru di sini, tetapi Anda harus memastikan bahwa gambar diisi dengan kelipatan empat byte. Jadi jika saya ingin gambar saya menjadi tiga blok yang luas, maka saya harus menempatkan nilai kosong dalam yang terakhir untuk membuatnya kelipatan empat. Jadi saya akan menambahkan sesuatu yang kita panggil padding. Aku hanya akan menunjukkan bahwa ada suatu dengan x. Sekarang katakanlah kita ingin gambar yang 7 piksel panjang, misalnya. Kami memiliki 1, 2, 3, 4, 5, 6, 7, dan semua yang diisi dengan warna. Cara bahwa gambar bitmap bekerja adalah bahwa kita memerlukan 8. Saat ini kami memiliki 1, 2, 3, 4, 5, 6, 7. Kita perlu 8 ruang untuk gambar bitmap untuk membaca dengan benar. Jadi apa yang harus kita lakukan adalah menambahkan hanya sedikit padding untuk memastikan bahwa semua lebar yang seragam dan bahwa semua lebar merupakan kelipatan dari 4. Dan jadi saya sebelumnya menunjukkan, pelapis sebagai x atau berlekuk-lekuk garis, tetapi dalam gambar bitmap yang sebenarnya padding ditandai dengan 0 heksadesimal. Jadi itu akan menjadi karakter tunggal, 0. Apa yang mungkin berguna adalah perintah xxd. Apa yang dilakukannya adalah benar-benar menunjukkan Anda, seperti mirip dengan apa yang saya lakukan sebelumnya dengan tersenyum ketika saya benar-benar dicetak apa yang masing-masing warna akan untuk pixel dan kemudian warna-kode itu, ketika Anda menjalankan xxd dengan perintah berikut, maka benar-benar akan mencetak apa warna bagi mereka piksel. Apa yang harus Anda lakukan adalah di sini saya menunjukkan, seperti s-54 mengatakan bahwa aku akan mulai pada byte 54 karena sebelum itu, ingat jika kita melihat kembali ke peta bitmap, itu semua informasi header dan hal-hal seperti itu. Tapi apa yang kita benar-benar peduli adalah pixel aktual yang menunjukkan warna. Jadi dengan menambahkan pada bendera itu,-s 54, maka kita dapat melihat nilai warna. Dan jangan khawatir tentang bendera rumit dan hal-hal seperti itu. Dalam spec sejumlah masalah, Anda akan memiliki petunjuk tentang cara menggunakan xxd untuk menampilkan piksel. Jadi jika Anda lihat di sini, itu semacam tampak seperti kotak hijau, ini hal kecil. Saya sudah diberi warna 00FF00 sebagai dasarnya mengatakan tidak biru, banyak hijau, dan tidak ada merah. Sehingga sesuai dengan hijau. Seperti yang Anda lihat di sini, kita melihat persegi panjang hijau. Ini persegi panjang hijau hanya 3 pixel, sehingga kemudian apa yang harus kita lakukan untuk memastikan bahwa gambar merupakan kelipatan dari 4 lebar menambahkan padding tambahan. Dan begitu maka itulah bagaimana Anda melihat 0s ini di sini. Ini benar-benar akan menjadi hasil dari pset Resize Anda, pada dasarnya mengambil bitmap kecil dan kemudian memperbesarnya dengan 4. Dan jadi apa yang kita lihat adalah bahwa sebenarnya gambar ini adalah 12 pixel, tetapi 12 merupakan kelipatan dari 4, dan jadi kita benar-benar tidak melihat 0s di akhir karena kita tidak perlu menambahkan karena itu sepenuhnya empuk. Itu tidak memiliki ruang lagi. Oke. Setiap pertanyaan tentang bantalan? Oke. Cool. Seperti yang saya sebutkan sebelumnya, bitmaps hanya urutan byte. Dan jadi apa yang kita miliki adalah bukan perlu melacak persis jumlah byte sesuai dengan elemen tertentu, kita benar-benar telah menciptakan struct untuk menyatakan bahwa. Jadi apa yang kita miliki adalah struct RGBTRIPLE. Kapanpun Anda memiliki sebuah instance dari sebuah tiga RGB, karena ini adalah tipe mendefinisikan struct, maka Anda dapat mengakses variabel rgbtBlue, sama variabel Hijau dan Merah, yang akan menunjukkan berapa banyak biru, hijau, dan merah, masing-masing, yang Anda miliki. Jadi jika kita memiliki set variabel biru 0, set hijau untuk ff, yang merupakan nilai maksimum Anda dapat memiliki, dan kemudian variabel merah set ke 0, maka warna apa yang akan ini RGB tertentu mewakili tiga? >> [Mahasiswa] Green. Green. Tepat. Ini akan berguna untuk mengetahui bahwa setiap kali Anda memiliki sebuah instance dari sebuah tiga RGB, Anda benar-benar dapat mengakses jumlah warna - biru, hijau, dan merah - secara terpisah. Sekarang kita sudah bicara tentang struktur itu, mari kita lihat file BMP. Ini adalah struct dibuat untuk Anda. Di sini kita memiliki struct BITMAPFILEHEADER. Yang menarik adalah ukuran. Kemudian, kita memiliki header info, yang memiliki beberapa hal yang menarik untuk kita, yaitu ukuran, lebar, dan tinggi. Seperti kita akan masuk ke kemudian, ketika Anda membaca ke file tersebut, secara otomatis membaca di karena kami telah menetapkan perintah harus sama. Jadi biSize akan berisi byte yang tepat yang sesuai dengan ukuran sebenarnya dari gambar. Dan maka di sini, terakhir, seperti yang kita bicarakan, kita memiliki struct typedef RGBTRIPLE. Kami memiliki rgbtBlue, Hijau, dan Merah yang terkait dengannya. Besar. Oke. Sekarang kita mengerti bitmap sedikit, memahami bahwa kita memiliki file header dan header informasi yang terkait dengan itu dan kemudian setelah itu, kita memiliki hal menarik dari warna, dan warna-warna yang diwakili oleh structs RGBTRIPLE, dan mereka, pada gilirannya, memiliki tiga nilai yang terkait dengan biru, hijau, dan merah. Jadi sekarang, kita dapat berpikir tentang jenis Recover sedikit. Maaf. Pikirkan tentang cerita detektif. Ketika kita memiliki file petunjuk kami, maka apa yang kita ingin lakukan adalah membaca itu pixel demi pixel dan kemudian entah bagaimana mengubah mereka piksel sehingga kita dapat output ke dalam format yang mudah dibaca. Dan sehingga untuk output itu, kita akan menulis pixel demi pixel ke dalam file verdict.bmp. Itu semacam banyak yang harus dilakukan. Kami menyadari bahwa. Jadi apa yang kita lakukan adalah kita sudah benar-benar memberikan Anda copy.c. Apa copy.c tidak hanya membuat salinan persis dari file bitmap yang diberikan dan kemudian output itu. Jadi ini sudah membuka file untuk Anda, membaca dalam pixel demi pixel, dan kemudian menulis ke dalam file output. Mari kita lihat pada saat itu. Ini adalah memastikan penggunaan yang tepat, mendapatkan nama file di sini. Apa yang dilakukan adalah ia menetapkan file masukan untuk menjadi apa yang kita telah melewati di dalam infile sini, yang kedua kami baris perintah argumen. Cek untuk memastikan bahwa kita dapat membuka file tersebut. Cek untuk memastikan kita bisa membuat outfile baru di sini. Lalu apa hal ini di sini, itu hanya pada dasarnya mulai membaca ke file bitmap dari awal. Awal, seperti yang kita ketahui, mengandung BITMAPFILEHEADER tersebut, dan sehingga mereka urutan bit secara langsung akan mengisi BITMAPFILEHEADER tersebut. Jadi apa yang kita miliki di sini mengatakan bahwa bf BITMAPFILEHEADER - itu variabel baru kami BITMAPFILEHEADER jenis - kita akan dimasukkan ke dalam bf apa yang kita baca dari dalam pointer, yang kami infile. Berapa banyak kita baca? Kita membaca dalam berapa banyak byte kita perlu mengandung BITMAPFILEHEADER keseluruhan. Demikian pula, itulah yang kita lakukan untuk header info. Jadi kita terus bersama file kita di infile, dan kami sedang membaca yang bit dan byte, dan kami memasukkan mereka langsung di ke dalam contoh dari variabel yang kita membuat. Di sini kami hanya memastikan bahwa bitmap adalah bitmap. Sekarang kita memiliki outfile, kan? Jadi seperti berdiri ketika kita menciptakannya, itu pada dasarnya kosong. Jadi pada dasarnya kita harus membuat bitmap baru dari awal. Apa yang kita lakukan adalah kita harus memastikan bahwa kita copy dalam file header dan header informasi seperti infile memiliki. Apa yang kita lakukan adalah kita menulis - dan ingat bahwa bf adalah variabel dari BITMAPFILEHEADER jenis, sehingga apa yang kita lakukan adalah kita hanya menggunakan konten yang untuk menulis ke outfile tersebut. Di sini, ingat kita berbicara tentang padding, bagaimana hal itu penting untuk memastikan bahwa jumlah pixel yang kita miliki merupakan kelipatan dari 4. Ini adalah formula yang cukup berguna untuk menghitung berapa banyak bantalan yang Anda miliki mengingat lebar file Anda. Saya ingin kalian ingat bahwa di copy.c kita memiliki rumus untuk menghitung padding. Oke? Jadi setiap orang ingat itu. Besar. Jadi apa yang copy.c lakukan selanjutnya itu iterates atas semua scanlines. Ini melewati baris pertama dan kemudian menyimpan setiap tiga yang berbunyi dan kemudian menulis ke outfile tersebut. Jadi di sini kita membaca hanya satu RGB tiga pada suatu waktu dan kemudian menempatkan bahwa tiga sama ke outfile tersebut. Bagian tersulit adalah bahwa padding bukan tiga RGB, dan sehingga kita tidak bisa hanya membaca bahwa jumlah padding tiga kali lipat RGB. Apa yang harus kita lakukan sebenarnya hanya memindahkan indikator file posisi kami, kami memindahkan kursor, untuk jenis melompati semua padding sehingga kita berada di baris berikutnya. Dan kemudian apa hal ini adalah salinan menunjukkan Anda bagaimana Anda mungkin ingin menambahkan padding. Jadi kita telah menghitung berapa banyak bantalan yang kita butuhkan, sehingga berarti bahwa kita membutuhkan jumlah padding 0s. Apa yang dilakukan adalah untuk loop yang menempatkan jumlah padding 0s ke outfile kami. Dan akhirnya, Anda menutup kedua file. Anda menutup infile serta outfile tersebut. Jadi begitulah copy.c bekerja, dan itu akan menjadi sangat berguna. Alih-alih hanya benar-benar secara langsung menyalin dan paste atau hanya melihat dan mengetik dalam apa pun yang Anda inginkan, Anda mungkin hanya ingin menjalankan perintah ini di terminal, cp copy.c whodunit.c, yang akan membuat file baru, whodunit.c, yang berisi konten yang sama persis seperti copy tidak. Jadi apa yang bisa kita lakukan adalah menggunakan itu sebagai kerangka yang di atasnya untuk membangun dan mengedit untuk file cerita detektif kami. Ini adalah kita-dos lakukan untuk cerita detektif, tapi apa tidak copy.c sebenarnya mengurus sebagian besar dari mereka untuk kita. Jadi semua yang perlu kita lakukan selanjutnya adalah mengubah piksel yang diperlukan untuk benar-benar membuat file yang dapat dibaca. Ingat bahwa untuk pixel diberikan tiga, sehingga untuk variabel tertentu RGBTRIPLE jenis, Anda dapat mengakses, nilai-nilai hijau biru, dan merah. Itu akan berguna karena jika Anda dapat mengaksesnya, yang berarti bahwa Anda juga dapat memeriksa mereka, dan itu berarti bahwa Anda juga dapat mengubahnya. Jadi ketika kita kembali ke contoh kaca pembesar merah kami, pada dasarnya, yang bertindak sebagai semacam filter bagi kita. Jadi apa yang ingin kita lakukan adalah kita ingin menyaring semua tiga kali lipat yang datang masuk Ada beberapa cara berbeda untuk melakukan hal ini. Pada dasarnya, Anda dapat memiliki apa pun jenis filter yang Anda inginkan. Mungkin Anda ingin mengubah semua piksel merah atau mungkin Anda ingin mengubah piksel warna yang berbeda dengan warna yang berbeda. Itu terserah Anda. Ingat bahwa Anda dapat memeriksa apa warna pixel adalah dan kemudian Anda juga bisa mengubahnya karena Anda akan melalui. Oke. Jadi itulah cerita detektif. Setelah Anda menjalankan cerita detektif, Anda akan tahu siapa biang keladi kejahatan itu. Sekarang kita akan pergi ke Resize. Kita akan tetap berurusan dengan bitmap. Apa yang akan kita lakukan adalah kita akan memiliki bitmap masukan dan kemudian kita akan lulus dalam sebuah nomor dan kemudian mendapatkan bitmap outfile di mana itu pada dasarnya kami infile skala oleh n. Katakanlah file saya adalah hanya satu pixel yang besar. Kemudian jika n saya 3, scaling dengan 3, maka saya akan mengulangi bahwa pixel n beberapa kali, sehingga 3 kali, dan kemudian juga skala itu turun 3 kali juga. Jadi Anda melihat saya skala secara vertikal maupun horizontal. Dan kemudian inilah contoh. Jika Anda memiliki n = 2, Anda melihat bahwa pixel biru pertama ada diulang dua kali horizontal maupun vertikal dua kali. Dan kemudian yang terus di, sehingga Anda memiliki skala langsung dari gambar asli Anda dengan dua. Jadi jika kita terhadap detail pseudocode untuk ini, kita ingin membuka file. Dan kemudian mengetahui bahwa jika kita pergi ke sini, kita melihat bahwa lebar untuk outfile ini akan berbeda dari lebar untuk infile. Apa artinya? Itu berarti bahwa informasi header kita akan berubah. Dan jadi apa kita ingin lakukan adalah memperbarui info header, mengetahui bahwa ketika kita membaca dalam file jika Anda beroperasi pada kerangka copy.c, kita sudah memiliki variabel yang menunjukkan ukuran apa itu dan hal-hal seperti itu. Jadi, sekali Anda memiliki itu, apa yang Anda mungkin ingin lakukan adalah mengubah variabel tertentu. Ingat, jika Anda memiliki struct, bagaimana Anda mengakses variabel dalam itu. Anda menggunakan operator titik, kan? Jadi kemudian menggunakan itu, Anda tahu bahwa Anda harus mengubah info header. Jadi di sini hanya daftar elemen yang sebenarnya yang akan mengubah dalam file Anda. Ukuran file akan berubah, gambar, serta lebar dan tinggi. Jadi akan kembali ke peta bitmap, melihat apakah itu header file atau header info yang berisi informasi yang dan kemudian mengubah sesuai kebutuhan. Sekali lagi, katakanlah cp copy.c resize.c. Itu berarti bahwa resize.c sekarang berisi semua yang terkandung di dalam copy karena copy memberikan kita cara membaca untuk setiap pixel scanline oleh pixel. Kecuali sekarang, bukan hanya mengubah nilai-nilai seperti yang kami lakukan di cerita detektif, apa yang ingin kita lakukan adalah kita ingin menulis dalam piksel beberapa asalkan n kami lebih besar dari 1. Lalu apa yang ingin kita lakukan adalah kita ingin meregangkan secara horisontal dengan n, serta peregangan secara vertikal oleh n. Bagaimana mungkin kita melakukan ini? Katakanlah Anda adalah n 2 dan Anda memiliki infile diberikan. Kursor Anda akan mulai yang pertama, dan apa yang ingin Anda lakukan jika n adalah 2, Anda ingin mencetak dalam 2 dari mereka. Jadi Anda mencetak dalam 2 dari mereka. Kemudian kursor Anda akan pindah ke piksel berikutnya, yang merupakan satu merah, dan itu akan mencetak 2 dari mereka yang merah, menambahkan itu ke apa itu dilakukan sebelumnya. Kemudian kursor akan pindah ke pixel berikutnya dan menarik 2 dari mereka. Jika Anda melihat kembali ke kerangka copy.c, apa hal ini di sini adalah menciptakan contoh baru dari tiga RGB, variabel baru yang disebut triple. Dan di sini ketika membaca ke dalamnya, ia membaca dari infile 1 RGBTRIPLE dan menyimpannya dalam variabel tiga. Jadi Anda benar-benar memiliki variabel yang mewakili bahwa pixel tertentu. Kemudian ketika Anda menulis, apa yang Anda mungkin ingin lakukan adalah menyelimuti pernyataan fwrite dalam untuk loop yang menulis ke outfile Anda sebanyak yang diperlukan. Itu cukup sederhana. Hanya pada dasarnya mengulangi proses penulisan n beberapa kali untuk skala itu horizontal. Tapi kemudian kita harus ingat bahwa bantalan kami akan berubah. Sebelumnya, katakanlah kita memiliki sesuatu yang panjang 3. Kemudian kita hanya akan menambahkan berapa banyak bantalan? Hanya satu lagi untuk membuatnya kelipatan dari 4. Namun mengatakan kita skala ini gambar tertentu dengan n = 2. Jadi berapa banyak piksel biru akan kita miliki di akhir? Kami akan memiliki 6. 1, 2, 3, 4, 5, 6. Baiklah. 6 bukan kelipatan dari 4. Apa kelipatan terdekat dari 4? Itu akan menjadi 8. Jadi kita benar-benar akan memiliki 2 karakter padding di sana. Apakah ada yang ingat jika kita memiliki formula untuk menghitung bantalan dan di mana yang mungkin? [Respon terdengar mahasiswa] >> Ya, copy.c. Benar. Ada rumus di copy.c untuk menghitung berapa banyak bantalan yang Anda miliki diberikan lebar tertentu dari gambar bitmap. Jadi itu akan berguna ketika Anda perlu menambahkan dalam jumlah tertentu padding untuk benar-benar mencari tahu berapa banyak bantalan Anda perlu menambahkan. Tapi satu catatan, meskipun, adalah bahwa Anda ingin memastikan bahwa Anda menggunakan ukuran yang tepat. Hanya berhati-hati karena pada dasarnya Anda akan berhadapan dengan dua gambar bitmap. Anda ingin memastikan bahwa Anda menggunakan yang tepat. Ketika Anda menghitung padding untuk outfile, Anda ingin menggunakan lebar outfile dan tidak lebar dari sebelumnya. Besar. Semacam mengurus peregangan gambar bitmap seluruh horizontal. Tapi apa yang kita ingin lakukan adalah benar-benar peregangan secara vertikal juga. Ini akan menjadi sedikit rumit karena ketika kita sudah selesai menyalin baris dan menulis baris itu, kami kursor akan berada di akhir. Jadi jika kita membaca lagi, maka itu hanya akan membaca ke baris berikutnya. Jadi apa yang ingin kita lakukan adalah jenis menemukan beberapa cara untuk menyalin baris itu lagi atau hanya semacam mengambil baris itu dan kemudian menulis ulang lagi. Seperti aku agak menyinggung, ada beberapa cara berbeda untuk melakukan hal ini. Apa yang Anda bisa lakukan adalah karena Anda akan melalui dan membaca melalui scanline tertentu dan mengubahnya seperlunya, maka jenis toko semua orang piksel dalam array. Lalu kemudian pada Anda tahu bahwa Anda akan perlu untuk mencetak array lagi, dan sehingga Anda hanya dapat menggunakan array itu untuk melakukan itu. Cara lain untuk melakukannya adalah Anda bisa menyalin satu baris, memahami bahwa Anda perlu menyalin itu lagi, jadi sebenarnya memindahkan kursor Anda, dan itu akan menggunakan fseek metode. Anda bisa memindahkan kursor Anda sepanjang perjalanan kembali dan kemudian ulangi proses copy lagi. Jadi jika nomor skala kami adalah n, maka berapa kali kita akan harus kembali dan menulis ulang baris? >> [Mahasiswa] n - 1. >> Ya, sempurna. n - 1. Kami telah melakukannya sekali sudah, jadi maka kita akan ingin mengulang proses akan kembali n - 1 jumlah kali. Oke. Jadi di sana Anda memiliki fungsi resize Anda. Sekarang kita bisa sampai ke bagian benar-benar menyenangkan, pset favorit saya, yaitu Recover. Alih-alih bitmap, kali ini kita sedang berhadapan dengan JPEG. Kami benar-benar tidak diberi file hanya dari file JPEG, kita diberikan pada dasarnya format kartu memori baku. Dan jadi ini mengandung sedikit nilai info dan sampah di awal, dan kemudian mulai dan memiliki sekelompok file JPEG. Namun, kami menyerahkan kartu di mana kita telah menghapus foto-foto; pada dasarnya, kita sudah lupa di mana foto-foto yang terletak di dalam kartu. Jadi tugas kita dalam Recover adalah pergi melalui format kartu dan menemukan foto-foto lagi. Untungnya, struktur file JPEG dan file kartu sedikit membantu. Ini pasti bisa menjadi sedikit lebih sulit jika bukan dalam format tertentu. Setiap file JPEG sebenarnya dimulai dengan dua urutan yang mungkin, yang tercantum di atas. Pada dasarnya, setiap kali Anda memiliki file JPEG yang baru, dimulai dengan baik urutan ffd8 ffe0 atau yang lain, ffd8 ffe1. Hal lain yang membantu untuk tahu adalah bahwa file JPEG disimpan contiguously. Jadi, setiap kali satu file JPEG berakhir, yang lain dimulai. Jadi tidak ada apapun di antara nilai-nilai di sana. Setelah Anda menekan awal dari JPEG, jika Anda sudah pernah membaca JPEG, Anda tahu bahwa Anda telah memukul akhir sebelumnya dan awal dari yang berikutnya. Untuk jenis memvisualisasikan ini, saya membuat sebuah skema. Hal lain tentang file JPEG adalah bahwa kita dapat membacanya di urutan 512 byte pada suatu waktu, sama dengan awal kartu. Kita tidak perlu memeriksa setiap byte tunggal karena itu akan mengisap. Jadi, bukannya, apa yang bisa kita lakukan sebenarnya hanya membaca dalam 512 byte pada suatu waktu dan kemudian, bukannya memeriksa di antara mereka pada mereka irisan kecil kecil, kita hanya bisa memeriksa awal 512 byte. Pada dasarnya, dalam gambar ini, apa yang Anda lihat adalah di awal kartu, Anda memiliki nilai-nilai yang tidak benar-benar relevan dengan JPEG sebenarnya sendiri. Tapi kemudian apa yang saya miliki adalah bintang untuk menunjukkan salah satu dari dua urutan awal untuk JPEG. Jadi setiap kali Anda melihat seorang bintang, Anda tahu bahwa Anda memiliki file JPEG. Dan kemudian setiap file JPEG akan menjadi beberapa beberapa 512 byte namun belum tentu beberapa yang sama. Cara yang Anda tahu bahwa Anda telah memukul lain JPEG adalah jika anda menekan bintang lain, lain urutan mulai dari byte. Lalu apa yang Anda miliki di sini adalah Anda memiliki file JPEG merah terus sampai Anda mencapai bintang, yang ditunjukkan dengan warna baru. Anda terus dan kemudian Anda menekan bintang lain, anda menekan lain JPEG, Anda terus sepanjang jalan sampai akhir. Anda berada di gambar terakhir di sini, satu pink. Anda pergi ke akhir sampai Anda mencapai akhir dari karakter file. Ini akan menjadi benar-benar berguna. Sebuah utama takeaways beberapa di sini: Berkas kartu tidak dimulai dengan JPEG, tapi sekali JPEG dimulai, semua file JPEG disimpan berdampingan satu sama lain. Beberapa pseudocode untuk Recover. Pertama, kita akan membuka file kartu kami, dan itu akan menggunakan file kami I / O fungsi. Kita akan mengulang proses berikut sampai kita telah mencapai akhir file. Kita akan membaca 512 byte pada suatu waktu. Dan apa yang saya katakan di sini adalah kita akan menyimpannya dalam buffer, jadi pada dasarnya berpegang pada mereka 512 byte sampai kita tahu persis apa yang harus dilakukan dengan mereka. Lalu apa yang ingin kita lakukan adalah kita ingin memeriksa apakah kita telah mencapai bintang atau tidak. Jika kita telah memukul bintang, jika kita telah memukul salah satu dari urutan awal, maka kita tahu bahwa kita telah memukul file JPEG yang baru. Apa yang akan kita ingin lakukan adalah kita akan ingin membuat file baru di direktori pset4 kami untuk terus membuat file tersebut. Tapi juga, jika kita sudah membuat JPEG sebelumnya, maka kita ingin mengakhiri file itu dan mendorongnya ke folder pset4, di mana kita akan memiliki file yang disimpan karena jika kita tidak menentukan bahwa kita telah berakhir file JPEG, maka kita pada dasarnya akan memiliki jumlah tak tentu. File JPEG tidak akan pernah berakhir. Jadi kami ingin memastikan bahwa ketika kita membaca ke file JPEG dan menulis bahwa, kami ingin secara khusus menutup bahwa untuk membuka yang berikutnya. Kami akan ingin memeriksa beberapa hal. Kami ingin memeriksa apakah kita berada pada awal dari sebuah JPEG baru kami dengan buffer dan juga jika kita sudah telah menemukan JPEG sebelum karena itu akan mengubah proses Anda sedikit. Jadi setelah Anda pergi melalui semua jalan dan Anda memukul akhir file, maka apa yang akan Anda ingin lakukan adalah Anda akan ingin menutup semua file yang sedang terbuka. Yang mungkin akan menjadi file JPEG terakhir yang Anda miliki, serta file kartu yang Anda sudah berurusan dengan. Hambatan terakhir yang kita butuhkan untuk mengatasi adalah bagaimana untuk benar-benar membuat file JPEG dan bagaimana untuk benar-benar mendorong ke folder. Pset tersebut mengharuskan setiap JPEG yang Anda temukan dalam format berikut, di mana Anda memiliki nomor tersebut. jpg. Jumlah itu, bahkan jika itu 0, kita menyebutnya 000.jpg. Setiap kali Anda menemukan JPEG dalam program Anda, Anda akan ingin nama itu dalam urutan bahwa itu ditemukan. Apa artinya ini? Kita perlu semacam melacak berapa banyak kita telah menemukan dan apa jumlah masing-masing JPEG seharusnya. Di sini kita akan mengambil keuntungan dari fungsi sprintf. Serupa dengan printf, yang hanya semacam mencetak nilai keluar ke terminal, sprintf mencetak file keluar ke folder. Dan jadi apa ini akan lakukan jika saya punya sprintf, judul, dan kemudian string sana, itu akan mencetak 2.jpg. Dengan asumsi bahwa saya telah menutup file saya dengan benar, yang akan berisi file yang saya telah menuliskan. Tapi satu hal adalah bahwa kode yang saya miliki di sini tidak cukup memenuhi apa pset membutuhkan. Pset mengharuskan bahwa file JPEG kedua harus dinamai 002 bukan hanya 2. Jadi, ketika Anda mencetak nama, maka mungkin Anda mungkin ingin mengubah placeholder sedikit. Apakah ada yang ingat bagaimana kita memungkinkan untuk ruang tambahan ketika kita mencetak sesuatu? Ya. >> [Mahasiswa] Anda menempatkan 3 antara tanda persen dan 2 tersebut. >> Ya, sempurna. Anda akan menempatkan 3 dalam kasus ini karena kami ingin ruang untuk 3. 3d% mungkin akan memberi Anda 002.jpg bukannya 2. Argumen pertama ke fungsi sprintf sebenarnya adalah array char, yang kita tahu sebelumnya sebagai string. Mereka kehendak, jenis lebih seperti penyimpanan sementara, hanya menyimpan string yang dihasilkan. Anda tidak akan benar-benar berhadapan dengan hal ini, tetapi Anda perlu untuk memasukkannya. Mengetahui bahwa setiap nama file memiliki nomor, yang memakan tiga karakter, dan kemudian jpg,. berapa lama harus array ini menjadi? Membuang nomor. Berapa banyak karakter dalam judul, dalam nama? Jadi ada 3 hashtags, periode, jpg. >> [Mahasiswa] 7. >> 7. Tidak cukup. Kami akan ingin 8 karena kami ingin memungkinkan null terminator juga. Akhirnya, hanya untuk menarik keluar proses yang Anda akan lakukan untuk Recover, Anda memiliki beberapa informasi awal. Anda terus sampai Anda menemukan awal dari file JPEG, dan itu bisa menjadi salah satu dari dua sekuens awal. Anda terus membaca. Setiap slash di sini mewakili 512 byte. Anda terus membaca, terus membaca sampai Anda menemukan lain urutan awal. Setelah Anda memiliki, Anda mengakhiri JPEG saat ini - dalam kasus ini, itu adalah satu merah, sehingga Anda ingin mengakhiri itu. Anda ingin sprintf nama itu ke folder pset4 Anda, maka Anda ingin membuka JPEG baru dan kemudian terus membaca sampai Anda menemukan berikutnya. Terus membaca, terus membaca, dan akhirnya, akhirnya, Anda akan mencapai akhir file, dan sehingga Anda akan ingin untuk menutup JPEG terakhir yang Anda bekerja dengan, sprintf yang menjadi folder pset4 Anda, dan kemudian melihat semua gambar yang Anda dapatkan. Foto-foto itu sebenarnya gambar CS50 staf, dan jadi ini adalah di mana menyenangkan bonus bagian dari pset datang di adalah bahwa Anda bersaing dalam bagian Anda untuk menemukan TF dalam gambar dan mengambil gambar dengan mereka untuk membuktikan bahwa Anda telah melakukan yang pset dan sehingga Anda dapat melihat mana anggota staf dalam gambar. Jadi Anda mengambil gambar dengan staf. Kadang-kadang Anda harus mengejar mereka turun. Mungkin beberapa dari mereka akan mencoba untuk lari dari Anda. Anda mengambil gambar dengan mereka. Ini sedang berlangsung. Ini bukan karena saat pset yang sudah jatuh tempo. Batas waktu akan diumumkan di spec. Kemudian bersama-sama dengan bagian Anda, mana bagian mengambil gambar yang paling dengan sebagian besar anggota staf akan memenangkan hadiah cukup mengagumkan. Itu semacam insentif untuk mendapatkan pset4 Anda selesai secepat mungkin karena Anda bisa turun ke bisnis memburu semua berbeda CS50 anggota staf. Itu tidak wajib, meskipun, jadi setelah Anda mendapatkan gambar, maka Anda selesai dengan pset4. Dan aku selesai dengan Walkthrough 4, jadi terima kasih semua untuk datang. Good luck dengan Forensik. [Tepuk tangan] [CS50.TV]