JASON Hirschhorn: Welcome, semua orang, untuk Minggu 6. Saya gembira melihat anda semua hidup dan sihat selepas Kuiz 0, kerana saya tahu bahawa agak kasar. Tetapi bersyukur, anda semua lakukan amat baik. Dan sebagainya yang indah. Jika anda dalam seksyen saya, saya telah diberikan paling anda menyokong kuiz anda sudah. Beberapa anda, saya bertemu selepas kelas. Dan jika anda seorang pelajar lanjutan dan anda tidak menerima kuiz anda kembali lagi, TF anda mungkin bekerja di atasnya dan penggredan, dan akan mendapat kembali kepada anda tidak lama lagi. Jadi pelajar lanjutan saya yang menonton sekarang - mudah-mudahan hidup - Saya akan mendapat kuiz anda lama juga. Agenda kita untuk hari ini adalah seperti berikut. Pertama, kita akan pergi ke beberapa sumber-sumber yang CS50 menyediakan kepada anda. Kami akan pergi ke Kuiz 0 akan datang, dan Saya akan menjawab apa-apa soalan sesiapa mempunyai kira-kira masalah tertentu. Dan kemudian, kita akan pergi ke atas fail I / O dan masalah menetapkan 5. Kedua-dua topik terakhir akan mengambil membentuk sebahagian besar bahagian hari ini. Saya meletakkan senarai ini setiap minggu sebagai peringatan kepada anda semua, tetapi teras seksyen, kami hanya mempunyai 90 minit - kita tidak mampu untuk menampung semua yang saya akan suka untuk menampung untuk anda semua. Tetapi kita mempunyai satu tan sumber untuk anda untuk menarik apabila anda mengenali bahan dan kerja melalui masalah anda menetapkan. Satu peringatan bahawa saya mempunyai talian teks kotak, ditubuhkan bagi anda untuk mengisi jika anda ada sebarang maklumbalas bagi saya, kedua-dua positif dan membina, kira-kira bahagian. URL yang terletak betul-betul di sini. Oleh itu, sila, mengambil masa jika anda mempunyai sebarang maklum balas, sama ada dalam seksyen, atau selepas, atau selepas anda menonton video dalam talian, untuk memberikan maklum balas anda. Saya benar-benar menghargai apa-apa dan semua itu. Jadi saya telah mempunyai perbualan kecil dengan banyak saya pelajar sepanjang minggu - seperti yang saya menyerahkan kembali kuiz, bercakap tentang Sudah tentu, melihat bagaimana anda lakukan. Dan satu tema telah datang lebih dan lebih dalam bercakap tentang - dalam tertentu - masalah menetapkan. Dan saya telah terkandung tema yang di papan sekarang. Sebenarnya, terdapat perbezaan antara perubahan dalam sesuatu yang dilakukan dengan betul dan sesuatu yang dilakukan dengan baik. Kebanyakan orang telah melakukan hebat dari segi kebenaran - 5 atau 4 pada semua psets. Kebanyakan orang mendapat mereka setiap masa. Walau bagaimanapun, hanya kerana anda telah melakukan sesuatu yang betul tidak bermakna anda telah dilakukan sesuatu yang elegan, atau cekap, atau sebagai bersih kerana anda boleh melakukannya. Dan itulah yang reka bentuk - dan ke tahap yang lebih kecil, gaya - paksi adalah untuk. Oleh itu, saya menggesa anda semua, dan TFS lain menolak anda semua, bukan sahaja untuk seterusnya dalam perkara-perkara yang betul, tetapi berpaling dalam perkara-perkara yang berkod juga. Jika tidak berbuat yang tidak perlu UNTUK gelung, tidak perhitungan kembali pembolehubah jika anda tidak perlu. Sebagai contoh, melihat ke belakang kepada masalah yang dinyatakan 4, apabila meletakkan batu bata di skrin, setiap baris - setiap bata dalam berturut-turut diberikan mempunyai yang sama y-menyelaras - ketinggian yang sama menyelaras. Supaya y-menyelaras tidak perlu dikira di dalam kawasan pedalaman bersarang UNTUK gelung yang anda mungkin digunakan untuk meletakkan mereka bata pada skrin. Ia hanya perlu dikira setiap kali anda dihidupkan berturut-turut, atau bergerak turun berturut-turut. Jadi mengatakan jika terdapat 10 batu bata dalam berturut-turut, setiap bata boleh mempunyai yang sama y-menyelaras, dan yang y-menyelaras hanya boleh dikira sekali untuk semua orang-orang. Ia tidak perlu dikira 10 kali, juga tidak yang memerlukan pengiraan berlaku dalam sebenar fungsi panggilan - panggilan fungsi gracked baru. Jadi jika itu adalah sedikit mengelirukan bagi anda, lebih umum, perkara-perkara yang tidak perlu berlaku setiap kali tunggal anda pergi melalui gelung UNTUK tidak boleh diletakkan di dalam gelung UNTUK, dan tidak harus berlaku setiap kali anda pergi melalui gelung UNTUK ini. Satu lagi contoh reka bentuk yang baik yang kita lihat dalam Minggu 3 selama 15, anda boleh menyimpan menjejaki sifar. Oleh itu, apabila anda memulakan lembaga, anda menyelamatkan - dalam pembolehubah global, mungkin - x dan y-koordinat sifar. Dan kemudian bila-bila masa anda - dalam fungsi langkah anda, setiap kali anda membuat langkah yang berjaya, anda mengemas kini lokasi sifar. Yang akan menyelamatkan anda daripada perlu melakukan bersarang UNTUK gelung untuk melihat melalui menaiki setiap kali dalam fungsi langkah anda dan mencari sifar, atau mencari jubin, dan kemudian menyemak apa yang akan datang kepadanya. Sebaliknya, anda perlu lokasi sifar, anda hanya boleh melihat di atas, di bawah, dan ke kiri dan kanan, untuk mencari jubin yang anda cari. Jadi dari segi program-program kami menulis, mereka tidak pernah cukup besar bahawa sesetengah keputusan rekabentuk benar-benar akan menghalang anda program, atau membuat ia berjalan lebih perlahan, atau mungkin juga kehabisan memori. Tetapi kita masih menolak anda semua untuk menulis sebagai elegan dan kod cekap yang mungkin. Jadi, jika anda berakhir menulis perkara yang mempunyai yang lebih besar skop, mereka akan ditulis dengan baik mereka bentuk di samping menjadi betul. Jadi beberapa anda mempunyai dibawa yang keluar. Itu sesuatu yang kita cari - sesuatu yang kita akan terus menolak anda lelaki di. Jika anda mempunyai sebarang soalan mengenai Reka bentuk program anda, berasa bebas untuk mendekati saya, dan saya gembira berjalan melalui program anda dengan anda, dan menunjukkan beberapa reka bentuk keputusan yang anda dibuat, dan memberikan beberapa cadangan tentang bagaimana untuk membuat lebih keputusan reka bentuk yang lebih baik. Jadi, kita akan bergerak untuk bercakap mengenai Kuiz 0. Sebelum kita melakukan itu, tidak sesiapa mempunyai sebarang soalan mengenai apa yang Saya telah dilindungi setakat ini? [Pencurian BUNYI] JASON Hirschhorn: Tujuh saat. OK. Mari kita bercakap tentang Kuiz 0 untuk sedikit. Kebanyakan anda mempunyai Kuiz anda kembali 0 ini. Jika tidak, mudah-mudahan anda ingat sedikit. Tetapi jika anda telah mengambil Kuiz 0, maka anda juga mempunyai akses kepada PDF dalam talian di penyelesaian sampel. Adakah sesiapa mempunyai apa-apa soalan sebelum kita melompat ke dalam bahan minggu ini mengenai masalah khusus kepada Kuiz 0 - mengapa jawapannya adalah apa yang ia? Sesiapa keliru tentang apa-apa? Walaupun anda mendapat masalah yang betul, tetapi hanya ingin saya untuk menjelaskan ia sedikit lagi, saya gembira untuk berbuat demikian sekarang. Jadi saya telah meminta anda semua untuk datang bersedia dengan beberapa pemikiran tentang Kuiz 0. Jadi yang ingin membawa kita bermula dengan soalan atau comment about Kuiz 0? [KERTAS pencurian] JASON Hirschhorn: Tidak semua orang lakukan dengan sempurna. Jadi saya tahu [KETAWA] perlu ada beberapa soalan kira-kira Kuiz 0. OK. Ya. Ompica. OMPICA: Nombor 10. JASON Hirschhorn: Nombor 10. Yang mana satu adalah nombor 10? OMPICA: The - JASON Hirschhorn: Saya haven't - OMPICA: The termasuk - JASON Hirschhorn: Nombor 10 adalah lapan i - menulis lapan untuk i? OMPICA: Yeah. JASON Hirschhorn: OK. Jadi soalan lain anda boleh mempunyai ditanya ialah saya terus mata? Jawapannya adalah ya. Dalam seksyen sebelum kuiz, saya bertanya anda semua untuk memberi kod kepada kedua-dua Sterling dan lapan hingga i. Kedua-dua mereka yang berlaku kepada muncul di kuiz. Jadi mudah-mudahan, anda dibayar perhatian terhadapnya. Dan jika anda mempunyai, maka anda akan mempunyai mungkin dilakukan dengan baik di kedua-dua. Tetapi lapan untuk i, yang kita lakukan sebenarnya tidak kod dalam kelas, tetapi ia adalah, sekali lagi, ditanya mengenai kuiz. Jadi beberapa perkara untuk mengambil perhatian apabila pengekodan lapan hingga i. Perkara pertama, setiap soalan, adalah bahawa anda diperlukan untuk memeriksa jika tali adalah sama dengan null. Beberapa orang cuba untuk memeriksa kemudian dalam program ini jika s kurungan i adalah - jadi sesuatu yang tertentu dalam bahawa tali - adalah sama dengan null. Tetapi ingat, batal yang pada asasnya - ia baik untuk memikirkan null sebagai penunjuk sifar - penunjuk kepada sifar - kurang lebih dalam ingatan di mana anda tidak boleh akses. Jadi, jika ada sesuatu yang sama dengan nol, anda tahu bahawa ia tidak dimulakan, atau tiada apa-apa di sana. Jadi s adalah bintang char, s kurungan i adalah char a. Jadi masuk akal untuk membandingkan s untuk nol, tetapi tidak s kurungan i untuk nol. Tetapi sekali lagi - jadi itu adalah perkara yang pertama yang anda sepatutnya lakukan - periksa untuk memastikan bahawa anda benar-benar mendapat rentetan sebenar. Seterusnya, anda mahu pergi melalui setiap aksara dalam rentetan. Dan sebagainya yang akan menjadi seperti s kurungan i, sebagai contoh, jika saya adalah iterator anda. Dan mengambil watak itu, dan mendapatkan nilai sebenar. Anda telah ia disimpan sebagai char, tetapi nilai ASCII bagi sifar - sifar sebagai watak yang - sebenarnya bukan integer sifar. Ia beberapa nombor lain yang anda boleh mencari dalam jadual ASCII. Jadi salah satu cara untuk membetulkan untuk itu - mungkin cara terbaik untuk membetulkan untuk itu - adalah menolak daripadanya nilai watak - sifar sebagai bersifat. Petikan tunggal Jadi tolak, sifar, satu lagi petikan tunggal. Yang akan mengambil apa sahaja nombor yang anda mempunyai sebagai char, dan mendapatkannya sama dengan bilangan sebagai integer sebenar. Dan ini adalah hampir sama dengan pendekatan yang ramai orang mengambil dalam masalah set 2, dengan Caesar dan Viginere - mereka nombor rahsia, apabila anda telah berputar mereka. Jadi selepas anda mempunyai ia sebagai nombor dari sifar hingga sembilan, maka - bergantung kepada di mana ia pergi dalam bilangan muktamad - anda perlu kalikan oleh kuasa 10. Sesetengah orang berpindah dari belakang kepada depan dan didarab individu nombor dengan kuasa 10. Sesetengah orang bergerak dari depan ke belakang - dan sebagainya mengambil tertinggi memerintahkan nombor pertama - dan akan menyelamatkan orang-orang dalam pembolehubah kaunter global. Dan kemudian setiap kali melalui FOR gelung, darab bahawa gergasi global menangani pembolehubah sebanyak 10, untuk membuat ruang untuk char seterusnya. Sehingga adalah sedikit mengelirukan tanpa saya menulis di atas papan. Tetapi penyelesaian sampel adalah disediakan untuk anda. Tetapi mereka adalah perkara-perkara besar kita cari. Juga cek memastikan bahawa setiap watak individu sememangnya watak antara sifar dan sembilan, dan tidak beberapa watak lain, seperti A, sebagai contoh. Mereka itulah perkara yang kita cari dalam soalan itu. Adakah yang menjawab soalan anda? OMPICA: Yeah. JASON Hirschhorn: OK. Adakah terdapat apa-apa soalan lain kira-kira Kuiz 0? Apa kira-kira menyusun? Semua orang menyusun betul? No Terdapat - [KETAWA] Sebarang soalan mengenai proses penyusunan? Wow. [KERTAS pencurian] JASON Hirschhorn: Ya. Michael. MICHAEL: Apakah nombor 7 - rawak? JASON Hirschhorn: Bilangan 7. Nombor 7 adalah mendapatkan integer rawak. Cemerlang. Jadi anda diberi integer dan integer b, dan anda mahu rawak integer antara a dan b. Kami benar-benar boleh menulis satu ini pada lembaga, kerana yang satu ini adalah satu baris kod - salah satu cara untuk melakukannya. Jadi kita diberi drand sebagai fungsi kita boleh gunakan. Dan apakah drand - dengan andaian ia telah diletakkan sebagai pilihan - apakah drand kembali? MICHAEL: A terapung di antara 0.0 dan 1.0. JASON Hirschhorn: Beberapa - yeah. Beberapa di antara 0 dan 1. Dan jadi kami telah b dan a. Dan maka kita mempunyai nombor rawak kami antara 0 dan 1 yang diberikan kepada kami oleh drand. Sesetengah orang cuba untuk meletakkan b, atau b tolak , atau sesuatu di dalam mereka kurungan. Ini bermakna bahawa mereka hujah untuk fungsi ini. drand tidak mengambil apa-apa hujah - seperti getString tidak tidak mengambil apa-apa hujah. Jadi ia hanya paren terbuka, berhampiran paren - dan bahawa, sendiri, adalah panggilan fungsi. Dan yang memberikan anda sejumlah antara 0 dan 1. Sudah tentu, kami mempunyai pelbagai keseluruhan yang nombor boleh masuk Katakanlah, jika b adalah 10 dan adalah 5, kita benar-benar mahu sebilangan dengan pelbagai 5. Jadi perkara yang akan datang yang perlu kita lakukan adalah membiak ini dengan pelbagai b tolak. Jadi andaian yang yang berganda-ganda. Dan yang akan memberi kami nombor satu dalam julat yang diberikan. Dan bahawa julat tertentu menjadi Perbezaan antara b tolak. Dan akhirnya, yang hanya akan memberikan dari - mengatakan julat di antara b tolak adalah 5, yang akan memberikan kita antara 0 hingga 5. Tetapi jika yang sebenarnya 5, kita perlu meningkatkan julat ini sehingga di mana ia sebenarnya sepatutnya menjadi, dengan menambah. Supaya mendapat hak logik. Dan kemudian, anda perlu satu lagi soalan? MICHAEL: No Saya berasa benar-benar dalam keadaan sihat sekarang. [KETAWA] JASON Hirschhorn: No Jangan berasa benar-benar dalam keadaan sihat. Beberapa orang berjuang dengan soalan ini. Dan kemudian, soalan lain adalah, drand, anda berkata, memberikan anda apungan - kembali apungan. Tetapi fungsi ini sebenarnya bertanya untuk integer untuk dikembalikan. Anda tidak perlu untuk membuang ini jelas untuk integer, kerana ini operasi akan merawatnya kerana semua yang terapung - sebagai nombor titik terapung. Seperti kemahuan ini - walaupun ini adalah integer, kemahuan ini digandakan dengan betul. Semua pendaraban akan berfungsi. Anda tidak perlu untuk membuang ia di sini. Malah, anda tidak perlu membuang ia. Yang akan - jika anda membuang sebilangan itulah antara 0 dan 1 - nombor rawak, titik terapung - maka ia sama ada akan hanya 0 atau 1, jadi anda akan kehilangan semua ketepatan itu. Tetapi pada akhirnya, apabila anda kembali, ia secara automatik mendapat dihantar pulang sebagai integer. Jadi anda tidak perlu untuk melakukan yang pemutus sendiri. Jadi ini adalah jawapan kepada soalan itu, nombor 7. Lain-lain soalan di Kuiz 0? Ya, Annie. ANNIE: Apabila kita menggunakan rekursif - apabila kita menggunakan gelung lelaran? JASON Hirschhorn: Apabila anda menggunakan rekursif - jadi lebih amnya, kebaikan dan keburukan rekursi berbanding pendekatan lelaran. Bolehkah sesiapa menawarkan pro atau con? Sila? Tidak boleh sesiapa pun. Yang dapat menawarkan pro atau con? [KERTAS pencurian] PELAJAR 1 Rekursi kurang pengekodan - menaip kurang? JASON Hirschhorn: Jadi secara amnya, rekursi terutamanya, fungsi - atau algoritma seperti merge jenis - yang meminjamkan sendiri kepada pendekatan rekursif - mungkin lebih mudah kod secara rekursif. Dan hanya lebih masuk akal untuk melakukannya secara rekursif. Jadi yang akan menjadi pro untuk rekursi. Orang lain? Yeah? PELAJAR 2: Con untuk rekursi - Ia menggunakan memori lebih. JASON Hirschhorn: Jadi betul-betul betul. Fungsi rekursif akan terus menambah timbunan bingkai untuk tindanan. Jadi jika anda beroperasi pada banyak nombor, dan perlu memanggil ini berfungsi banyak, maka anda akan pasti mengambil lebih banyak memori, manakala pendekatan lelaran hanya akan meletakkan satu stack frame pada timbunan, kerana ia semua berlaku dalam satu fungsi. Apa-apa kebaikan dan keburukan yang lain? Yeah. PELAJAR 3: Kelebihan untuk rekursi. Anda tidak perlu untuk menentukan di memajukan berapa kali kod terpaksa diulangi. Anda boleh mempunyai nombor yang telah ditetapkan masa yang anda perlu melelar, maka rekursi adalah lebih baik, kerana ia mengambil hasil itu. JASON Hirschhorn: Saya rasa yang benar. Tetapi saya fikir kedua-dua kes anda tidak akan - anda mungkin akan mendapat beberapa input daripada pengguna. Atau fungsi ini akan mempunyai input beberapa yang akan menentukan berapa kali ia perlu dijalankan. Jadi secara amnya, anda tidak akan kod keras - walaupun dalam pendekatan lelaran - bagaimana banyak kali gelung yang perlu dijalankan. Adakah anda mempunyai satu lagi anda memikirkan, Annie? OK. Jadi mereka mungkin dua - pro yang paling besar dan yang terbesar con kepada rekursi berbanding pendekatan lelaran. OK. Apa-apa lagi pada Kuiz 0? Mari kita bergerak ke atas. Fail I / O. Terdapat pendek yang indah minggu ini dalam fail I / O yang diharapkan anda telah melihat pelbagai kali, dan dikagumi. Banyak kerja masuk ke dalam itu, dan saya mendengar ia adalah insanely membantu. Saya juga termasuk pautan pada slaid ini, sekiranya anda tidak mempunyai peluang untuk menonton ia 10 kali. Jadi, kita akan pergi ke atas secara ringkas langkah-langkah utama untuk membuka dan bekerja dengan fail, dan kemudian kita akan menyelam ke dalam masalah pengekodan sebelum memeriksa masalah yang ditetapkan. Jadi sekali lagi, saya akan meletakkan ini di atas skrin, tetapi saya akan bercakap bagi hanya satu minit mengenai apa yang kita buat di sini dengan fail I/O-- apa maksudnya? Ini bermakna bahawa kita boleh membuat kita program, dan kemudian mempunyai program kami keluar, dan tidak telah membuat apa-apa kesan ke atas dunia di luar program kami. Tetapi apabila kita mula bekerja dengan fail - kedua-dua mereka dalam membaca dan mewujudkan mereka - kita boleh mempunyai beberapa kesan ke atas dunia di luar program kami. Sama seperti jika Microsoft Word tidak dapat untuk membuat apa-apa dokumen Word, maka sekali Microsoft Word berhenti, semua anda kerja akan hilang, dan ia akan benar-benar sia-sia. Kami akhirnya mahu dapat menulis program yang boleh menjejaskan dunia di sekeliling mereka, kedua-dua dengan mengambil input kompleks - dari segi fail dan melalui fail, dan juga mewujudkan menarik dan output menarik - dari segi pelbagai jenis fail. Jadi itulah sebabnya kita mula belajar bagaimana untuk bekerja dengan fail. Lebih khusus lagi, apa yang yang kami lakukan adalah seperti berikut. Ia amat mudah. Terdapat hanya beberapa langkah, dan ia disenaraikan di sini pada kod ini. Jadi, kita akan melalui baris kod ini demi baris. Pertama, anda lihat menekankan - apabila anda bekerja dengan fail, tanpa mengambil kira jenis fail itu, anda perlu membukanya. Dan itu adalah dengan panggilan untuk fopen - di sini. Anda termasuk nama fail. Jika fail tidak di dalam direktori anda, atau folder di mana program ini kehidupan, maka anda juga perlu termasuk laluan kepada mana fail yang. Kita akan menganggap bahawa ini fail yang dipanggil "text.txt" - dokumen teks yang mudah - adalah dalam folder sama seperti program ini. Jadi, itu satu lagi perkara yang perlu fikiran - bahawa jika anda mahu untuk membuka fail di tempat lain, anda sebenarnya perlu untuk memasukkan lokasinya. Kedua, anda boleh lulus hujah untuk fopen, dan itulah apa yang anda mahu lakukan dengan fail. Terdapat tiga hujah utama yang anda akan lulus untuk fopen. Yang boleh memberikan saya tiga? Yang boleh memberikan saya salah seorang daripada mereka? Ya. PELAJAR 4: nama fail? JASON Hirschhorn: Maaf. Tiga hujah utama anda boleh lulus sebagai hujah kedua untuk fopen. Anda betul - nama fail adalah hujah pertama. Tetapi hujah kedua untuk fopen adalah umumnya tiga rentetan, dan - ya. Aleja. Aleja: A untuk append. JASON Hirschhorn: A, jika anda mahu melampirkan fail yang telah wujud. PELAJAR 5: R untuk dibaca. JASON Hirschhorn: R, jika anda mahu membaca dari fail. PELAJAR 6: W untuk tulis. JASON Hirschhorn: Dan w, jika anda mahu menulis ke fail. Jadi dalam kes ini, kita menulis ke fail, jadi kita perlu w. Anda membukanya, anda juga perlu menyimpan fail di tempat, dan itu dengan kod ke sebelah kiri pengendali tugasan - Saya mewujudkan penunjuk ke fail dipanggil, dalam kes ini, fail. Kami tidak akan bimbang apa perkara FILE semua topi ini. Cukup untuk mengatakan, ia adalah satu panjang aliran sifar dan satu. Dan itulah bagaimana kita akan mengendalikannya dan memahaminya. Perkara seterusnya yang perlu kita lakukan - dan ini adalah amat penting - setiap kali anda membuka fail - sebenarnya, setiap kali anda memanggil malloc, untuk Sebagai contoh, dan mendapatkan beberapa memori dan cuba dan menyimpannya dalam penunjuk, anda sentiasa mahu memeriksa untuk memastikan bahawa yang fungsi tidak kembali null. Jadi dalam kes ini, kita memeriksa untuk memastikan bahawa kita benar-benar membuka memfailkan dengan betul, dan terdapat tiada kesilapan dalam program kami. Seterusnya, setelah kami diperiksa untuk memastikan bahawa kita mempunyai fail kerja, kita boleh menulis kepada, atau bacaan, atau menambah ke fail. Dalam kes ini, saya hanya mencetak satu baris ke fail ini. Bagaimana saya tahu bahawa? Nah, saya menggunakan fungsi ini dipanggil fprintf. Semua fungsi yang anda akan menggunakan semasa menulis kepada, atau membaca daripada, atau memanipulasi fail akan sama dengan fungsi yang anda lihat sebelum ini, tetapi bermula dengan huruf F, menawarkan diri untuk fail. Dan fprintf, tidak seperti cetak biasa kami app, mengambil masa satu hujah tambahan, dan itu adalah fail di mana anda ingin mencetak baris ini untuk. Saya tidak mempunyai apa-apa hak ohai. Saya tidak mempunyai ketiga hujah untuk printf - atau hujah kedua untuk printf, yang Hujah ketiga untuk fprintf, kerana saya tidak mempunyai apa-apa ruang letak di sini. Saya tidak termasuk apa-apa pembolehubah. Tetapi sekali lagi, fprintf dan semua fail ini fungsi yang beroperasi dengan fail biasanya akan memerlukan fail di mana mereka beroperasi. Akhir sekali, perkara terakhir yang penting untuk lakukan adalah untuk menutup fail, seperti dengan - apabila kita malloc sesuatu, kita mahu untuk membebaskan sesuatu, jangan kita mempunyai kebocoran memori - kita mahu untuk menutup fail kami. Jika program ini keluar tanpa penutup fail, kemungkinan adalah apa-apa yang akan pergi salah, terutamanya jika ia adalah fail kecil. Tetapi ia sudah pasti gaya pengekodan baik dan mengamalkan untuk sentiasa menutup fail anda apabila anda selesai menggunakannya. Jadi itulah asas-asas fail I / O. Anda mungkin melihat bahawa sebelum ini, atau menonton ia dalam yang singkat hebat. Adakah sesiapa mempunyai apa-apa soalan, sebelum kita pergi ke beberapa amalan pengekodan masalah, kira-kira fail I / O atau langkah-langkah yang saya hanya pergi ke atas? [MENAIP Bunyi] JASON Hirschhorn: Adakah anda mempunyai soalan, Avi? AVI: No JASON Hirschhorn: OK. Saya akan menunggu satu lagi tujuh saat. [KETAWA] Itulah tip benar-benar baik. Kalian hanya tidak suka bertanya soalan. Itu denda. OK. Jadi masalah amalan pertama kami adalah, kami akan buat salinan fungsi alat baris arahan yang anda mungkin digunakan sebelum ini - salinan - alat salinan. Jika anda menaip cp dan kemudian memindahkannya dua hujah ke dalam pangkalan anda, anda boleh menyalin fail. Dan itulah yang kita akan untuk menulis sekarang. Jadi sekali lagi, membaca kira slaid ini, saya akan anda untuk menulis program yang mengambil dua dan hanya dua baris arahan hujah-hujah - fail sumber dan fail destinasi - dan salinan kandungan sumber memfailkan untuk fail destinasi satu bait pada satu masa. Jadi, itu banyak untuk meminta. Sekali lagi, pendekatan yang baik untuk ini adalah untuk tidak pergi terus kepada kod C, tetapi memecahkan ia ke dalam beberapa langkah. Pertama, berfikir tentang logik - betul-betul apa yang saya meminta anda untuk melakukan - dan memahami semua langkah-langkah untuk masalah ini. Tidak dalam C, hanya dalam beberapa kod pseudo, atau model mental apa yang berlaku. Seterusnya, sebaik sahaja anda mempunyai kod pseudo ke bawah, memikirkan bagaimana kod pseudo yang peta ke alat dan perkara yang kita telah belajar untuk digunakan dalam C. Dan akhirnya, apabila anda mempunyai semua yang bersama-sama, anda boleh kod masalah tersebut. Mengambil masa 5 hingga 10 minit untuk bekerja pada masalah ini. Saya akan meletakkan arahan kembali dalam satu saat. Dan kemudian kita akan pergi ke atas kod pseudo, dan kod ia tinggal sebagai satu kumpulan. Jika anda mempunyai sebarang soalan semasa anda bekerja mengenai perkara ini, sila meningkatkan tangan anda, dan saya akan datang sekitar dan menjawabnya. PELAJAR 7: Bolehkah saya sapu sekeping kertas? JASON Hirschhorn: Apa yang berlaku? [MENAIP Bunyi] JASON Hirschhorn: OK. Mari kita pergi ke kod pseudo yang pertama, dan maka saya akan memberikan anda beberapa lebih minit untuk menyelesaikan pengkodan. Yang ingin memulakan saya di dengan baris pertama kod pseudo untuk fungsi ini? PELAJAR 8: Semak untuk memastikan bahawa anda telah diberi dua fail. JASON Hirschhorn: OK. Dan jika kita tidak? PELAJAR 8: Saya akan kembali 0. JASON Hirschhorn: Sekiranya kita kembali 0? PELAJAR 8: Kembalikan - dikosongkan. Maaf. JASON Hirschhorn: Yeah. Mungkin tidak 0. Kerana 0 bermakna segala-galanya baik. OK. Jadi, itu baris pertama daripada kod pseudo. Yang mempunyai garis kedua kod pseudo? PELAJAR 9: Buka kedua-dua gambar? JASON Hirschhorn: Buka kedua-dua fail. OK? PELAJAR 10: Semak untuk melihat jika fail adalah NULL? JASON Hirschhorn: Periksa untuk pasti tidak adalah NULL. Sebagai mengetepikan - mengurangkan 0 - ialah NULL? PELAJAR 11: No JASON Hirschhorn: Itu bukan NULL. Yang dipanggil terminator NULL itu. Ini sebenarnya dieja dengan hanya satu l. Jadi memeriksa sesuatu terhadap yang - yang sebenarnya watak - jadi memeriksa sesuatu terhadap yang tidak sama dengan memeriksa untuk melihat jika ia sama NULL. Dan sesetengah orang - pada kuiz mereka dan masalah mereka set - telah mendapat dua daripada mereka keliru. Tetapi kedua-dua daripada mereka adalah sebenarnya berbeza. Satu berakhir rentetan - satu adalah penunjuk kepada 0. PELAJAR 12: Mengapa tidak anda menyemak untuk memastikan bahawa fail tidak NULL sebelum anda membukanya? JASON Hirschhorn: Oleh itu, hukumkanlah menjimatkan sesuatu dalam fail itu. Dan jika anda kembali di sini - jadi baris ini - fopen - akan memberi anda alamat dan kedai alamat dalam fail jika ia berfungsi. Jika ia tidak berfungsi, ia akan menyimpan NULL - PELAJAR 12: Oh. OK. Mendapat anda. JASON Hirschhorn: Dalam fail. Jadi anda tidak boleh menyemak NULL sebelum anda membuka mereka. NULL bermaksud sesuatu tidak berfungsi dengan betul. OK. Jadi periksa untuk memastikan tidak adalah? Atau adakah? Apa yang kita fikirkan? Kami akan pergi dengan itu. PELAJAR 13: Apakah. JASON Hirschhorn: Apakah? Tidak adalah? PELAJAR 13: Apakah. JASON Hirschhorn: OK. Kita seolah-olah mempunyai beberapa konsensus pada itu. Tidak adalah NULL. OK, Barisan seterusnya kod pseudo. Siapa yang tidak memberikan saya garis lagi? Kami akan menunggu untuk anda. Yeah. PELAJAR 14: Anda perlu membaca dari fail yang pertama? JASON Hirschhorn: OK. PELAJAR 14: Atau kita gunakan fscanf atau sesuatu seperti itu fail pertama? JASON Hirschhorn: Jadi, kami ingin membaca dari fail yang pertama dan - mari kita meletakkan bahawa di sini. Baca dari fail sumber. Dan kemudian, apa yang kita lakukan selepas kita membaca dari fail sumber? Orang lain? PELAJAR 15: Tulis ke Fail destinasi? JASON Hirschhorn: Kami menulis untuk fail destinasi, dan - OK. Apa lagi yang kita hilang? Orang lain yang tidak memberikan saya satu baris kod lagi - daripada kod pseudo. Yeah. PELAJAR 16: Mungkin anda sentiasa boleh menyemak sama ada terdapat sesuatu untuk membaca untuk, seperti baris seterusnya? Yang seperti baris seterusnya, melihat jika ia wujud. [ELEKTRONIK BUNYI BIP] JASON Hirschhorn: Oops. Itulah perisian journaling saya. Yeah? PELAJAR 16: Yeah. JASON Hirschhorn: sampaikanlah kepada saya sekali lagi. PELAJAR 16: Semak sama ada terdapat masih garis depan daripada fail sumber untuk dibaca. JASON Hirschhorn: OK. Jadi, kita tidak membaca garis - telah membaca bait di sini - tetapi anda betul. Kami mahu membaca dan menulis sehingga tiada lagi bait. OK. Dan sebagainya ini benar-benar perlu tersusun sedikit, kerana mereka di bawah sana. Betul? Sehingga kita keluar dari bait, kita akan dibaca dari fail sumber dan menulis ke fail destinasi. Dan kemudian, apa yang adalah yang terakhir garis kod pseudo? Seseorang yang tidak diberi saya sesuatu yet. PELAJAR 17: Tutup fail? JASON Hirschhorn: Tepat sekali. Menutup fail. Jadi ada kod pseudo kami. Saya akan meletakkan ke dalam kod pseudo gedit, dan dalam beberapa minit kami akan memberi kod ini bersama-sama. OK. Marilah kita memulakan sebagai satu kumpulan. Nishant, saya mempunyai fail baru saya. Saya baru sahaja membuka ini. Dokumen Untitled 1. Apakah perkara pertama yang perlu saya lakukan? Nishant: Termasuk perpustakaan? JASON Hirschhorn: OK. Perpustakaan apa? Nishant: Stdio.h, stdlib.h, saya percaya? JASON Hirschhorn: OK. Apakah stdlib untuk? Nishant: saya terlupa. JASON Hirschhorn: OK. Jadi termasuk stdio. Apakah yang perlu dilakukan sebelum Saya mula pengekodan? Nishant: Tulis tandukan? JASON Hirschhorn: Bagaimana saya mendapatkan ia berwarna? [Suara INTERPOSING] Nishant: Bagaimana anda mendapat ia berwarna? JASON Hirschhorn: Bagaimana saya mewarnakan pengekodan? Nishant: Saya tidak tahu. Oh. Simpan. JASON Hirschhorn: Simpan. Ya. Saya perlu simpan sebagai. C. Jadi simpan pada desktop sebagai cp.c. Manis. Dan jika saya ingin mendapatkan gaya penuh mata, apa yang perlu saya termasuk di bahagian atas? Nishant: Anda boleh menulis nama, nama anda program, dan maksud yang program ini juga? JASON Hirschhorn: Kelihatan baik. Cemerlang. Jadi anda telah mula kita mati dengan sempurna. # Termasuk - kami juga akan menulis - OK. Jadi saya fikir saya bersedia untuk pergi. Siapa yang mempunyai baris pertama kod bagi saya - atau baris pertama kod yang ia akan mengambil masa untuk memenuhi pertama kami komen di kod pseudo? Anda. PELAJAR 18: ia tidak Hendaklah int argc, dan kemudian char * argv? JASON Hirschhorn: Saya rasa anda betul. Mari kita menukarnya kepada int utama, paren terbuka, int argc, koma, char * argv? Seperti itu? PELAJAR 18: Kurungan. JASON Hirschhorn: Kurungan. Kurungan terbuka, kurungan rapat, ibu bapa dekat. Perfect. Sekarang saya boleh mengambil hujah baris arahan. OK. Pastikan kita diberi dua fail. Anda boleh memberi saya itu juga. PELAJAR 18: Jika argc - satu ini tidak sama 3. JASON Hirschhorn: Jika paren terbuka argc tidak sama 3? PELAJAR 18: Ya, anda kembali 1 atau apa-apa. JASON Hirschhorn: Maaf. PELAJAR 18: Pulang 1 atau apa-apa. JASON Hirschhorn: Kembali 1. OK? Besar. Buka kedua-dua fail. Siapa yang boleh membantu saya membuka kedua-dua gambar? Siapa yang tidak memberikan saya kod lagi? Kurt? KURT: Jadi semua topi F-I-L-E sumber bintang. JASON Hirschhorn: Saya akan untuk mengambil huruf hidup. Mereka adalah sejuk. Ia seperti Tumblr. PELAJAR 18: Sama fopen - JASON Hirschhorn: Sama fopen? PELAJAR 18: paren Terbuka, argv, kurungan terbuka. JASON Hirschhorn: Tunggu. Maaf. Paren terbuka. OK. PELAJAR 18: Yeah. Argv sub 1. JASON Hirschhorn: Pecahan 1? PELAJAR 18: Yeah. Argv kurungan terbuka 1 - ya. Dan kemudian koma, dan kemudian terbuka dua quote, r, petikan berganda, paren rapat, koma bertitik. JASON Hirschhorn: Sweet. Dan apa yang kira-kira satu yang lain? PELAJAR 18: Sangat serupa, tetapi sebaliknya S-R-C, anda akan memanggilnya D-S-T. JASON Hirschhorn: Oo! Saya suka itu. PELAJAR 18: Hanya D-S-T. Yeah. Dan kemudian argv, kurungan terbuka, 2. Yeah. Dan kemudian w bukan k. Yeah. JASON Hirschhorn: Great. Pasangan seterusnya baris. Juga, jika sesiapa mempunyai perkara untuk menambah garisan yang telah kami lakukan, anda boleh menambah mereka juga. Semak untuk memastikan tidak adalah NULL. Yang boleh memberikan saya kod saya perlu memenuhi bahawa garis kod pseudo? Archer. Archer: Jika src sama setaraf NULL atau DST sama setaraf NULL, maka anda kembali - JASON Hirschhorn: Apa? Archer: Kembali 2? JASON Hirschhorn: Kembali 2. Jadi jika paren terbuka src sama sama NULL, atau - apa sahaja yang thing's - paip? Paip? Kami akan memanggilnya paip. Paip, paip, DST sama setaraf NULL, kembali 2. OK? Sehingga kita keluar dari bait - kita jenis dilangkau lebih langkah ini dari sebahagian kod pseudo untuk pergi ke sini. Tetapi kita keluar dari bait - apa yang tidak bunyi yang seperti? Apakah jenis struktur C - tetapi saya tidak menggunakan struktur perkataan, kerana kita akan mula menggunakan bahawa dalam kes-kes lain - tetapi C alat tidak bunyi yang seperti? PELAJAR 19: gelung A. JASON Hirschhorn: gelung A. Bunyi seperti gelung. Jadi yang boleh memberikan saya baris pertama kod gelung yang betul di sini? Anda juga boleh memilih jenis gelung yang anda mahu, jika anda memberikan saya baris ini kod. Terdapat tiga jenis. Anda mendapat untuk memilih. Saya cadangkan salah seorang daripada mereka. Avi. Yang mana satu yang anda mahu? AVI: UNTUK. JASON Hirschhorn: UNTUK. AVI: INT i sama dengan sifar. JASON Hirschhorn: OK. AVI: Bahagian ini saya tidak pasti tentang. Tetapi saya adalah kurang daripada saiz sumber bintang? Saya tidak pasti itu. JASON Hirschhorn: OK. AVI: Kerana anda mahu saiz fail yang, bukan? JASON Hirschhorn: Jadi ini mungkin tidak akan memberi kita saiz sebenar memfailkan di bait. Jadi apa lagi yang kita boleh buat? Apakah satu lagi jenis gelung? Atau kita berpegang dengan gelung UNTUK ini? PELAJAR 20: Bolehkah anda melakukan gelung SELAGI? Dan kemudian, apa yang anda akan lakukan adalah you'd - kerana kita mempunyai char * untuk fail. Jadi, jika kita hanya menyimpan menokok bahawa sehingga kita akan dapati watak NULL di akhir itu? Atau tidak, adalah bahawa tidak bagaimana fail berfungsi? JASON Hirschhorn: Oleh itu, kita boleh menyimpan menokok char * sehingga kita dapati NULL yang - PELAJAR 20: Pada dasarnya menyimpan akan watak oleh watak sehingga kita mencapai akhir fail. JASON Hirschhorn: Ya. Jadi itulah yang kita mahu lakukan. Kami mahu terus membaca, watak oleh watak, sehingga kita sampai ke akhir fail. PELAJAR 20: Yeah. Cari - apa yang akhir atau tanda berhenti pada akhir fail teks. JASON Hirschhorn: OK. Oleh itu, apabila kita sampai ke akhir fail - bagaimana kita tahu kita telah mencapai akhir gambar? Jika saya memanggil - jadi mari kita langkah ke belakang. Apakah fungsi? Mari kita pergi ke baris ini di sini. Baca dari fail sumber. Yang boleh memberikan saya bahawa baris kod? PELAJAR 21: Fscanf? JASON Hirschhorn: Fscanf. OK. Bagaimana jika saya ingin membaca, sangat khusus, satu bait? PELAJAR 21: Saya tidak tahu. JASON Hirschhorn: OK. Malah lebih mudah daripada fscanf - apa yang - Saya mahu membaca dari fail sumber? Baca dari fail sumber. Apakah fungsi - yeah. PELAJAR 22: Ia fread? JASON Hirschhorn: Fread. Saya rasa mari kita tetap dengan yang satu untuk sekarang. Apakah jenis hujah adakah fread mengambil? PELAJAR 22: Mungkin jenis fail, dan kemudian lokasi dalam fail? JASON Hirschhorn: Apa yang saya boleh menaip di sini untuk memikirkan apa jenis hujah fread mengambil? PELAJAR PELBAGAI: fread Man. JASON Hirschhorn: Man fread dan fwrite. Kelihatan seperti mereka melepak bersama-sama. Jadi fread mengambil berapa banyak hujah-hujah? PELAJAR 23: Empat. JASON Hirschhorn: Ia mengambil empat hujah. Ia mengambil penunjuk, saiz, dan bahawa perkara, yang pelik, dan beberapa fail. OK? Mari kita membaca mengenainya di sini. "Fungsi fread berbunyi n memb elemen data, setiap bait saiz panjang, dari aliran yang ditunjukkan oleh aliran, menyimpannya di lokasi yang diberikan oleh penunjuk. " Jadi empat hujah. Kenapa saya tidak hanya menyalin ini, dan tampalkannya di sini. OK. Jadi yang boleh mula mengisi hujah-hujah ini untuk saya? Avi. AVI: Keluarkan tidak sah itu. Letakkan hanya src. Mengambil penunjuk dan bintang. Letakkan src. Kemudian - JASON Hirschhorn: Jadi saya akan berhenti anda di sana, kerana itulah tidak betul. Anda betul dengan src, tetapi mana src harus pergi? [Suara INTERPOSING] JASON Hirschhorn: Ia harus pergi di sini. Itulah yang src - src kami adalah jenis. Mari kita lihat di sini. Ini adalah meminta sejenis FILE *, kita sebenarnya biasanya melihat mereka seperti itu. Jadi ini adalah meminta hujah daripada menaip FILE * dipanggil aliran yang src. OK? Apa saiz perkara lakukan kita mahu membaca? Saya memberikan anda ini dalam Penerangan masalah. PELAJAR 24: Satu bait pada satu masa. JASON Hirschhorn: Satu bait. Bagaimana besar adalah bait? Saiznya adalah dalam bait, jadi apa boleh saya meletakkan di sana? PELAJAR 25: Satu. JASON Hirschhorn: Satu. Betul. Saiznya adalah dalam unit bait, jadi 1 adalah 1 bait. Berapa banyak yang saya mahu untuk membaca pada satu masa. PELAJAR 26: Satu? JASON Hirschhorn: Satu perkara. Saya mahu membaca satu perkara saiz 1, satu gigitan pada satu masa. Dan di mana saya meletakkan ia, apabila saya membacanya? PELAJAR 27: Destinasi? JASON Hirschhorn: Jadi saya tidak boleh meletakkan ia terus ke destinasi. PELAJAR 28: Kamu akan meletakkan ke dalam penunjuk ketiga? PELAJAR 27: Untuk destinasi. JASON Hirschhorn: OK. Yeah. PELAJAR 29: Anda boleh mengisytiharkan sesuatu untuk bertindak sebagai penyimpanan sementara sebelum ini. JASON Hirschhorn: OK. Berikan saya itu. PELAJAR 29: Satu lagi fail penunjuk, mungkin? JASON Hirschhorn: OK. Jadi ini adalah bintang tidak sah - ia adalah satu jenis tidak sah bintang, jadi ia tidak perlu menjadi penunjuk fail. Dan jika saya membaca satu bait, di mana akan menjadi tempat yang baik untuk menyimpan satu bait? PELAJAR 29: Pelbagai? JASON Hirschhorn: Pelbagai. OK. Dan apa lagi yang sesuatu yang hanya saiz satu bait? PELAJAR 30: A char *? PELAJAR 29: Yeah. JASON Hirschhorn: char A * bukan satu bait. PELAJAR 29: char A. JASON Hirschhorn: char adalah satu bait. Betul? Jadi mari kita memanggil penampan ini adalah generik Nama yang digunakan untuk perkara-perkara ini untuk menyimpan sesuatu yang buat sementara waktu. Jadi saya mewujudkan penampan. Betul? Tetapi ia mengambil kekosongan *. Jadi mungkin anda betul, bahawa ia perlu menjadi penampan saiz 0. Jadi ia menyimpan satu - betul. Oleh kerana hak ini di sini - char penampan adalah watak, tetapi ini mengambil masa kekosongan * - penunjuk. Jadi saya boleh melakukan ini dan kini penampan adalah penunjuk. Apa lagi yang saya boleh buat? PELAJAR 31: Letakkan bintang sebelah char. JASON Hirschhorn: Saya boleh menciptanya char *. OK. Apa yang satu lagi perkara yang saya boleh buat? Atau mari kita pergi dengan yang satu ini. Char * buffer, jadi apa saya meletakkan di sini? PELAJAR 31: Penampan. JASON Hirschhorn: Penampan. Penampan adalah penunjuk kepada char a. Dan di lokasi itu, kami meletakkan satu bait daripada sesuatu yang kita telah membaca. Yeah. Avi. AVI: Hanya satu soalan cepat. Adakah anda ingin malloc buffer? JASON Hirschhorn: Siapa yang boleh menjawab soalan itu? PELAJAR 32: Nah, itu tidak terlalu mata kepada apa-apa sekarang, jadi - JASON Hirschhorn: Tetapi adakah kita mahu malloc ia? PELAJAR 32: Sekiranya anda melakukannya bahawa cara, saya rasa, yeah, kerana anda perlukan beberapa tempat untuk ia menunjukkan. JASON Hirschhorn: Adakah kita perlu malloc ia? PELAJAR 33: Jika anda akan menggunakannya di luar gelung. JASON Hirschhorn: Adakah kita akan menggunakannya di luar gelung? PELAJAR 34: Ya. PELAJAR 35: Tunggu. Adakah kita mahu mengaku ia dalam gelung untuk di luar? JASON Hirschhorn: Jadi saya rasa kita mempunyai beberapa gelung SELAGI pseudo di sini bahawa kita cuba untuk memikirkan, bahawa kami tidak mendapat ke yet. Kami tidak perlu malloc ia. Kami beroperasi dalam utama, ia hanya akan yang akan digunakan di dalam gelung ini. Ia tidak perlu wujud di luar ini. Jadi ia boleh menjadi satu pembolehubah tempatan. Anda mempunyai penunjuk kepada pembolehubah tempatan. PELAJAR 36: Tetapi ia tidak menunjuk ke apa-apa. JASON Hirschhorn: Tidak, ia bukan dimulakan untuk apa-apa. Tetapi kita tidak akan menggunakannya juga. Kami akan meletakkan sesuatu di dalam ia kali pertama kami menggunakannya. Jadi yang kelihatan OK. Oleh itu, kita tidak perlu malloc sini. Dan saya fikir ia OK sebagai adalah. OK. Kami mempunyai garis fread. Mari kita buat barisan yang seterusnya. Jika kita mahu menulis kepada fail, apa yang fungsi yang baik untuk menggunakan untuk berbuat demikian? PELAJAR 37: Fwrite? PELAJAR 38: Fprintf? JASON Hirschhorn: Fprintf adalah satu. Apa yang satu sama lain? PELAJAR 39: Fwrite. JASON Hirschhorn: Fwrite. Dan untuk tujuan kita, fwrite, yang kita lihat di sini, adalah mungkin pilihan yang lebih baik. Ia mengambil empat hujah juga. Nishant, anda boleh memberikan saya hujah-hujah? Nishant: sedang Yang pertama ini menjadi penampan hanya. JASON Hirschhorn: OK. Nishant: Yang kedua ini hanya akan menjadi 1. Satu pertiga akan menjadi 1. Dan yang keempat akan menjadi DST. JASON Hirschhorn: Ada sesiapa yang sebarang soalan mengenai garis itu? Yang kelihatan baik. OK. Jadi kini ia kelihatan seperti satu perkara yang kita hilang - sebenarnya, mari kita menulis ini baris terakhir. Menutup fail. Yang boleh menyelesaikan kita sehingga bertulis kedua-dua baris terakhir? Ya. Maaf, apa nama anda? LUCY: Lucy. JASON Hirschhorn: Lucy. LUCY: src Fclose dan kemudian destinasi fclose. JASON Hirschhorn: Fclose, paren terbuka, src, paren rapat, koma bertitik. Dan fclose - yeah? LUCY: kurungan Terbuka, DST dan kemudian koma bertitik. JASON Hirschhorn: Great. Dan apa yang perlu saya masukkan pada akhir? LUCY: Kembali 0. JASON Hirschhorn: Kembali 0. Adakah saya perlu? Hanya satu soalan. Adakah kita perlu termasuk pulangan 0? PELAJAR PELBAGAI: No JASON Hirschhorn: No Utama melakukannya secara automatik jika anda sampai ke akhir. Tetapi saya fikir ia adalah baik untuk termasuk ia dengan jelas. Terutamanya apabila kita kembali lain perkara sepanjang program tersebut. OK. Ini adalah apa yang kita hilang - SELAGI apa? Siapakah yang boleh memikirkan beberapa - mempunyai beberapa rasa apa perkara yang boleh pergi di sana? Walaupun ia hanya dalam beberapa kod pseudo seperti bahasa? Apakah kita benar-benar - apa yang kita mahu pergi sehingga? Ya, Lucy. LUCY: Hujung fail. JASON Hirschhorn: Hujung fail. Jadi, apa yang anda maksudkan dengan akhir fail? LUCY: Sebaik sahaja anda sampai ke akhir fail tersebut, berhenti. JASON Hirschhorn: OK. Jadi sebaik sahaja kami sampai ke akhir fail. Bagaimana kita tahu apabila kita telah mencapai akhir fail? PELAJAR 40: Saya rasa penampan akan ditetapkan untuk NULL. PELAJAR 41: Penampan diisytiharkan di dalam gelung. JASON Hirschhorn: Jadi anda berfikir penampan akan bersedia untuk NULL. Mengapa penampan ditetapkan untuk batal? PELAJAR 40: Kerana apabila anda fread, anda cuba untuk meletakkan apa-apa ke dalam buffer. JASON Hirschhorn: OK. Jadi anda berfikir fread - apabila kita telah mencapai akhir fail, apa yang fread akan lakukan? Saya fikir itu soalan kita perlu memikirkan. Apakah fread lakukan? Adakah ia meletakkan NULL dalam buffer, atau ia melakukan sesuatu yang lain? Bagaimana kita boleh memikirkan apa yang ia? PELAJAR 42: Man. JASON Hirschhorn: Man. Jadi mari kita lihat di sini. Kembali nilai. Pada kejayaan, fread dan fwrite mengembalikan beberapa item dibaca atau ditulis. Nombor ini sama bilangan bait dipindahkan hanya apabila saiz ialah 1. Jika ralat berlaku, atau akhir file dicapai, nilai pulangan adalah kiraan item pendek atau 0. Jadi untuk tujuan kita, jika mencapai fread akhir fail tersebut, dan membaca dari akhir fail, ada apa yang tinggal membaca, apa yang ia akan kembali? PELAJAR 43: Zero? JASON Hirschhorn: Apa? PELAJAR 43: Zero? JASON Hirschhorn: Zero. Ia akan kembali sifar. Oleh itu, kita tahu bahawa fread, apabila kita telah sampai ke penghujung fail tersebut, akan untuk kembali sifar. Bagaimana kita boleh menggunakannya untuk keuntungan kita? AVI: Anda boleh mengisytiharkan pembolehubah di luar gelung yang dipanggil cek. Jika cek sama - untuk sekarang - satu. JASON Hirschhorn: OK. AVI: Dan kemudian anda boleh meletakkan JIKA Penyataan selepas fread berkata jika fread sama dengan sifar - tidak. JASON Hirschhorn: Siapa yang boleh membantu Avi keluar? AVI: Apakah nilai dikembalikan oleh fread? JASON Hirschhorn: Kami hanya pergi ke itu. AVI: Bagaimana anda mewakilinya? JASON Hirschhorn: Jadi ia kembali - mari kita mencari di sini - ia mengembalikan size_t, yang pada dasarnya integer. Jadi ia mengembalikan integer. Dan dalam kes ini, ia akan kembali 1 atau 0 - 1 jika ia membaca satu perkara - satu bait, dan 0 jika kita telah mencapai akhir. Jadi jika fread - yeah? PELAJAR 45: Tidak boleh anda hanya meletakkan penuh fread (buffer, 1, 1, src) ke dalam manakala gelung? JASON Hirschhorn: Jadi anda mencadangkan melakukan ini ke dalam sana? [Suara INTERPOSING] JASON Hirschhorn: Berpegang. Jadi kita sedang memerangkap itu. Jadi anda bercadang meletakkan fread ke sana? Apa yang patut kita juga bergerak jika anda mahu berbuat demikian? PELAJAR 45: penampan ini luar. JASON Hirschhorn: Kami perlu juga bergerak ini di sini. PELAJAR 45: Tetapi adakah yang sentiasa bergerak ke hadapan? [Suara INTERPOSING] JASON Hirschhorn: OK. Jadi ini adalah apa yang Okshar dicadangkan. Kami mewujudkan penampan kami. Kami SELAGI fread, maka kita fwrite. Pemikiran pada ini? PELAJAR 46: hanya soalan saya, adakah ia sebenarnya melaksanakan fread arahan? JASON Hirschhorn: Soalan Besar. Apabila anda meletakkan panggilan fungsi di dalam keadaan, adakah itu panggilan fungsi melaksanakan? Kami telah melihat contoh-contoh ini sebelum ini. Betul? PELAJAR 46: OK. Yeah. Jadi ia melaksanakan. JASON Hirschhorn: Kami telah melihat perkara-perkara seperti itu sebelum ini, di mana kita mempunyai fungsi panggilan dalam syarat. Adakah bahawa fungsi panggilan melaksanakan? Ya. Jadi jawapannya adalah ya. Ini panggilan fungsi akan melaksanakan. Tetapi sekali lagi, adalah yang kita mahu? Apa yang salah satu cara kita boleh memikirkan jika ia adalah apa yang kita mahu? PELAJAR PELBAGAI: Jalankan ia? JASON Hirschhorn: Kita boleh menjalankannya. Tetapi sebelum kita berbuat demikian, kita boleh juga sebab melalui ini. Jika - katakan kita ada satu bait dalam kami memfailkan, kita akan mendapat di sini, kita akan mendapat kod ini. Ini akan berjalan. fread akan kembali satu bait dan menyimpannya dalam buffer. Dan ini akan menilai kepada 1, betul, selepas dia kembali 1. Jadi SELAGI 1. Adakah ini bermakna kod di dalam gelung SELAGI akan melaksanakan? PELAJAR 47: Yeah. Ia adalah benar. JASON Hirschhorn: Ya. 1 adalah benar. Ia bukan 0. Jadi kod di dalam di sini akan melaksanakan. Oleh itu, kita akan menulis itu. Kami akan kembali ke ini talian sekali lagi. Sekarang kita mempunyai - kami pada akhir fail kami. Kita membaca dari akhir fail kita, kerana kita hanya mempunyai satu bait di dalamnya. Fread mengembalikan 0, kedai-kedai sesuatu dalam buffer. Saya secara jujur ​​tidak tahu apa ia menyimpan dalam buffer. Kita mungkin boleh mencari untuk melihat apa yang dilakukan. Bahawa saya secara jujur ​​tidak tahu. Kita tidak tahu, yang peduli apa ia menyimpan dalam buffer? Tetapi ia kembali 0. Dan akan Walaupun 0 melaksanakan? SELAGI 0 tidak akan melaksanakan. Demikian maka kami akan turun ke bawah di sini. Jadi mari kita mendapatkan tangan jika ini adalah kod yang kami perlu menjalankan, atau jika kita perlu melakukan perubahan pertama. Jadi, jika anda berfikir - anda perlu mengundi. Jika anda fikir kita perlu menjalankan kod ini sebagai adalah, sila mengangkat tangan anda. OK. Ada satu - adakah anda mempunyai soalan, kebimbangan? Yeah. PELAJAR 48: Selepas kita bergerak penampan di luar gelung, kita perlu malloc ia? JASON Hirschhorn: Soalan Besar. Selepas kita bergerak penampan di luar gelung, kita perlu malloc ia? Ini adalah soalan skop. Jika kita memulakan penampan di luar gelung ini, ia akan wujud di dalam gelung? PELAJAR PELBAGAI: Ya. JASON Hirschhorn: Ya. Skop meliputi bahagian dalam gelung, dan, benar-benar, apa-apa di bawahnya di dalam kod ini, termasuk perkara di dalam sini. Oleh itu, kita tidak perlu malloc ia. Ia adalah satu pembolehubah tempatan, dan skop masih termasuk gelung. PELAJAR 49: Adakah kita perlu untuk membebaskannya? JASON Hirschhorn: Adakah kita perlu penampan percuma? PELAJAR 49: Ya, jika kita tidak malloc. JASON Hirschhorn: Adakah kita perlu penampan percuma? Tetapi tidak kita. Sekali lagi, ia adalah pembolehubah tempatan, jadi kami tidak perlu untuk membebaskannya. OK. Mari kita lihat apa yang berlaku. Jadi adalah tidak diisytiharkan. Itulah yang sesuatu yang Marcus dicadangkan sebelum ini. Jadi kita mempunyai ralat yang, penampan ubah adalah tidak diisytiharkan apabila digunakan di sini. Bagaimana kita boleh menetapkan ini? PELAJAR 50: Malloc ia? PELAJAR 51: Sama NULL? PELAJAR 52: Katakanlah penampan sama NULL. JASON Hirschhorn: OK. Kelihatan baik. Kita ada sekarang. Mari kita mencipta sesuatu untuk mencuba menyalin. Oleh itu, kita mempunyai fail teks kita. Bagaimana kita boleh menjalankan program ini? Yeah. PELAJAR 53: Anda boleh melakukan dot mengurangkan cp, test.txt. Dan kemudian anda boleh menamakan fail lain yang ia akan menyimpan ke dalam. JASON Hirschhorn: OK. Kami akan memanggilnya out.txt. Sejuk? Seg bersalah. Pemikiran pada seg bersalah itu? Ini adalah besar. Bagaimana kita boleh mengetahui di mana bersalah seg itu? Apa? PELAJAR 54: GDB. JASON Hirschhorn: GDB. Kami menjalankan Pra-Pemasangan dengan menulis Pra-Pemasangan dot slash, nama program kami. Tiada hujah baris arahan sana. Kami akan menetapkan takat putus di utama. Jika saya ingin memulakan Pra-Pemasangan, apa yang saya lakukan? PELAJAR 55: R. JASON Hirschhorn: R. Kemudian apa? PELAJAR 55: Hujah-hujah? JASON Hirschhorn: Kemudian hujah baris arahan. Mari kita berjalan melalui. N hanya mengambil saya baris demi baris. Saya akan pergi sehingga Saya mendapat bersalah seg saya. Ada kesalahan seg saya. Ia kelihatan seperti fread disebabkan bersalah seg saya. Saya tahu fread disebabkan kesalahan seg saya, kerana itu adalah line kita hanya dilaksanakan. Dan satu-satunya perkara yang berlaku di garis yang - dua perkara yang telah berlaku. Fread akan, dan kemudian kami melakukan beberapa pemeriksaan SELAGI. Saya sanggup bertaruh bahawa SELAGI yang memeriksa tidak menyebabkan kerosakan seg saya. Kemungkinan besar, fread adalah menyebabkan kerosakan seg saya. Saya juga melihat sesuatu di sini, memcopy. Salinan ingatan. Bunyi seperti memori bergerak dari satu lokasi ke lokasi yang lain. Bunyi seperti sesuatu yang akan berlaku dalam fread, mungkin beberapa memori bergerak dari sini ke sini. Mari kita pergi melalui ini lagi. Bagaimana saya memulakannya lebih dan menjalankannya lagi? Yeah. PELAJAR 56: Adakah anda perlu meletakkan satu Ampersand sebelum buffer? JASON Hirschhorn: Jadi Ampersand sebelum penampan akan memberi saya alamat penampan, yang merupakan satu char *. Mari kita berjalan melalui masa ini satu lagi. Bagaimana cara menguruskan melaluinya sekali lagi? PELAJAR 57: Bolehkah anda hanya menaip jalankan lagi? JASON Hirschhorn: Hanya taip jangka lagi. Oleh itu, kita tidak akan melaksanakan baris ini. Jadi penampan adalah penunjuk NULL. Betul? Ia menunjuk ke - mari kita lihat. Jika kita mempunyai kita - melukis gambar cepat ini. Bolehkah semua orang melihat jika Saya menulis di sini? Jadi dalam tindanan, kita mempunyai tempatan berubah dan ia dipanggil penimbal, dan ia adalah penunjuk kepada char a. Apa alamat adalah char ini di? PELAJAR 58: 0x0. JASON Hirschhorn: Betul. Itulah yang ini. Di sini, di dalam penimbal, disimpan 0x0. Itulah apa yang kita ada - yang persediaan kita kecapi sekarang. Jadi baris ini, fread, meletakkan sesuatu dari sumber mana? Ke dalam kotak ini atau kotak ini? Yang kotak? Kiri kotak atau kotak yang betul? Kotak betul. Ia mengikuti penunjuk, dan meletakkannya di sini. Apabila kita cuba dan memori sentuhan pada lokasi 0, apa yang kita dapat? Satu kesalahan segmentasi. Itulah kesilapan yang kita ada sekarang. Yeah. PELAJAR 59: Jangan anda mempunyai untuk meletakkan penampan bintang? Atau tidak? Untuk fread? JASON Hirschhorn: Jadi fread mengambil penunjuk. Jadi ia pas dalam buffer. Dan kemudian ia akan de-rujukan di suatu tempat di dalam fread. Tetapi sekali lagi, kita lihat, ia mengambil penunjuk. Kami tidak perlu lulus ia penampan bintang. Yang akan berlalu apa sahaja di sini. Dan yang mungkin akan memberi kita satu kesilapan kerana kita de-rujukan itu. Betul? Apabila kita de-rujukan penunjuk ini, apabila kita cuba untuk mengakses lokasi ini, kami mendapat kesilapan - kesalahan segmentasi kami. Jadi - oops. Kita akan berhenti daripada Pra-Pemasangan. Talian kami - masalah kita - yang tepat di sini pada baris ini. Dan ia masalah kerana garis ini. Bagaimana kita boleh membuat kotak yang boleh diakses dalam fread. Betul? Kita perlu mewujudkan kotak yang satu bait besar, saiz char a. Tetapi kita perlu kotak yang boleh diakses apabila fungsi melaksanakan. Jadi di mana - yeah. Apa-apa idea? PELAJAR 60: Hanya menetapkan ia sebagai apa-apa sifat rawak. Lakukan setaraf penampan char watak. Dan kemudian, apabila anda telah penampan di sana - JASON Hirschhorn: Tunggu. Char penampan? Jadi tidak bintang? PELAJAR 60: Yeah. Mengambil bintang. Sama watak rawak. JASON Hirschhorn: OK. Jadi memberi saya satu. PELAJAR 60: Seperti atau sesuatu. Dan kemudian apabila anda mempunyai penampan di sana, anda menggunakan - PELAJAR 61: Bintang? Oh tidak, Ampersand itu. PELAJAR 60: Gunakan Ampersand itu. JASON Hirschhorn: OK. Dan apa yang kira-kira dalam fwrite? PELAJAR 60: Gunakan Ampersand lagi. JASON Hirschhorn: Baiklah. Jadi idea anda, kami mewujudkan char dan meletakkan sesuatu di dalamnya, dan kemudian menulis kepada char itu. PELAJAR 60: Yeah. JASON Hirschhorn: Apa yang orang berfikir? PELAJAR 62: Ia berbelit. JASON Hirschhorn: OK. Mari kita menarik keluar. Jadi kali ini, saya akan menarik ini di merah pada timbunan di sini, dan kemudian kita akan mempunyai - aduh! Maaf. Jadi kali ini kita mempunyai sesuatu yang dinamakan penampan, dan ia pada timbunan. Betul? Dan kita menyimpan di dalamnya, pada mulanya. Maka kita mempunyai panggilan kami untuk fread. Apa fread adakah ia mengambil bait dari fail dan kami meletakkannya di suatu tempat. Ia meletakkan ia dalam apa jua yang perkara itu menunjuk ke. Nah, sebelum kami alamat ini - 0x0. Sekarang apa alamat yang kita ada? PELAJAR 63: Apa sahaja alamat penampan adalah. JASON Hirschhorn: Apa jua alamat penampan adalah. Ia mungkin akan menjadi sesuatu seperti itu. Mungkin akan bermula dengan b dan satu f, dan kemudian mempunyai enam lain digit perenambelasan. Tidak mengapa. Sesetengah alamat. Dan kita lulus alamat yang masuk Dan kita akan meletakkan satu kami perkara bait di alamat itu. Oleh itu, kita akan meletakkan satu kami perkara di dalam bait di sini. Dan kemudian kita akan menulis dari apa yang pernah di dalam sini. Adakah sesiapa mempunyai apa-apa soalan tentang itu? Yang difikirkan kod ini akan berfungsi? Mengangkat tangan anda jika anda berfikir kod ini akan berfungsi. Anda perlu mengambil pendirian yang. Dan yang difikirkan kod ini tidak akan berfungsi? Mengangkat tangan anda. Semua orang lagi yang perlu menjadi mengangkat tangan mereka. OK. Michael, di mana anda berdiri? MICHAEL: Saya tidak boleh membuat keputusan. Jenis di tengah-tengah. JASON Hirschhorn: Anda di tengah-tengah. Memilih satu. MICHAEL: Saya akan beriman dan mengatakan ia akan berfungsi. JASON Hirschhorn: OK. Anda akan beriman dan mengatakan ia berfungsi? Apa yang berlaku? [Suara INTERPOSING] JASON Hirschhorn: Tidak bersalah seg. Bagaimana kita boleh menyemak untuk melihat jika dua perkara yang sama? Dua fail adalah sama. PELAJAR 64: Diff. JASON Hirschhorn: Diff. Cek beza bagi perbezaan antara dua fail, dan jika ia kembali apa-apa, mereka serupa. Dan jika kita membuka, kita akan mendapat fail kami. Sehingga adalah penyelesaian yang betul. Mari kita lihat kembali pada ia sekali lagi. Kita sebenarnya tidak pun perlu untuk memulakan ia. Ia mungkin akan kelihatan sedikit bersih jika anda tidak meletakkan sesuatu rawak di sana. Titik ini, anda diperlukan untuk mewujudkan sedikit ruang untuk menyimpan sesuatu dari fread dan mengambil sesuatu daripada fwrite. Dan perkara yang terpaksa sama ada tempatan berubah-ubah pada timbunan - anda boleh telah malloc'd sedikit ruang. Oleh itu, kita sebenarnya boleh mempunyai malloc ditulis di sini, dan yang akan bekerja. Dan kemudian kita akan telah menyimpan barang-barang kami di suatu tempat di timbunan itu. Tetapi ini sebenarnya, mungkin, penyelesaian yang paling elegan. Hanya membuat sedikit ruang pada timbunan untuk perkara-perkara ini pergi. Saya akan mempunyai dua pandangan lain. Jika anda telah mengambil giliran dalam hal ini, dan kemudian mendapatkan menjaringkan ini, komen saya adalah seperti berikut. Ini 1 di sini, bagi saya, melihat seperti nombor sihir. 1, dari segi fread, masuk akal. Itulah beberapa perkara membaca atau menulis. Tetapi yang satu ini di sini perlu mungkin menjadi sesuatu yang lain. Jadi apa yang salah satu penyelesaian? PELAJAR 65: Saiz bait. JASON Hirschhorn: Seperti yang? PELAJAR 65: Saiz char. JASON Hirschhorn: Saiz char. Ya, bait bukan jenis yang. Jadi saiz kerja-kerja char. Kami boleh, di bahagian atas kod kami, # ditakrifkan itu. Dipanggil sesuatu BYTE dan ia benar-benar char a. Sebenarnya, pendekatan yang lebih baik mungkin telah ini - uint. Sesiapa sahaja tahu apa itu? Maaf. Saya mempunyai ia ke belakang. Tunggu, tidak. Jalan mana ia pergi? Sesiapa sahaja tahu apa itu? Yeah. PELAJAR 67: sepatutnya untuk membantu menyeragamkan seluruh sistem perkara-perkara yang mempunyai - seperti integer tidak ditandatangani yang mempunyai 8 bytes? JASON Hirschhorn: Itu betul-betul betul. Pada mesin yang berbeza, saiz char a - biasanya tidak char a. Aksara biasanya satu bait. Tetapi saiz jenis data lain saiz yang berbeza pada mesin 32-bit berbanding mesin 64-bit. Uint8_t A sentiasa 8 bit - sentiasa satu bait. Dan saya perlu termasuk yang standard fail header int. Jadi sekarang, ini akan mungkin menjadi cara terbaik untuk menulis kod ini. Jadi saya menghilangkan nombor ajaib. Dan saya juga mempunyai lebih logik menaip untuk penampan. Ia bukan sekadar char, adalah satu bait, yang merupakan apa yang kita harapkan ia menjadi. Dan di sini, kita telah benar-benar menjadi sedikit lebih teguh. Kami tidak memanggil ia char, yang - mungkin, yang tahu - boleh menjadi berbeza saiz pada mesin yang berbeza. Kita sebenarnya mengatakan ini adalah betul-betul satu bait, sentiasa, tidak kira apa. Dan jika kita lihat di sini, kami membuat cp. Uh-oh. Apa yang berlaku? PELAJAR 68: Ia mungkin dihidupkan. JASON Hirschhorn: Apa? PELAJAR 69: Adakah ia? PELAJAR 70: Anda tidak menentukan ia sebagai jenis yang. PELAJAR 71: Tetapi ia perlu ditakrifkan dalam standard. PELAJAR 72: Apa yang berlaku? PELAJAR 73: Sekiranya menentukan semua topi? JASON Hirschhorn: Jadi ia bukan # menentukan. Sebenarnya, dalam kes ini, saya akan menggunakan typedef. Kerana kita menggunakannya sebagai sejenis di satu lokasi. Jadi dalam kes ini, kita benar-benar ingin typedef seperti kita mencetak jenis baru bait, dan ia adalah, pada dasarnya, ini. Ia agak berbeza daripada # menentukan. Dan kini, kod kita berfungsi dengan sempurna. Jadi, sekali lagi, # menentukan mengambil sesuatu, menggantikan mana-mana sahaja dengan perkara yang lain. Ia hanya makro - trengkas untuk menghapuskan nombor ajaib. Tetapi dalam kes ini, kerana kami menggunakannya sebagai jenis yang - di sini - agar yang ke tempat kerja, kita perlu untuk typedef apa sahaja bait adalah. Dan kita menentukan ia di sini. Ia bukan struct, ia sebenarnya hanya integer tak bertanda. Ia satu bait panjang. Kod ini boleh didapati dalam talian, dan anda semua harus mempunyai sekarang. Oleh itu, kita mempunyai - sempurna - 13 minit kiri untuk pergi masalah lebih menetapkan 5. Saya mahu bergerak melalui copy.c bersama-sama, dan kemudian kita akan bercakap secara ringkas mengenai bahagian-bahagian lain masalah yang ditetapkan. Jadi biarlah saya tarik sehingga copy.c. Dan perkara yang sejuk, kita telah benar-benar sudah menulis banyak kod ini. Kod kita menulis betul-betul hanya keluar dari sini ketika saya menulis ini pada saya sendiri. Tetapi ini adalah copy.c, membentuk asas untuk kedua-dua bahagian pertama masalah yang ditetapkan untuk whodunit.c, yang anda perlu menulis dan resize.c. Recover.c, yang ketiga dan terakhir sebahagian daripada masalah yang ditetapkan, tidak berdasarkan kira fail ini. Anda akan perlu untuk menulis fail yang, kami memberi anda template untuk yang fail, tetapi ia tiada kaitan dengan copy.c. Tetapi kerana copy.c adalah asas untuk kedua-dua bahagian pertama, kita akan berjalan melaluinya sekarang, supaya anda mempunyai perasaan yang baik dari apa yang ia. Dan komen memberikan beberapa jauh. Kami sudah menulis beberapa ini. Pertama, kami memastikan kita akan mendapat tiga hujah. Seterusnya, kita mengingati nama fail. Oleh itu, kita dilangkau langkah ini apabila kita berkod perkara kami - apabila cp kami. Tetapi di sini, mereka membuat ia sedikit lebih bersih. Mereka memeriksa untuk memastikan kedua-dua fail yang baik, dalam Selain membuka mereka. Kami menulis semua kod ini tadi, jadi saya tidak akan kekal di atas kod ini. Seterusnya adalah beberapa barangan itu khusus untuk jenis fail yang kita gunakan, yang adalah fail bitmap. Fail bitmap mempunyai beberapa metadata berkaitan dengan mereka. Jadi pasangan pertama bytes memberitahu anda tentang fail tersebut. Mereka tidak warna piksel dalam imej itu. Mereka memberitahu anda tentang fail tersebut. Dan jika anda membaca masalah yang ditetapkan, anda akan mempunyai lebih banyak maklumat kepada apa jenis struktur metadata termasuk dengan bitmap. Tetapi itu sebabnya kita mempunyai ini pertama set - kod ini di sini. Kita membaca metadata - dua keping metadata - fail header header dan info. Dan kita memeriksa beberapa bahagian itu untuk pastikan ia adalah fail bitmap benar sebelum meneruskan. Dan sekali lagi, ini adalah maklumat kita tidak perlu pergi ke dalam sekarang. Jika anda membaca masalah yang ditetapkan, anda akan memahami ini. Cerita panjang pendek, ini adalah hanya mengatakan, ini adalah fail bitmap, dan mengesahkan bahawa. Seterusnya, kami menulis mereka ke fail keluar. Kami melihat bahawa di sini. Kami menulis untuk penunjuk keluar. Seterusnya, kami menentukan padding. Jadi sekali lagi, seperti yang khas dengan fail bitmap, beberapa baris termasuk padding pada akhir. Dan jika anda membaca masalah yang ditetapkan, anda akan belajar lebih lanjut mengenai padding. Ini adalah formula untuk mencari padding. Penting untuk ingat - apabila anda menukar saiz bitmap yang memfailkan, perubahan padding. Apabila anda menukar saiz memfailkan, perubahan padding. Ia tidak pernah akan menjadi lebih besar daripada 3 - ia akan menjadi 0 hingga 3, inklusif. Tetapi apabila anda menukar saiz sesuatu, perubahan padding. Jika saya hanya mempunyai satu piksel berturut-turut itu, saya memerlukan tiga bait padding, kerana setiap baris perlu gandaan empat bait panjang dalam fail bitmap. Tetapi jika saya dua kali ganda, untuk pergi dari satu piksel dua piksel, setiap yang, katakan, adalah satu bait, maka saya perlu dua bait padding untuk membuat yang sama dengan empat. Oleh itu, apabila saya menukar saiz sesuatu, Saya perlu menukar jumlah yang padding saya. Adakah ini masuk akal untuk semua orang? Seterusnya, kami melelar atas setiap baris, atau melalui semua baris. Dan kemudian kita melelar melalui setiap lajur dalam setiap baris. Kami merawat bitmap ini seperti grid, seperti yang kita telah dirawat lembaga dalam 15. Seperti kita dirawat batu bata apabila kita dicetak mereka pada skrin. Satu grid baris dan lajur. Kemudian - kita melihat ini. Kami sebenarnya hanya berkod ini. Kami mencipta beberapa penyimpanan sementara. Kita baca di sana, dan kemudian kita menulis ia keluar. Ini betul-betul apa yang kita hanya lakukan. Seterusnya, kerana saya berkata setiap baris berakhir dalam beberapa padding, kita melangkau lebih padding yang - yang padding lama. Dan kemudian kita menambahkan kembali. Dalam kes ini, kita mewujudkan fail yang tepat sama. Kami hanya menirunya. Jadi garis ini adalah jenis bodoh. Kita boleh benar-benar hanya meletakkan padding masuk Tetapi jika anda menukar saiz fail, adakah anda masih mahu baris ini? Jadi, jika kita menukar saiz fail, kita masih mahu melangkau lebih padding yang lama? PELAJAR 74: Ya. JASON Hirschhorn: Jadi yang kita lakukan. Kerana ini, sekali lagi, tawaran dengan fail sumber. Kami tidak mengambil berat tentang padding dari fail sumber. Kami mahu pergi ke baris seterusnya. Tetapi kita tidak hanya meletakkan kembali jumlah yang lama padding. Kita perlu meletakkan belakang kadar baru padding. Oleh itu, apabila kita berubah saiz fail, kita masih mahu melangkau ke atas padding dalam fail lama - apa kita membaca dari. Tetapi apa yang kita menulis kepada, kita akan perlu untuk meletakkan kembali beberapa yang berbeza beberapa padding yang kami telah ditentukan. Yeah. PELAJAR 75: Perintah-dua garis tidak kira, bukan? Kerana anda mengendalikan fail yang berbeza. JASON Hirschhorn: Tepat sekali. Perintah kedua-dua baris tidak mengapa. Kami menulis baris ini. Ini adalah di sini untuk fail yang kita menulis untuk. Yang penting, jadi kita mendapat jumlah hak padding. Ini telah berurusan dengan fail dalam. Kami mahu melangkau hak lebih padding itu. Kami tidak mahu membaca - jika kita membaca bait pada satu masa, kita tidak mengambil berat tentang mereka bytes padding. Kami mahu bergerak ke baris seterusnya. Akhirnya sama seperti Lucy memberi untuk kita, kita menutup fail-fail dan kembali 0. Jadi ini adalah copy.c. Dan kita sebenarnya menulis - kita menghabiskan sebahagian besar seksyen menulis ini, pada asasnya. Anda membuat ini. Jadi diharapkan anda mempunyai perasaan yang baik daripada apa yang berlaku di sini. Perbezaan besar, jujur, hanya Bahagian pertama ini yang memperkatakan kepelikan fail bitmap. Jadi saya sebagai slaid depan saya, apa yang perlu kita lakukan? Nah, mari kita berfikir tentang Kisah penyiasatan. Dan bagi seseorang yang membaca masalah yang ditetapkan, apa yang kita perlu lakukan dalam Kisah penyiasatan? Semata-mata. Aleja. Aleja: Bolehkah anda mengambil bahagian yang bagi setiap piksel yang menandakan merah. Dan kemudian - jenis? JASON Hirschhorn: OK. Jadi mengambil pihak setiap pixel yang menandakan merah. Yang dekat, tetapi tidak semua itu. PELAJAR 76: Nah, ada cara yang berbeza untuk melakukannya. JASON Hirschhorn: OK. Berikan saya satu cara. PELAJAR 76: Ambil semua merah, dan kemudian menekankan biru dan hijau. JASON Hirschhorn: OK. Jadi diberikan kedua-dua cara - ia kedengaran seperti kita memberikan piksel, ia mempunyai tahap yang merah, biru, dan hijau. Kami mahu menukar tahap relatif merah, biru, dan hijau, bergantung pada pixel itu. Jika dalam kod ini kita perlu mengubah merah relatif, biru, dan hijau tahap pixel yang diberikan. Selepas kami membacanya - sebelum kita menulisnya? Berikan saya beberapa baris. PELAJAR PELBAGAI: 83. JASON Hirschhorn: 83. Jadi di sini. Untuk Kisah penyiasatan, kod yang anda perlukan untuk tuliskan semua perlu pergi di sana. Dan itulah satu-satunya kod anda perlu untuk menulis. Kerana, seperti yang kita dengar, semua yang anda perlu lakukan adalah menukar ini biru relatif, tahap merah, dan hijau dari setiap piksel. Anda telah membaca di dalam, dan kini anda akan menulis ia keluar. Bagaimana saya mendapat - jika saya mempunyai perkara ini dipanggil tiga kali ganda, di sini, dan ia daripada menaip RGBTRIPLE - baik, jika kita melihat di bmp.h, apa yang RGBTRIPLE? PELAJAR 77: Ia struct a. JASON Hirschhorn: RGBTRIPLE adalah struct a. Kita lihat bahawa sampai di sini. Dan jadi jika saya mahu akses, berkata, tahap merah struct itu, bagaimana saya mengakses tahap merah struct ini? [KELAS murmurs] PELAJAR 78: RGBTRIPLE.rgbtred? JASON Hirschhorn: Adakah itu betul? PELAJAR 79: Ia perlu tiga kali ganda dot, bukan RGBTRIPLE dot? JASON Hirschhorn: Triple. Triple adalah pembolehubah tempatan, jadi di sini, tidak ada petunjuk di sini. Oleh itu, kita hanya menggunakan notasi titik. Ini akan memberikan saya tahap merah. Jika saya ingin mengubahnya, saya hanya menetapkan ia sama untuk sesuatu yang berbeza. Jadi sekali lagi, ini selaras kod mengakses pembolehubah ini di dalam struct ini, dan kita boleh menetapkan ia untuk sesuatu yang baru. Jadi bagi Kisah penyiasatan, sekali lagi, ini adalah, pada dasarnya, apa yang kita perlu lakukan. Sangat mudah. Hanya menukar beberapa tahap relatif, dan ini adalah di mana kod yang pergi. Saiz semula, di sisi lain, agak sukar. Malah, saiz semula mungkin adalah sebahagian trickiest masalah ini ditetapkan. Kami mempunyai tiga minit untuk pergi ke atasnya. Apapun, kita sudah menulis kebanyakan kod ini, jadi kami harus cukup biasa. Apakah beberapa perkara yang kita mahu lakukan dalam mengubah saiz, jika anda telah membaca sepanjang masalah ditetapkan? Jika anda memberikan mereka kepada saya, kita boleh bercakap tentang mereka. Apakah beberapa perkara yang kita mahu lakukan? PELAJAR 80: Menegak - jadi anda perlu melintang mengubah saiz, tetapi menegak mengubah saiz ia juga? JASON Hirschhorn: Jadi jika kita diberikan pixel, dan kita mahu mengubah saiz oleh faktor dua, ia kini perlu saiznya mendatar dan saiznya menegak. Adakah ini masuk akal? Yeah. Jadi, itu mungkin yang Cabaran yang paling besar. Dan kita akan bercakap tentang itu dalam sebentar. Yeah. PELAJAR 81: Cara saya fikir ia telah anda diperlukan cetak keluar - JASON Hirschhorn: Tunggu. Jangan beritahu kami apa yang anda lakukan. Kami akan bercakap dalam logik. PELAJAR 81: OK. Apa soalan? JASON Hirschhorn: Anda hanya dibangkitkan tangan anda. Tidak ada soalan. Biar saya mengemukakannya. Biarlah saya hanya membincangkan secara ringkas ini. Oleh itu, kita mempunyai satu pixel, kami mahu meniru ia mendatar dan menegak. Begitu ideal apa yang kita lakukan di sini, kita dibaca pixel kami, kami menulis bagaimanapun banyak kali. Tetapi kita mempunyai helah kami di sini, kerana maka kita mahu melangkau ke garis depan dan menulisnya di permulaan baris berikutnya. Jadi, jika kita mahu meniru kedua-dua mendatar dan menegak, apa yang satu cara yang baik untuk berbuat demikian - satu yang baik walaupun untuk melakukan itu? Oleh itu, kita tidak perlu sentiasa berusaha sekitar fail kami untuk meletakkan sesuatu. Soalan yang mungkin tidak mempunyai masuk akal, tetapi saya fikir satu menjawab kepadanya akan membantu. PELAJAR 82: Buat satu pameran? JASON Hirschhorn: Jadi mari kita berfikir setiap fail sebagai berturut-turut. Mari kita berfikir dari segi baris. Jika kita mempunyai baris pertama kami dari kecil kami gambar, kita boleh membuat baris yang ke dalam satu barisan yang besar dari gambar yang besar, dan kemudian meniru baris tersebut bagaimanapun banyak kali ia perlu ditiru, bukannya pergi piksel dengan, yang mendapat mengelirukan apabila menangani fail-fail. Kerana jika kita mempunyai - Saya kehabisan ruang. Jika ini adalah fail kami, dan kami mempunyai yang satu piksel di sana, dan kami mahu meletakkannya di sana, kita masih mempunyai beberapa perkara yang bahawa keperluan untuk pergi ke sana apabila kita menulis dan mencipta fail baru kami - fail kami itu dua kali ganda besar. Tetapi ia benar-benar sukar dengan fungsi fail melangkau sekitar untuk garisan baru seperti itu, dan kemudian kembali di sini dan meletakkan perkara di sana. Ia hampir mustahil untuk melakukan sesuatu seperti itu, jika yang masuk akal. Jadi, jika kita berfikir dari segi baris, kita boleh mengambil barisan kita, dan kemudian meletakkan ia - meniru baris menegak. Dan itulah bagaimana kita berurusan dengan saiz semula menegak bukan melintang. Itu adalah jenis cepat, dan sedikit mengelirukan. Malangnya masa kita terpulang. Saya akan berdiri di luar untuk mereka di sini yang mempunyai soalan mengenai set masalah, termasuk pulih. Jadi mari kita menangguhkan buat masa ini. Dan sekali lagi, jika anda mempunyai sebarang soalan, kita boleh berbual di luar.