>> JASON Hirschhorn: Selamat datang, semua orang, untuk Minggu 6.
Saya senang melihat Anda semua hidup dan sehat setelah Quiz 0, karena saya tahu bahwa
agak kasar.
Tapi untungnya, kalian semua memang sangat luar biasa.
Dan sehingga indah.
Jika Anda berada di bagian saya, saya telah diberikan sebagian Anda kembali kuis Anda sudah.
>> Beberapa dari kalian, aku bertemu setelah kelas.
Dan jika Anda seorang mahasiswa ekstensi dan Anda belum menerima kuis Anda kembali
Namun, TF Anda mungkin bekerja di atasnya dan grading, dan akan mendapatkannya kembali
Anda segera.
Jadi mahasiswa ekstensi saya yang menonton sekarang - mudah-mudahan hidup -
Aku akan mendapatkan kuis Anda lama juga.
>> Agenda kami untuk hari ini adalah sebagai berikut.
Pertama, kita akan membahas beberapa sumber daya yang CS50 memberikan kepada Anda.
Kita akan pergi ke Quiz 0 berikutnya, dan Saya akan menjawab pertanyaan siapa pun
memiliki sekitar masalah tertentu.
Dan kemudian, kita akan lebih file I / O dan masalah set 5.
Kedua topik terakhir akan mengambil merupakan bagian terbesar dari bagian hari ini.
>> Aku meletakkan daftar ini setiap minggu sebagai pengingat untuk Anda semua, tapi inti
bagian, kita hanya memiliki 90 menit - kami tidak mampu menutupi segala sesuatu yang saya
akan senang untuk menutupi kalian.
Tapi kita memiliki satu ton sumber daya untuk Anda untuk memanfaatkan saat Anda mengenal
materi dan bekerja melalui masalah Anda set.
>> Sebuah pengingat bahwa saya memiliki online teks kotak, diatur untuk Anda untuk mengisi jika Anda
memiliki umpan balik bagi saya, baik positif maupun
konstruktif, tentang bagian.
URL yang terletak tepat di sini.
Jadi tolong, luangkan waktu jika Anda memiliki umpan balik, baik pada saat bagian,
atau setelah, atau setelah Anda menonton video online, untuk memberikan tanggapan Anda.
Saya sangat menghargai setiap dan semua itu.
>> Jadi saya sudah memiliki percakapan kecil dengan banyak saya
siswa sepanjang minggu - seperti yang saya tangan kuis kembali, berbicara tentang
Tentu saja, melihat bagaimana Anda lakukan.
Dan salah satu tema telah datang atas dan lebih dalam berbicara tentang - di
tertentu -
masalah set.
Dan saya telah dikemas tema yang di papan sekarang.
>> Pada dasarnya, ada perbedaan antara balik dalam sesuatu yang
dilakukan dengan benar dan sesuatu yang dilakukan dengan baik.
Kebanyakan orang telah melakukan fantastis dalam hal kebenaran -
5 atau 4 pada semua psets.
Kebanyakan orang yang mendapatkan mereka sepanjang waktu.
>> Namun, hanya karena Anda telah melakukan sesuatu yang benar tidak berarti Anda sudah
melakukan sesuatu yang elegan, atau efisien, atau sebersih Anda
bisa melakukannya.
Dan itulah yang desain -
dan yang lebih rendah derajat, gaya -
sumbu adalah untuk.
Jadi saya mendorong Anda semua, dan TF lainnya mendorong kalian, tidak hanya turn
dalam hal-hal yang benar, tapi giliran dalam hal-hal yang dikodekan dengan baik.
>> Tidak melakukan yang tidak perlu FOR loop, tidak menghitung ulang variabel jika
Anda tidak perlu.
Misalnya, melihat kembali ke permasalahan yang 4, ketika menempatkan batu bata di
layar, setiap baris - setiap bata dalam diberikan baris memiliki sama y-koordinat -
ketinggian koordinat yang sama.
>> Sehingga y-koordinat tidak perlu dihitung dalam interior
bersarang UNTUK loop yang mungkin Anda gunakan untuk menempatkan orang-bata di layar.
Hanya perlu dihitung setiap kali Anda beralih berturut-turut, atau
bergerak turun berturut-turut.
Jadi mengatakan jika ada 10 batu bata di baris, masing-masing batu bata dapat memiliki yang sama
y-koordinat, dan bahwa y-koordinat hanya dapat dihitung
sekali untuk semua orang.
>> Tidak perlu dihitung 10 kali, juga tidak bahwa perhitungan kebutuhan
terjadi di aktual fungsi panggilan -
fungsi panggilan gracked baru.
Jadi jika itu sedikit membingungkan untuk Anda, lebih umum, hal-hal yang
tidak perlu terjadi setiap saat Anda pergi melalui loop FOR tidak boleh
masukkan ke dalam loop FOR, dan seharusnya tidak terjadi setiap kali Anda pergi
melalui loop FOR.
>> Desain Contoh lain yang baik kita melihat dalam Minggu 3 untuk 15, Anda bisa menjaga
track dari nol.
Jadi, ketika Anda menginisialisasi papan, Anda menyimpan - dalam sebuah variabel global, mungkin -
x dan y-koordinat nol.
Dan kemudian setiap kali Anda -
dalam fungsi gerakan Anda, setiap kali Anda membuat langkah sukses, Anda memperbarui
lokasi nol.
>> Itu akan menyelamatkan Anda dari keharusan untuk melakukan bersarang UNTUK loop untuk melihat melalui
naik setiap kali Anda bergerak dalam fungsi dan menemukan nol, atau menemukan ubin,
dan kemudian memeriksa apa sebelahnya.
Sebaliknya, Anda harus lokasi nol, Anda hanya dapat melihat atas, di bawah,
dan ke kiri dan kanan itu, untuk menemukan ubin yang Anda cari.
>> Jadi dalam hal program kami menulis, mereka tidak pernah cukup besar
bahwa beberapa keputusan desain ini benar-benar akan menghambat Anda
program, atau membuatnya berjalan lebih lambat, atau bahkan kehabisan memori.
Tapi kami masih mendorong kalian menulis sebagai elegan dan
kode seefisien mungkin.
>> Jadi, jika Anda berakhir menulis hal-hal yang memiliki signifikan lebih besar
ruang lingkup, mereka akan ditulis dengan baik desain selain menjadi benar.
Jadi sejumlah Anda memiliki membawa itu keluar.
Itu sesuatu yang kita cari - sesuatu yang kita akan terus
mendorong kalian pada.
>> Jika Anda pernah memiliki pertanyaan tentang desain program Anda, jangan ragu
untuk menjangkau saya, dan saya senang untuk berjalan melalui program Anda dengan Anda,
dan menunjukkan beberapa desain keputusan yang Anda buat, dan memberikan beberapa
saran tentang cara untuk membuat bahkan keputusan desain yang lebih baik.
>> Jadi kita akan melanjutkan untuk berbicara tentang Quiz 0.
Sebelum kita melakukan itu, apakah ada yang memiliki pertanyaan tentang apa yang
Saya sudah pelajari sejauh ini?
>> [Gemerisik NOISE]
>> JASON Hirschhorn: Tujuh detik.
OK.
Mari kita bicara tentang Quiz 0 untuk sedikit.
Sebagian besar dari Anda memiliki Quiz Anda 0 s kembali.
Jika Anda tidak, mudah-mudahan Anda ingat sedikit.
Tetapi jika Anda telah mengambil Kuis 0, maka Anda juga memiliki akses ke PDF secara online di
solusi sampel.
>> Apakah Ada yang punya pertanyaan sebelum kita melompat ke dalam bahan minggu tentang
masalah khusus pada Quiz 0 -
mengapa jawabannya adalah apa itu?
Apakah ada orang bingung tentang apa pun?
Bahkan jika Anda punya masalah yang tepat, tapi hanya ingin saya untuk menjelaskan sedikit
lagi, saya senang untuk melakukannya sekarang.
>> Jadi saya meminta kalian untuk datang siap dengan beberapa
pikiran tentang Kuis 0.
Jadi yang ingin mendapatkan kita dimulai dengan pertanyaan atau
komentar mengenai Kuis 0?
>> [PAPER gemeresik]
>> JASON Hirschhorn: Tidak semua orang lakukan dengan sempurna.
Jadi saya tahu [TERTAWA]
harus ada beberapa pertanyaan tentang Kuis 0.
OK.
Ya.
Ompica.
>> OMPICA: Number 10.
>> JASON Hirschhorn: Number 10.
Yang satu adalah nomor 10?
>> OMPICA: The -
>> JASON Hirschhorn: I haven't -
>> OMPICA: The meliputi -
>> JASON Hirschhorn: Nomor 10 adalah delapan untuk i - menulis delapan sampai i?
>> OMPICA: Ya.
>> JASON Hirschhorn: OK.
Jadi pertanyaan lain Anda bisa memiliki bertanya adalah saya terus mata?
Jawabannya adalah ya.
Pada bagian sebelum kuis, saya bertanya kalian untuk kode kedua Sterling dan
delapan sampai i.
Keduanya terjadi muncul di kuis.
Jadi mudah-mudahan, Anda dibayar memperhatikan itu.
>> Dan jika Anda memiliki, maka Anda akan memiliki mungkin dilakukan dengan baik pada dua.
Tapi delapan sampai i, kita tidak benar-benar kode di kelas, tapi itu, sekali lagi,
tanya pada kuis.
Jadi beberapa hal untuk mengambil diperhatikan ketika coding delapan sampai i.
Hal pertama, per pertanyaan, adalah yang Anda butuhkan untuk memeriksa apakah string
adalah sama dengan nol.
>> Beberapa orang mencoba untuk memeriksa di kemudian hari dalam program jika s braket saya adalah -
sehingga karakter tertentu dalam String - sama dengan nol.
Tapi ingat, null yang pada dasarnya - ada baiknya untuk memikirkan
null sebagai pointer nol - pointer ke nol -
suatu tempat dalam memori di mana Anda tidak pernah bisa mengakses.
>> Jadi jika ada sesuatu yang sama dengan nol, Anda tahu bahwa itu belum diinisialisasi,
atau tidak ada di sana.
Jadi s adalah bintang char, s braket i adalah char.
Jadi masuk akal untuk membandingkan s untuk null, tapi tidak s braket i ke null.
Tapi sekali lagi - jadi itu hal pertama bahwa Anda lakukan -
periksa untuk memastikan bahwa Anda benar-benar mendapat string nyata.
>> Selanjutnya, Anda ingin pergi melalui masing-masing karakter dalam string.
Dan sehingga akan menjadi seperti s braket i, misalnya, jika saya adalah iterator Anda.
Dan mengambil karakter itu, dan mendapatkan nilai yang sebenarnya.
Anda telah itu disimpan sebagai char, tapi nilai ASCII nol -
nol sebagai karakter -
tidak benar-benar integer nol.
Ini beberapa nomor lain yang dapat Anda mencari dalam tabel ASCII.
>> Jadi salah satu cara untuk mengoreksi untuk itu - mungkin cara terbaik untuk mengoreksi
bahwa - adalah mengurangi dari itu nilai karakter -
nol sebagai karakter.
Jadi dikurangi kutip tunggal, nol, kutip tunggal lain.
Itu akan mengambil apa pun nomor yang Anda miliki sebagai char, dan mendapatkannya sama dengan
jumlah sebagai integer yang sebenarnya.
>> Dan yang sangat mirip dengan pendekatan banyak orang mengambil di
masalah set 2, dengan Caesar dan Viginere -
mereka cipher, ketika Anda yang berputar mereka.
Jadi setelah Anda memilikinya sebagai nomor dari nol sampai sembilan, kemudian - tergantung pada
di mana ia pergi dalam jumlah ultimate - Anda perlu kalikan
oleh kekuatan dari 10.
>> Beberapa orang pindah dari belakang ke depan, dan dikalikan individu
nomor dengan kekuatan 10.
Beberapa orang pindah dari depan ke belakang -
dan begitu mengambil tertinggi memesan angka pertama -
dan akan menyelamatkan mereka dalam variabel counter global.
Dan kemudian setiap kali melalui FOR lingkaran, kalikan raksasa global yang
melawan variabel sebesar 10, untuk membuat ruang untuk char berikutnya.
>> Jadi itu sedikit membingungkan tanpa saya menulis di papan tulis.
Tapi larutan sampel tersedia untuk Anda.
Tetapi mereka adalah hal-hal besar kita cari.
Juga cek untuk memastikan bahwa setiap karakter individu memang
karakter antara nol dan sembilan, dan tidak beberapa karakter lain, seperti A,
misalnya.
>> Itulah hal-hal yang kita cari dalam pertanyaan itu.
Apakah itu menjawab pertanyaan Anda?
>> OMPICA: Ya.
>> JASON Hirschhorn: OK.
Apakah ada pertanyaan lain tentang Kuis 0?
Bagaimana dengan kompilasi?
Semua orang kompilasi benar?
Tidak.
Ada -
[TERTAWA]
Pertanyaan tentang proses kompilasi?
Wow.
>> [PAPER gemeresik]
>> JASON Hirschhorn: Ya.
Michael.
>> MICHAEL: Apakah nomor 7 - random?
>> JASON Hirschhorn: Nomor 7.
Nomor 7 adalah mendapatkan integer acak.
Excellent.
Jadi Anda diberi sebuah integer a dan b bilangan bulat, dan Anda ingin acak
integer antara a dan b.
Kami benar-benar bisa menulis satu ini pada papan, karena yang satu ini
adalah satu baris kode -
salah satu cara untuk melakukannya.
>> Jadi kita diberikan drand sebagai fungsi yang bisa kita gunakan.
Dan apa drand -
dengan asumsi itu sudah diunggulkan -
apa drand kembali?
>> MICHAEL: Sebuah float antara 0,0 dan 1,0.
>> JASON Hirschhorn: Sejumlah - ya.
Sejumlah antara 0 dan 1.
Dan kami telah b dan.
Dan kemudian kita memiliki nomor acak kami antara 0 dan 1 diberikan kepada kita oleh drand.
Beberapa orang mencoba untuk menempatkan b, atau b dikurangi , atau sesuatu di dalam mereka
kurung.
Itu berarti bahwa mereka argumen untuk fungsi ini.
>> drand tidak mengambil argumen - seperti getString tidak
tidak mengambil argumen.
Jadi itu hanya terbuka paren, dekat Paren - dan bahwa, itu sendiri, adalah
fungsi panggil.
Dan yang memberikan nomor antara 0 dan 1.
Tentu saja, kami memiliki berbagai macam bahwa angka-angka bisa masuk
>> Katakanlah, jika b adalah 10 dan 5 adalah, kita benar-benar ingin nomor dengan kisaran 5.
Jadi hal berikutnya yang perlu kita lakukan adalah kalikan ini dengan kisaran b minus.
Jadi asumsi yang dikalikan.
Dan itu akan memberi kita nomor dalam kisaran tertentu.
Dan kisaran tertentu menjadi perbedaan antara b minus.
>> Dan akhirnya, itu hanya akan memberikannya dari - mengatakan kisaran antara b minus
adalah 5, yang akan memberi kita angka dari 0 sampai 5.
Tetapi jika pada kenyataannya 5, kita perlu meningkatkan kisaran ini sampai ke tempat itu
sebenarnya seharusnya, dengan menambahkan.
Sehingga mendapat logika yang tepat.
Dan kemudian, Anda akan memiliki pertanyaan lain?
>> MICHAEL: No
Aku hanya merasa benar-benar bodoh sekarang.
[TERTAWA]
>> JASON Hirschhorn: No
Jangan merasa benar-benar bodoh.
Sejumlah orang berjuang dengan pertanyaan ini.
Dan kemudian, pertanyaan lain adalah, drand, Anda katakan, memberikan pelampung -
kembali pelampung.
Tetapi fungsi ini benar-benar meminta untuk integer dikembalikan.
>> Anda tidak perlu membuang ini secara eksplisit ke integer, karena ini
operasi akan memperlakukannya sebagai semua mengapung - sebagai angka floating point.
Seperti keinginan ini - bahkan jika hal ini adalah bilangan bulat, hal ini akan
dikalikan dengan benar.
Semua perkalian akan bekerja.
Anda tidak perlu membuang sini.
Bahkan, Anda tidak harus membuangnya.
>> Itu akan -
jika Anda akan melemparkan nomor itu antara 0 dan 1 -
nomor acak, floating point -
maka itu baik akan hanya 0 atau 1 menjadi, jadi Anda akan kehilangan semua presisi itu.
Tetapi pada akhirnya, ketika Anda kembali, maka secara otomatis akan
dikirim kembali sebagai integer.
Jadi Anda tidak perlu melakukan bahwa casting sendiri.
>> Jadi ini adalah jawaban untuk pertanyaan itu, nomor 7.
Ada pertanyaan lain pada Quiz 0?
Ya, Annie.
>> ANNIE: Kapan kita menggunakan rekursif -
kapan kita menggunakan loop berulang?
>> JASON Hirschhorn: Kapan Anda menggunakan recursive - jadi lebih umum,
pro dan kontra dari rekursi dibandingkan pendekatan iteratif.
Ada yang bisa menawarkan pro atau con?
Silahkan?
Tidak bisa siapa pun.
Siapa yang bisa menawarkan pro atau con?
>> [PAPER gemeresik]
>> SISWA 1: Rekursif kurang coding - mengetik kurang?
>> JASON Hirschhorn: Jadi secara umum, rekursi khususnya, fungsi -
atau algoritma seperti merge sort - yang cocok
untuk pendekatan rekursif -
mungkin akan lebih mudah kode rekursif.
Dan hanya lebih masuk akal untuk melakukannya secara rekursif.
Sehingga akan menjadi pro dengan rekursi.
Lainnya?
Ya?
>> SISWA 2: Con ke rekursi -
Menggunakan lebih banyak memori.
>> JASON Hirschhorn: Jadi tepat.
Sebuah fungsi rekursif akan terus menambahkan tumpukan frame ke stack.
Jadi jika Anda beroperasi pada banyak angka, dan harus memanggil ini
berfungsi banyak, maka Anda tentu akan mengambil lebih banyak memori, sementara
pendekatan iteratif hanya akan menempatkan satu tumpukan bingkai di stack, karena
itu semua terjadi dalam satu fungsi.
>> Setiap pro dan kontra lainnya?
Ya.
>> SISWA 3: Pro untuk rekursi.
Anda tidak harus menentukan di memajukan berapa kali
kode harus diulang.
Anda dapat memiliki jumlah yang telah ditetapkan kali bahwa Anda harus iterate, kemudian
rekursi lebih baik, karena dibutuhkan hasil tersebut.
>> JASON Hirschhorn: Saya pikir itu benar.
Tapi saya pikir dalam kedua kasus Anda tidak akan pernah -
Anda mungkin akan mendapatkan beberapa masukan dari pengguna.
Atau fungsi ini akan memiliki beberapa masukan yang akan menentukan berapa kali
harus dijalankan.
Jadi secara umum, Anda tidak akan kode keras - bahkan dalam pendekatan berulang - bagaimana
berkali-kali loop yang harus dijalankan.
>> Apakah Anda memiliki lain Anda memikirkan, Annie?
OK.
Jadi mereka mungkin dua -
pro terbesar dan terbesar con ke rekursif dibandingkan
pendekatan iteratif.
OK.
Apa pun di Quiz 0?
>> Mari kita lanjutkan.
File I / O. Ada singkat indah minggu ini pada file I / O yang diharapkan
Anda telah menyaksikan beberapa kali, dan dikagumi.
Banyak pekerjaan yang masuk ke itu, dan saya sudah mendengar itu gila-gilaan membantu.
Saya juga termasuk link pada slide ini, jika anda belum punya
kesempatan untuk menonton 10 kali.
>> Jadi, kita akan pergi sebentar selama langkah utama untuk membuka dan bekerja
dengan file, dan kemudian kita akan menyelam ke masalah coding sebelum
memeriksa set masalah.
Jadi sekali lagi, aku akan menempatkan ini pada layar, tapi aku akan bicara untuk
hanya satu menit tentang apa yang kita lakukan di sini dengan berkas I/O--
apa artinya?
>> Itu berarti bahwa kita dapat membuat kita program, dan kemudian memiliki program kami
keluar, dan tidak membuat dampak apapun pada dunia luar program kami.
Tapi ketika kita mulai bekerja dengan file - baik membaca mereka dan menciptakan
mereka - kita dapat memiliki beberapa efek pada dunia luar program kami.
>> Sama seperti jika Microsoft Word tidak bisa untuk membuat dokumen Word, kemudian
sekali Microsoft Word berhenti, semua Anda pekerjaan akan hilang, dan itu akan
benar-benar sia-sia.
Kami akhirnya ingin dapat menulis program yang dapat mempengaruhi
dunia di sekitar mereka, baik dengan mengambil input kompleks - dalam hal file dan
melalui file, dan juga menciptakan menarik dan output menarik -
dalam hal jenis file yang berbeda.
>> Jadi itulah sebabnya kami mulai belajar bagaimana bekerja dengan file.
Lebih khusus lagi, apa kita lakukan adalah sebagai berikut.
Ini sangat sederhana.
Hanya ada beberapa langkah, dan mereka tercantum di sini pada kode ini.
Jadi kita akan pergi melalui ini kode baris demi baris.
>> Pertama, Anda lihat disorot -
ketika Anda bekerja dengan sebuah file, terlepas dari jenis file itu,
Anda harus membukanya.
Dan itu adalah dengan panggilan untuk fopen -
di sini.
Anda termasuk nama file.
Jika file tidak dalam direktori Anda, atau folder di mana program ini
kehidupan, maka Anda juga harus menyertakan jalan ke tempat file yang.
>> Kita akan berasumsi bahwa ini file yang bernama "text.txt" -
dokumen teks sederhana - dalam folder yang sama dengan program ini.
Jadi itu hal lain yang perlu pikiran - bahwa jika Anda ingin membuka file
di tempat lain, Anda benar-benar perlu untuk memasukkan lokasi.
>> Kedua, Anda dapat melewati argumen untuk fopen, dan itulah apa yang ingin Anda lakukan
dengan file tersebut.
Ada tiga argumen utama yang Anda akan lolos ke fopen.
Siapa yang bisa memberi saya tiga?
Siapa yang bisa memberi saya salah satu dari mereka?
Ya.
>> SISWA 4: Nama file?
>> JASON Hirschhorn: Maaf.
Tiga argumen utama Anda dapat melewati sebagai argumen kedua untuk fopen.
Kau benar - nama file adalah argumen pertama.
Tapi argumen kedua untuk fopen adalah umumnya tiga senar, dan - ya.
Aleja.
>> Aleja: A untuk append.
>> JASON Hirschhorn: A, jika Anda ingin menambahkan ke file yang sudah ada.
>> SISWA 5: R untuk membaca.
>> JASON Hirschhorn: R, jika Anda ingin membaca dari file.
>> SISWA 6: W untuk menulis.
>> JASON Hirschhorn: Dan w, jika Anda ingin menulis ke file.
Jadi dalam hal ini, kita sedang menulis ke file tersebut, jadi kita harus w.
Anda membukanya, Anda juga harus menyimpan mengajukan suatu tempat, dan itu dengan
kode ke sisi kiri operator penugasan -
Aku menciptakan pointer ke file disebut, dalam hal ini, berkas.
>> Kami tidak akan khawatir apa ini semua topi hal FILE adalah.
Cukuplah untuk mengatakan, itu adalah panjang aliran nol dan satu.
Dan itulah bagaimana kita akan mengoperasikannya dan memahaminya.
>> Hal berikutnya yang perlu kita lakukan - dan ini sangat penting -
setiap kali Anda membuka file -
pada kenyataannya, setiap kali Anda memanggil malloc, untuk misalnya, dan mendapatkan beberapa memori dan coba
dan menyimpannya dalam pointer, Anda selalu ingin memeriksa untuk memastikan bahwa
Fungsi tidak mengembalikan null.
>> Jadi dalam hal ini, kami memeriksa untuk membuat yakin bahwa kita benar-benar membuka
mengajukan dengan benar, dan ada ada kesalahan dalam program kami.
Selanjutnya, setelah kami diperiksa untuk memastikan bahwa kita memiliki file bekerja, kita bisa
menulis, atau membaca dari, atau menambahkan ke file.
Dalam hal ini, saya hanya mencetak satu baris ke file ini.
>> Bagaimana saya tahu itu?
Yah, saya menggunakan fungsi ini disebut fprintf.
Semua fungsi yang akan Anda gunakan saat menulis, atau membaca dari, atau
memanipulasi file akan mirip dengan fungsi yang telah Anda lihat sebelumnya, namun
dimulai dengan huruf F, berdiri file.
Dan fprintf, seperti cetak normal kita app, mengambil satu argumen tambahan,
dan itu adalah file di mana Anda ingin mencetak baris ini untuk.
>> Saya tidak punya apa-apa untuk hak ohai.
Saya tidak memiliki ketiga argumen ke printf -
atau argumen kedua untuk printf, yang Argumen ketiga untuk fprintf, karena saya
tidak memiliki penampung di sini.
Aku tidak termasuk variabel apapun.
Tetapi sekali lagi, fprintf dan semua file ini fungsi yang beroperasi dengan file
umumnya akan membutuhkan file di mana mereka beroperasi.
>> Akhirnya, hal penting terakhir untuk lakukan adalah untuk menutup file, seperti
dengan - setiap kali kita malloc sesuatu, kita ingin membebaskan sesuatu, jangan sampai kita
memiliki kebocoran memori - kami ingin untuk menutup file kami.
Jika program ini keluar tanpa menutup file, kemungkinan besar tidak akan pergi
salah, terutama jika adalah file kecil.
>> Tapi hal ini tentunya coding gaya yang baik dan berlatih untuk selalu menutup file Anda
ketika Anda selesai menggunakannya.
Jadi itu adalah dasar-dasar file I / O. Anda mungkin pernah melihat itu sebelumnya, atau
menyaksikannya dalam sejenak fantastis.
Apakah Ada yang punya pertanyaan, sebelum kami pergi ke beberapa praktek coding
masalah, tentang file I / O atau langkah Aku hanya pergi?
>> [Mengetik SOUNDS]
>> JASON Hirschhorn: Apakah Anda punya pertanyaan, Avi?
>> AVI: No
>> JASON Hirschhorn: OK.
Aku akan menunggu tujuh detik.
[TERTAWA]
Itu tip benar-benar baik.
Kalian hanya tidak suka mengajukan pertanyaan.
Itu baik-baik saja.
OK.
Jadi masalah latihan pertama kita adalah, kita akan menduplikasi fungsi
alat baris perintah yang Anda mungkin digunakan sebelumnya - copy -
alat copy.
Jika Anda mengetik cp dan kemudian menyebarkannya dua argumen ke terminal Anda, Anda dapat
menyalin file.
Dan itulah yang kita akan untuk menulis sekarang.
>> Jadi sekali lagi, membaca off slide ini, saya akan Anda untuk menulis sebuah program yang mengambil
dua dan hanya dua baris perintah argumen -
file sumber dan file tujuan -
dan salinan isi dari sumber file ke file tujuan
satu byte pada suatu waktu.
Jadi itulah banyak untuk meminta.
>> Sekali lagi, pendekatan yang baik untuk ini adalah untuk tidak pergi langsung ke kode C, tapi
memecahnya menjadi beberapa langkah.
Pertama, pikirkan tentang logika - persis apa yang saya minta Anda lakukan -
dan memahami semua langkah-langkah untuk masalah ini.
Tidak dalam C, hanya dalam beberapa pseudocode, atau bahkan model mental
apa yang terjadi.
>> Selanjutnya, setelah Anda memiliki pseudocode bawah, mencari tahu bagaimana pseudocode
peta ke alat dan hal yang kita sudah belajar untuk digunakan dalam C.
>> Dan akhirnya, setelah Anda memiliki semua yang bersama-sama, Anda dapat kode masalah.
Ambil 5 sampai 10 menit untuk bekerja pada masalah ini.
Aku akan menaruh instruksi kembali dalam detik.
Dan kemudian kita akan pergi ke pseudocode, dan kode
itu hidup sebagai sebuah kelompok.
>> Jika Anda memiliki pertanyaan saat Anda sedang bekerja pada ini, jangan ragu untuk meningkatkan
tangan Anda, dan saya akan datang sekitar dan jawaban mereka.
>> SISWA 7: Dapatkah saya menggesek selembar kertas?
>> JASON Hirschhorn: Ada apa?
>> [Mengetik SOUNDS]
>> JASON Hirschhorn: OK.
Mari kita pseudocode pertama, dan maka saya akan memberikan beberapa lebih
menit untuk menyelesaikan coding.
>> Siapa yang ingin memulai me off dengan baris pertama
pseudocode untuk fungsi ini?
>> SISWA 8: Periksa untuk memastikan bahwa Anda diberi dua file.
>> JASON Hirschhorn: OK.
Dan jika kita tidak?
>> SISWA 8: Aku akan kembali 0.
>> JASON Hirschhorn: Haruskah kita kembali 0?
>> SISWA 8: Mengembalikan -
blanking.
Maaf.
>> JASON Hirschhorn: Ya.
Mungkin tidak 0.
Karena 0 berarti semuanya itu baik.
OK.
Jadi itulah baris pertama dari pseudocode.
Siapa yang memiliki baris kedua pseudocode?
>> SISWA 9: Buka kedua file?
>> JASON Hirschhorn: Buka kedua file.
OK?
>> SISWA 10: Periksa untuk melihat jika file tersebut adalah NULL?
>> JASON Hirschhorn: Periksa untuk memastikan Pastikan juga tidak NULL.
Sebagai samping -
slash 0 -
adalah bahwa NULL?
>> SISWA 11: No
>> JASON Hirschhorn: Itu tidak NULL.
Itu disebut terminator NULL.
Ini sebenarnya dieja dengan hanya satu l.
Jadi memeriksa sesuatu terhadap itu - itu sebenarnya karakter -
jadi memeriksa sesuatu terhadap yang tidak sama dengan memeriksa untuk melihat apakah itu
sama dengan NULL.
>> Dan beberapa orang -
pada kuis mereka dan masalah mereka set - telah mendapat
dua dari mereka bingung.
Tapi dua dari mereka adalah sebenarnya berbeda.
Satu berakhir string -
satu adalah pointer ke 0.
>> SISWA 12: Mengapa tidak akan Anda memeriksa untuk memastikan bahwa file-file tersebut tidak NULL
sebelum Anda membukanya?
>> JASON Hirschhorn: Jadi terbuka menghemat sesuatu dalam file tersebut.
Dan jika Anda kembali ke sini -
sehingga baris ini - fopen -
akan memberikan alamat dan toko alamat dalam file jika bekerja.
Jika tidak bekerja, akan menyimpan NULL -
>> SISWA 12: Oh.
OK.
Punya Anda.
>> JASON Hirschhorn: Dalam file.
Jadi Anda tidak dapat memeriksa NULL sebelum Anda membukanya.
NULL berarti sesuatu tidak bekerja dengan benar.
OK.
Jadi periksa untuk memastikan tidak yaitu?
Atau apakah?
Apa yang kita pikirkan?
Kita akan pergi dengan itu.
>> SISWA 13: Apakah.
>> JASON Hirschhorn: Apakah?
Baik itu?
>> SISWA 13: Apakah.
>> JASON Hirschhorn: OK.
Kami tampaknya memiliki beberapa konsensus tentang itu.
Baik adalah NULL.
OK, baris berikutnya dari pseudocode.
Siapa yang tidak memberi saya garis belum?
Kami akan menunggu untuk Anda.
Ya.
>> SISWA 14: Anda harus membaca dari file pertama?
>> JASON Hirschhorn: OK.
>> SISWA 14: Atau kita menggunakan fscanf atau sesuatu seperti itu file pertama?
>> JASON Hirschhorn: Jadi kami ingin membaca dari file pertama dan -
mari kita menempatkan bahwa di sini.
Baca dari file sumber.
Dan kemudian, apa yang kita lakukan setelah kita membaca dari file sumber?
Orang lain?
>> SISWA 15: Menulis ke file tujuan?
>> JASON Hirschhorn: Kami menulis untuk file tujuan, dan -
OK.
Apa lagi yang kita hilang?
Orang lain yang tidak memberi saya baris kode belum - dari pseudocode.
Ya.
>> SISWA 16: Mungkin Anda selalu dapat memeriksa apakah ada sesuatu untuk dibaca untuk,
seperti baris berikutnya?
Yang seperti baris berikutnya, melihat apakah itu ada.
>> [ELECTRONIC BEEP]
>> JASON Hirschhorn: Oops.
Itu software journal saya.
Ya?
>> SISWA 16: Ya.
>> JASON Hirschhorn: Jadi memberikan kepada saya sekali lagi.
>> SISWA 16: Periksa apakah ada masih baris berikutnya dari
sumber berkas untuk membaca.
>> JASON Hirschhorn: OK.
Jadi kita tidak membaca garis - sedang membaca byte di sini -
tapi kau benar.
Kami ingin membaca dan menulis sampai tidak ada lagi byte.
OK.
Dan ini benar-benar harus menjorok sedikit, karena mereka berada di bawah sana.
Benar?
Sampai kita keluar dari byte, kita akan membaca dari file sumber dan menulis
ke file tujuan.
>> Dan kemudian, apa yang terakhir garis pseudocode?
Seseorang yang tidak diberikan saya sesuatu belum.
>> SISWA 17: Tutup file?
>> JASON Hirschhorn: Tepat.
Tutup file.
Jadi ada pseudocode kami.
Aku akan menempatkan pseudocode ke gedit, dan dalam beberapa menit kami
akan kode ini bersama-sama.
>> OK.
Mari kita memulai sebagai sebuah kelompok.
Nishant, saya memiliki file baru saya.
Saya baru saja membuka hal ini.
Dokumen Untitled 1.
Apa hal pertama yang harus saya lakukan?
>> Nishant: Sertakan perpustakaan?
>> JASON Hirschhorn: OK.
Perpustakaan apa?
>> Nishant: stdio.h, stdlib.h, saya percaya?
>> JASON Hirschhorn: OK.
Apa stdlib untuk?
>> Nishant: aku lupa.
>> JASON Hirschhorn: OK.
Jadi termasuk stdio.
Apa yang harus saya lakukan bahkan sebelum Aku mulai coding?
>> Nishant: Menulis header?
>> JASON Hirschhorn: Bagaimana saya mendapatkannya berwarna?
>> [Interposing SUARA]
>> Nishant: Bagaimana Anda mendapatkannya berwarna?
>> JASON Hirschhorn: Bagaimana saya warna coding?
>> Nishant: Saya tidak tahu.
Oh.
Simpan.
>> JASON Hirschhorn: Hemat.
Ya.
Aku harus menyimpannya sebagai. C.
Jadi simpan di desktop sebagai cp.c.
Manis.
Dan jika saya ingin mendapatkan penuh gaya poin, apa yang harus saya
termasuk di atas?
>> Nishant: Anda bisa menulis nama Anda, nama program, dan tujuan
program juga?
>> JASON Hirschhorn: Tampak baik.
Excellent.
Jadi Anda sudah mulai kita sempurna.
# Include -
kami juga akan menulis -
OK.
Jadi saya pikir saya siap untuk pergi.
Siapa yang memiliki baris pertama kode untuk saya - atau baris pertama dari kode yang
yang diperlukan untuk memenuhi pertama kami komentar di pseudocode?
Anda.
>> SISWA 18: Bukankah seharusnya int argc, dan kemudian char * argv?
>> JASON Hirschhorn: Saya pikir kau benar.
Mari kita mengubahnya ke int utama, paren terbuka, int argc, koma, char * argv?
Seperti itu?
>> SISWA 18: Kurung.
>> JASON Hirschhorn: Kurung.
Buka braket, braket dekat, induk dekat.
Sempurna.
Sekarang saya bisa mengambil argumen command-line.
OK.
Pastikan kita diberi dua file.
Anda dapat memberi saya itu juga.
>> SISWA 18: Jika argc -
yang satu ini tidak sama 3.
>> JASON Hirschhorn: Jika paren terbuka argc tidak sama 3?
>> SISWA 18: Ya, Anda kembali 1 atau apa pun.
>> JASON Hirschhorn: Maaf.
>> SISWA 18: Kembali 1 atau apa pun.
>> JASON Hirschhorn: Kembali 1.
OK?
Besar.
Buka kedua file.
Siapa yang dapat membantu saya membuka kedua file?
Siapa yang tidak memberi saya kode belum?
Kurt?
>> KURT: Jadi semua caps F-I-L-E sumber star.
>> JASON Hirschhorn: Aku akan untuk mengambil vokal.
Mereka adalah keren.
Ini seperti Tumblr.
>> SISWA 18: Setara fopen -
>> JASON Hirschhorn: Setara fopen?
>> SISWA 18: Buka paren, argv, braket terbuka.
>> JASON Hirschhorn: Tunggu.
Maaf.
Buka paren.
OK.
>> SISWA 18: Ya.
Sub argv 1.
>> JASON Hirschhorn: Sub 1?
>> SISWA 18: Ya.
Argv braket terbuka 1 -
ya.
Dan kemudian koma, dan kemudian buka ganda quote, r, kutip ganda,
paren dekat, titik koma.
>> JASON Hirschhorn: Manis.
Dan bagaimana dengan yang lain?
>> SISWA 18: Sangat mirip, tapi malah S-R-C, Anda akan menyebutnya D-S-T.
>> JASON Hirschhorn: Oo!
Aku seperti itu.
>> SISWA 18: Just D-S-T. Ya.
Dan kemudian argv, braket terbuka, 2.
Ya.
Dan kemudian w bukannya r.
Ya.
>> JASON Hirschhorn: Great.
Beberapa sebelah baris.
Juga, jika ada yang memiliki hal-hal untuk menambah baris yang telah kami lakukan, merasa bebas untuk
menambahkan mereka juga.
Periksa untuk memastikan tidak adalah NULL.
Siapa yang bisa memberi saya kode saya perlu memenuhi bahwa garis pseudocode?
Archer.
>> ARCHER: Jika src sama equals NULL atau dst sama equals
NULL, maka Anda kembali -
>> JASON Hirschhorn: Apa?
>> ARCHER: Kembali 2?
>> JASON Hirschhorn: Kembali 2.
Jadi jika paren terbuka src sama sama dengan NULL, atau -
apapun yang thing's - pipa?
Pipa?
Kita akan menyebutnya pipa.
Pipa, pipa, dst sama equals NULL, kembali 2.
OK?
Sampai kita keluar dari byte -
kita semacam melompati langkah ini dari pseudocode bagian untuk pergi ke sini.
>> Tapi sampai kita keluar dari byte - apa itu terdengar seperti?
Apa jenis struktur C -
tapi saya tidak menggunakan struktur kata, karena kita akan mulai menggunakan
bahwa dalam kasus lain -
tetapi alat C apakah itu terdengar seperti?
>> SISWA 19: Sebuah loop.
>> JASON Hirschhorn: Sebuah loop.
Kedengarannya seperti lingkaran.
Jadi, siapa yang bisa memberi saya baris pertama kode lingkaran di sini?
Anda juga dapat memilih jenis lingkaran yang Anda inginkan, jika Anda memberi saya
baris kode.
Ada tiga macam.
Anda bisa memilih.
Saya akan menyarankan salah satu dari mereka.
Avi.
Yang mana yang Anda inginkan?
>> AVI: FOR.
>> JASON Hirschhorn: FOR.
>> AVI: int i sama dengan nol.
>> JASON Hirschhorn: OK.
>> AVI: Bagian ini saya tidak yakin tentang.
Tetapi saya kurang dari ukuran sumber star?
Saya tidak yakin itu.
>> JASON Hirschhorn: OK.
>> AVI: Karena Anda ingin ukuran file, kan?
>> JASON Hirschhorn: Jadi ini mungkin tidak akan memberi kita ukuran sebenarnya
file dalam byte.
Jadi apa lagi yang bisa kita lakukan?
Apa jenis lain dari lingkaran?
Atau haruskah kita tetap dengan loop FOR?
>> SISWA 20: Bisakah Anda melakukan loop WHILE?
Dan kemudian, apa yang akan Anda lakukan adalah tersebut Anda akan -
karena kami memiliki char * untuk file.
Jadi, jika kita terus incrementing bahwa sampai kita akan menemukan karakter NULL di
akhir itu?
Atau tidak, adalah bahwa tidak bagaimana file bekerja?
>> JASON Hirschhorn: Jadi kita bisa menjaga incrementing char *
sampai kita menemukan NULL -
>> SISWA 20: Pada dasarnya terus karakter demi karakter sampai kita memukul
akhir file.
>> JASON Hirschhorn: Ya.
Jadi itulah yang ingin kita lakukan.
Kami ingin terus membaca, karakter dengan karakter, sampai kita bisa
akhir file.
>> SISWA 20: Ya.
Cari -
apa akhir atau tanda berhenti pada akhir file teks.
>> JASON Hirschhorn: OK.
Jadi ketika kita sampai ke akhir file - bagaimana kita tahu bahwa kita telah mencapai
akhir file?
Jika saya menelepon -
jadi mari kita mundur.
Apa fungsi?
Mari kita pergi ke baris ini di sini.
Baca dari file sumber.
Siapa yang bisa memberi saya bahwa baris kode?
>> SISWA 21: fscanf?
>> JASON Hirschhorn: fscanf.
OK.
Bagaimana jika saya ingin membaca, sangat khusus, satu byte?
>> SISWA 21: Saya tidak tahu.
>> JASON Hirschhorn: OK.
Bahkan lebih sederhana daripada fscanf - apa itu -
Saya ingin membaca dari file source?
Baca dari file sumber.
Apa fungsi - ya.
>> SISWA 22: Ini fread?
>> JASON Hirschhorn: fread.
Saya pikir mari kita tetap dengan bahwa salah satu untuk saat ini.
Apa argumen tidak fread mengambil?
>> SISWA 22: Mungkin jenis file, dan kemudian lokasi dalam file?
>> JASON Hirschhorn: Apa yang bisa saya ketik di sini untuk mencari tahu apa jenis argumen
fread mengambil?
>> MAHASISWA GANDA: Man fread.
>> JASON Hirschhorn: Man fread dan fwrite.
Sepertinya mereka hang out bersama.
Jadi fread mengambil berapa banyak argumen?
>> SISWA 23: Empat.
>> JASON Hirschhorn: Dibutuhkan empat argumen.
Dibutuhkan pointer, ukuran, dan bahwa hal yang aneh, dan beberapa berkas.
OK?
Mari kita membaca tentang hal itu di sini.
"Fungsi fread membaca n memb elemen data, masing-masing ukuran byte
panjang, dari sungai yang ditunjukkan oleh streaming, menyimpannya di lokasi
diberikan oleh pointer. "
>> Jadi empat argumen.
Mengapa saya tidak hanya menyalin ini, dan paste tepat di sini.
OK.
Jadi, siapa yang dapat mulai mengisi argumen ini untuk saya?
Avi.
>> AVI: Ambil kekosongan.
Menempatkan hanya src.
Mengambil pointer dan bintang.
Masukan src.
Kemudian -
>> JASON Hirschhorn: Jadi aku akan berhenti Anda di sana, karena itu tidak benar.
Kau benar dengan src, tapi mana src harus pergi?
>> [Interposing SUARA]
>> JASON Hirschhorn: Seharusnya pergi ke sini.
Itu src - src kami adalah tipe.
Mari kita lihat di sini.
Hal ini meminta jenis FILE *, kita sebenarnya biasanya melihat mereka seperti itu.
Jadi ini meminta argumen dari ketik FILE * disebut aliran yang src.
OK?
>> Ukuran apa hal-hal yang dapat dilakukan kita ingin membaca?
Aku memberimu ini di deskripsi masalah.
>> SISWA 24: Satu byte pada suatu waktu.
>> JASON Hirschhorn: Satu byte.
Seberapa besar byte?
Ukurannya adalah dalam byte, jadi apa bisa saya meletakkan di sana?
>> SISWA 25: One.
>> JASON Hirschhorn: One.
Benar.
Ukurannya adalah di unit byte, jadi 1 adalah 1 byte.
Berapa banyak yang ingin saya baca pada suatu waktu.
>> SISWA 26: One?
>> JASON Hirschhorn: Satu hal.
Saya ingin membaca satu hal ukuran 1, satu gigitan pada suatu waktu.
Dan di mana saya katakan, setelah saya membacanya?
>> SISWA 27: Destination?
>> JASON Hirschhorn: Jadi saya tidak dapat menempatkan langsung ke tujuan.
>> SISWA 28: Kau akan put menjadi pointer ketiga?
>> SISWA 27: Untuk tujuan.
>> JASON Hirschhorn: OK.
Ya.
>> SISWA 29: Anda dapat menyatakan sesuatu bertindak sebagai penyimpanan sementara sebelumnya.
>> JASON Hirschhorn: OK.
Beri aku itu.
>> SISWA 29: File lain pointer, mungkin?
>> JASON Hirschhorn: OK.
Jadi ini tidak berlaku bintang -
itu adalah tipe void bintang, sehingga tidak harus menjadi pointer berkas.
Dan jika saya membaca satu byte, di mana akan menjadi tempat yang baik
untuk menyimpan satu byte?
>> SISWA 29: Sebuah array?
>> JASON Hirschhorn: Sebuah array.
OK.
Dan apa lagi adalah sesuatu yang hanya ukuran satu byte?
>> SISWA 30: A char *?
>> SISWA 29: Ya.
>> JASON Hirschhorn: A char * tidak satu byte.
>> SISWA 29: A arang.
>> JASON Hirschhorn: A char adalah satu byte.
Benar?
Jadi mari kita sebut penyangga ini adalah generik nama digunakan untuk hal-hal ini untuk menyimpan
sesuatu yang sementara.
Jadi saya membuat buffer.
Benar?
Tapi itu tidak mengambil void *.
Jadi mungkin Anda benar, bahwa harus ada buffer ukuran 0.
Jadi menyimpan satu -
benar.
>> Karena hak ini di sini - Char buffer karakter, tapi
ini membutuhkan void * -
pointer.
Jadi aku bisa melakukan ini dan sekarang buffer pointer.
Apa lagi yang bisa saya lakukan?
>> SISWA 31: Letakkan bintang berikutnya untuk char.
>> JASON Hirschhorn: aku bisa telah menciptakannya hangus *.
OK.
Apa hal lain yang bisa saya lakukan?
Atau mari kita pergi dengan yang satu ini.
Char * buffer, jadi apa saya dimasukkan ke dalam sini?
>> SISWA 31: Buffer.
>> JASON Hirschhorn: Buffer.
Buffer adalah pointer ke char.
Dan di lokasi itu, kami menempatkan satu byte dari sesuatu yang kita sudah membaca.
Ya.
Avi.
>> AVI: Hanya pertanyaan singkat.
Apakah Anda ingin malloc penyangga?
>> JASON Hirschhorn: Siapa yang bisa menjawab pertanyaan itu?
>> SISWA 32: Well, itu tidak benar-benar arahkan ke sesuatu sekarang, jadi -
>> JASON Hirschhorn: Tapi apakah kami ingin malloc itu?
>> SISWA 32: Jika Anda adalah untuk melakukannya bahwa cara, saya kira, ya, karena Anda akan perlu
beberapa tempat untuk itu untuk menunjuk ke.
>> JASON Hirschhorn: Apakah kita harus malloc itu?
>> SISWA 33: Jika Anda akan menggunakannya di luar loop.
>> JASON Hirschhorn: Apakah kita akan menggunakannya di luar loop?
>> SISWA 34: Ya.
>> SISWA 35: Tunggu.
Apakah kita ingin mendeklarasikan dalam loop untuk di luar?
>> JASON Hirschhorn: Jadi saya kira kita harus beberapa pseudo WHILE lingkaran di sini bahwa kita
mencoba untuk mencari tahu, bahwa kami belum mendapatkan belum.
Kita tidak perlu malloc itu.
Kami beroperasi di utama, itu hanya akan untuk digunakan di dalam lingkaran ini.
Tidak perlu ada luar ini.
>> Sehingga dapat menjadi variabel lokal.
Anda memiliki pointer ke variabel lokal.
>> SISWA 36: Tapi itu tidak menunjuk ke sesuatu.
>> JASON Hirschhorn: Tidak, itu tidak diinisialisasi apa pun.
Tapi kami tidak akan menggunakannya juga.
Kita akan memasukkan sesuatu ke dalam itu pertama kalinya kami menggunakannya.
Jadi yang tampaknya OK.
Jadi kita tidak perlu malloc sini.
Dan saya pikir itu OK seperti.
OK.
Kami memiliki garis fread.
Mari kita lakukan baris berikutnya.
>> Jika kita ingin menulis ke file, apa yang fungsi yang baik untuk digunakan untuk melakukan itu?
>> SISWA 37: fwrite?
>> SISWA 38: fprintf?
>> JASON Hirschhorn: fprintf adalah satu.
Apa yang satu lagi?
>> SISWA 39: fwrite.
>> JASON Hirschhorn: fwrite.
Dan untuk tujuan kita, fwrite, yang kita lihat di sini, adalah
mungkin pilihan yang lebih baik.
Dibutuhkan empat argumen juga.
Nishant, Anda dapat memberikan saya argumen?
>> Nishant: going pertama seseorang menjadi hanya penyangga.
>> JASON Hirschhorn: OK.
>> Nishant: Yang kedua seseorang hanya akan menjadi 1.
Sepertiga akan menjadi 1.
Dan yang keempat akan menjadi dst.
>> JASON Hirschhorn: Apakah ada yang punya pertanyaan tentang garis itu?
Yang terlihat baik.
OK.
Jadi sekarang terlihat seperti satu hal kita hilang - sebenarnya, mari kita menulis
baris terakhir ini.
Tutup file.
Siapa yang bisa menyelesaikan kami menulis dua baris terakhir?
Ya.
Maaf, siapa namamu?
>> LUCY: Lucy.
>> JASON Hirschhorn: Lucy.
>> LUCY: src fclose dan kemudian tujuan fclose.
>> JASON Hirschhorn: fclose, paren terbuka, src, paren dekat, titik koma.
Dan fclose -
ya?
>> LUCY: Buka kurung, dst dan kemudian titik koma.
>> JASON Hirschhorn: Great.
Dan apa yang harus saya masukkan di akhir?
>> LUCY: Kembali 0.
>> JASON Hirschhorn: Kembali 0.
Apakah saya harus?
Hanya pertanyaan.
Apakah kita harus menyertakan return 0?
>> MAHASISWA GANDA: No
>> JASON Hirschhorn: No
Main melakukannya secara otomatis jika Anda mendapatkan sampai akhir.
Tapi saya pikir itu bagus untuk memasukkannya secara eksplisit.
Terutama ketika kita kembali lainnya hal-hal di seluruh program.
OK.
Ini adalah apa yang kita hilang -
WHILE apa?
Siapa yang bisa memikirkan beberapa -
memiliki beberapa rasa apa hal-hal bisa masuk ke sana?
Bahkan jika itu hanya dalam beberapa pseudocode seperti bahasa?
>> Apa yang kita benar-benar - apa kita ingin pergi sampai?
Ya, Lucy.
>> LUCY: The akhir file.
>> JASON Hirschhorn: The akhir file.
Jadi apa yang Anda maksud dengan akhir file?
>> LUCY: Setelah Anda mencapai akhir file, berhenti.
>> JASON Hirschhorn: OK.
Jadi setelah kita mencapai akhir file.
Bagaimana kita tahu ketika kita telah mencapai akhir file?
>> SISWA 40: Saya pikir penyangga akan diatur ke NULL.
>> SISWA 41: Buffer dinyatakan di dalam lingkaran.
>> JASON Hirschhorn: Jadi Anda pikir buffer akan diatur ke NULL.
Mengapa penyangga diatur ke NULL?
>> SISWA 40: Karena ketika Anda fread, Anda mencoba untuk menempatkan
apa-apa ke dalam buffer.
>> JASON Hirschhorn: OK.
Jadi Anda berpikir fread -
ketika kita telah mencapai akhir dari File, apa yang fread akan lakukan?
Saya pikir itu pertanyaan kita harus mencari tahu.
Apa fread lakukan?
Apakah itu menempatkan NULL dalam buffer, atau apakah itu melakukan sesuatu yang lain?
Bagaimana kita bisa mengetahui apa itu?
>> SISWA 42: Man.
>> JASON Hirschhorn: Man.
Jadi mari kita lihat di sini.
Mengembalikan nilai.
Pada keberhasilan, fread dan fwrite mengembalikan jumlah item dibaca atau ditulis.
Jumlah ini sama dengan jumlah byte ditransfer hanya ketika ukuran 1.
Jika terjadi kesalahan, atau akhir file tercapai, nilai pengembalian adalah
jumlah item yang pendek atau 0.
>> Jadi untuk tujuan kita, jika mencapai fread akhir file, dan membaca dari
akhir file, tidak ada yang tersisa untuk membaca, apa itu akan kembali?
>> SISWA 43: Zero?
>> JASON Hirschhorn: Apa?
>> SISWA 43: Zero?
>> JASON Hirschhorn: Zero.
Ini akan kembali nol.
Jadi kita tahu bahwa fread, ketika kita sudah mencapai akhir file, akan
untuk kembali nol.
Bagaimana kita dapat menggunakannya untuk keuntungan kita?
>> AVI: Anda dapat mendeklarasikan variabel di luar loop disebut cek.
Jika cek sama -
untuk saat ini - satu.
>> JASON Hirschhorn: OK.
>> AVI: Dan kemudian Anda dapat menempatkan IF Pernyataan tepat setelah fread mengatakan jika
fread sama dengan nol -
no.
>> JASON Hirschhorn: Who dapat membantu Avi keluar?
>> AVI: Apa nilai dikembalikan oleh fread?
>> JASON Hirschhorn: Kami hanya pergi lebih dari itu.
>> AVI: Bagaimana Anda mewakilinya?
>> JASON Hirschhorn: Jadi kembali - mari kita mencari di sini - ia mengembalikan
size_t, yang pada dasarnya adalah integer.
Jadi itu mengembalikan sebuah integer.
Dan dalam kasus kami, itu akan kembali 1 atau 0 -
1 jika membaca satu hal - satu byte, dan 0 jika kita telah mencapai akhir.
Jadi jika fread -
ya?
>> SISWA 45: Tak bisakah kau hanya menempatkan penuh fread (buffer, 1, 1, src) ke dalam
while loop?
>> JASON Hirschhorn: Jadi Anda usulkan melakukan hal ini ke sana?
>> [Interposing SUARA]
>> JASON Hirschhorn: Tunggu.
Jadi kita Ridding itu.
Jadi Anda ajukan menempatkan fread ke sana?
Apa yang harus kami juga bergerak jika Anda ingin melakukan itu?
>> SISWA 45: buffer luar.
>> JASON Hirschhorn: Kita harus juga bergerak ini di sini.
>> SISWA 45: Tapi apakah yang terus-menerus bergerak ke depan?
>> [Interposing SUARA]
>> JASON Hirschhorn: OK.
Jadi ini adalah apa yang diusulkan Okshar.
Kita menciptakan penyangga kami.
Kami WHILE fread, maka kita fwrite.
Pemikiran tentang ini?
>> STUDENT 46: Satu-satunya pertanyaan adalah, apakah itu benar-benar menjalankan perintah fread?
>> JASON Hirschhorn: Pertanyaan besar.
Bila Anda meletakkan pemanggilan fungsi dalam kondisi, apakah itu
fungsi panggilan mengeksekusi?
Kami telah melihat contoh-contoh ini sebelumnya.
Benar?
>> SISWA 46: OK.
Ya.
Jadi itu tidak mengeksekusi.
>> JASON Hirschhorn: Kami telah melihat hal-hal seperti itu sebelumnya, di mana kita memiliki
fungsi panggilan dalam kondisi.
Apakah itu fungsi panggilan mengeksekusi?
Ya.
Jadi jawabannya adalah ya.
Fungsi panggilan ini akan mengeksekusi.
Tapi sekali lagi, itu adalah apa yang kita inginkan?
>> Apa salah satu cara kita bisa mencari tahu apakah itu yang kita inginkan?
>> MAHASISWA GANDA: Jalankan?
>> JASON Hirschhorn: Kita bisa menjalankannya.
Tapi sebelum kita melakukan itu, kita bisa juga alasan melalui ini.
Jika -
mengatakan bahwa kita memiliki satu byte dalam kami mengajukan, kita akan sampai ke sini,
kita akan sampai ke kode ini.
Ini akan berjalan.
fread akan kembali satu byte dan menyimpannya dalam buffer.
Dan ini akan mengevaluasi ke 1, benar, setelah ia kembali 1.
>> Jadi SEMENTARA 1.
Apakah itu berarti kode di dalam loop WHILE akan mengeksekusi?
>> SISWA 47: Ya.
Memang benar.
>> JASON Hirschhorn: Ya.
1 adalah benar.
Ini bukan 0.
Jadi kode di dalam sini akan mengeksekusi.
Jadi kita akan menulis itu.
Kami akan kembali ke ini baris sekali lagi.
Sekarang kita memiliki -
kita berada di akhir file kami.
Kita membaca dari akhir file kami, karena kita hanya memiliki satu byte di dalamnya.
>> Fread kembali 0, toko sesuatu dalam buffer.
Sejujurnya aku tidak tahu apa itu toko dalam buffer.
Kita mungkin bisa mencari untuk melihat apa yang dilakukannya.
Bahwa aku benar-benar tidak tahu.
Kita tidak tahu, siapa yang peduli apa itu toko dalam buffer?
Tapi itu kembali 0.
Dan akan sedangkan 0 mengeksekusi?
>> SAAT 0 tidak akan mengeksekusi.
Jadi kita akan pindah ke sini.
Jadi mari kita mengacungkan tangan jika ini adalah kode yang harus kita jalankan, atau jika kita
harus melakukan perubahan terlebih dahulu.
Jadi jika Anda berpikir - Anda harus memilih.
Jika Anda pikir kita harus menjalankan kode ini seperti, silahkan angkat tangan.
>> OK.
Ada satu -
apakah Anda memiliki pertanyaan, kekhawatiran?
Ya.
>> SISWA 48: Setelah kita bergerak penyangga luar loop, kita
harus malloc itu?
>> JASON Hirschhorn: Pertanyaan besar.
Setelah kita bergerak penyangga di luar lingkaran, kita harus malloc itu?
Ini adalah pertanyaan lingkup.
Jika kita menginisialisasi penyangga luar loop ini, akan itu ada
dalam loop?
>> MAHASISWA GANDA: Ya.
>> JASON Hirschhorn: Ya.
Jangkauannya mencakup dalam loop, dan, benar-benar, apa pun di bawah di dalam
kode ini, termasuk hal-hal di dalam sini.
Jadi kita tidak perlu malloc itu.
Ini adalah variabel lokal, dan ruang lingkup masih termasuk loop.
>> SISWA 49: Apakah kita perlu untuk membebaskan itu?
>> JASON Hirschhorn: Apakah kita perlu buffer bebas?
>> SISWA 49: Ya, jika kita tidak malloc.
>> JASON Hirschhorn: Apakah kita perlu buffer bebas?
Kami tidak.
Sekali lagi, itu adalah variabel lokal, jadi kita tidak perlu untuk membebaskan itu.
OK.
Mari kita lihat apa yang terjadi.
Jadi diinisiasi.
Itulah sesuatu yang Marcus diusulkan sebelumnya.
Jadi kita memiliki kesalahan itu, variabel penyangga adalah uninitialized bila digunakan di sini.
>> Bagaimana kita bisa memperbaiki ini?
>> SISWA 50: malloc itu?
>> SISWA 51: Setara NULL?
>> SISWA 52: Katakanlah penyangga sama dengan NULL.
>> JASON Hirschhorn: OK.
Terlihat bagus.
Kami memiliki sekarang.
Mari kita membuat sesuatu untuk mencoba menyalin.
Jadi kita memiliki file teks kami.
Bagaimana kita bisa menjalankan program ini?
Ya.
>> SISWA 53: Anda dapat melakukan dot slash cp, test.txt.
Dan kemudian Anda dapat memberi nama file lain yang akan menyimpan ke dalam.
>> JASON Hirschhorn: OK.
Kita akan menyebutnya out.txt.
Cool?
Kesalahan Seg.
Pemikiran tentang kesalahan seg?
Ini bagus.
Bagaimana kita bisa mencari tahu di mana kesalahan seg adalah?
Apa?
>> SISWA 54: gdb.
>> JASON Hirschhorn: gdb.
Kami menjalankan gdb dengan menulis gdb dot slash, nama program kami.
Tidak ada baris perintah argumen di sana.
Kita akan menetapkan breakpoint di utama.
Jika saya ingin memulai gdb, apa yang harus saya lakukan?
>> SISWA 55: R.
>> JASON Hirschhorn: R. Lalu apa?
>> SISWA 55: Argumen?
>> JASON Hirschhorn: Lalu argumen baris perintah.
Mari kita berjalan melalui.
N hanya membawaku baris demi baris.
Aku akan pergi sampai Saya mendapatkan kesalahan seg saya.
Ada kesalahan seg saya.
Sepertinya fread disebabkan kesalahan seg saya.
Aku tahu fread menyebabkan kesalahan seg saya, karena itu adalah
baris kami hanya dieksekusi.
>> Dan satu-satunya hal yang terjadi di garis itu -
dua hal yang terjadi.
Fread akan, dan kemudian kami melakukan beberapa pengecekan WHILE.
Saya berani bertaruh bahwa SAAT memeriksa tidak menyebabkan kesalahan seg saya.
Kemungkinan besar, fread adalah menyebabkan kesalahan seg saya.
Saya juga melihat sesuatu di sini, memcopy.
>> Salinan memori.
Kedengarannya seperti memindahkan memori dari satu lokasi ke lokasi yang lain.
Kedengarannya seperti sesuatu yang akan terjadi di fread, mungkin beberapa memori
pindah dari sini ke sini.
Mari kita pergi melalui ini lagi.
Bagaimana cara memulainya lebih dan jalankan lagi?
Ya.
>> SISWA 56: Apakah Anda perlu menempatkan ampersand sebelum penyangga?
>> JASON Hirschhorn: Jadi ampersand sebelum penyangga akan memberi saya alamat
penyangga, yaitu char *.
Mari kita jalankan melalui ini sekali lagi.
Bagaimana cara menjalankan melalui itu sekali lagi?
>> SISWA 57: Dapatkah Anda hanya ketik menjalankan lagi?
>> JASON Hirschhorn: Cukup ketik run lagi.
Jadi kita tidak akan mengeksekusi baris ini.
Jadi buffer adalah pointer NULL.
Benar?
Hal ini menunjuk ke - mari kita lihat.
Jika kita memiliki kami -
menggambar cepat ini.
Dapatkah orang melihat apakah Saya menulis di sini?
>> Jadi dalam stack, kami memiliki lokal variabel dan itu disebut buffer, dan
itu adalah pointer ke char.
Apa alamat char ini di?
>> SISWA 58: 0x0.
>> JASON Hirschhorn: Benar.
Itulah yang ini.
Di sini, di dalam penyangga, disimpan 0x0.
Itulah apa yang kita miliki - pengaturan yang kita miliki sekarang.
Jadi baris ini, fread, menempatkan sesuatu dari sumber mana?
Ke dalam kotak ini atau kotak ini?
Kotak mana?
Box atau kotak kanan kiri?
Kotak kanan ini.
>> Ini mengikuti pointer, dan menempatkan di sini.
Ketika kita mencoba dan memori sentuh pada lokasi 0, apa yang kita dapatkan?
Sebuah kesalahan segmentasi.
Itulah kesalahan yang kita miliki sekarang.
Ya.
>> SISWA 59: Jangan Anda memiliki untuk menempatkan star penyangga?
Atau tidak?
Untuk fread?
>> JASON Hirschhorn: Jadi fread membutuhkan pointer.
Jadi lewat di penyangga.
Dan kemudian akan de-referensi itu suatu tempat di dalam fread.
Tapi sekali lagi, kita melihat, dibutuhkan pointer.
Kita tidak perlu untuk lulus penyangga bintang.
Itu akan melewati apapun yang ada di sini.
Dan yang mungkin akan memberi kita kesalahan karena kita de-referensi itu.
>> Benar?
Ketika kita de-referensi pointer ini, ketika kami mencoba untuk mengakses lokasi ini,
kita mendapatkan kesalahan - kesalahan segmentasi kami.
Jadi -
oops.
Kita akan berhenti dari gdb.
Baris kami -
masalah kita - yang benar here on line ini.
Dan itu masalah karena baris ini.
>> Bagaimana kita bisa membuat sebuah kotak yang dapat diakses di fread.
Benar?
Kita perlu untuk membuat kotak itu salah satu byte besar, ukuran char.
Tapi kita perlu kotak yang dapat diakses saat fungsi ini dijalankan.
Jadi di mana -
ya.
Ada gagasan?
>> SISWA 60: Hanya mengatur sebagai karakter acak.
Hanya melakukan equals char buffer karakter.
Dan kemudian, ketika Anda telah penyangga di sana -
>> JASON Hirschhorn: Tunggu.
Char penyangga?
Jadi tidak ada bintang?
>> SISWA 60: Ya.
Keluarkan bintang.
Sama karakter acak.
>> JASON Hirschhorn: OK.
Jadi memberi saya satu.
>> SISWA 60: Like a atau sesuatu.
Dan kemudian ketika Anda memiliki penyangga ada, Anda menggunakan -
>> SISWA 61: Star?
Oh tidak, ampersand.
>> SISWA 60: Gunakan ampersand.
>> JASON Hirschhorn: OK.
Dan bagaimana dengan di fwrite?
>> SISWA 60: Gunakan ampersand lagi.
>> JASON Hirschhorn: Baiklah.
Jadi ide Anda, kami membuat char dan meletakkan sesuatu di dalamnya, dan kemudian
menulis ke char.
>> SISWA 60: Ya.
>> JASON Hirschhorn: Apa menurut orang lain?
>> SISWA 62: Ini berbelit-belit.
>> JASON Hirschhorn: OK.
Mari kita menariknya keluar.
Jadi, kali ini, aku akan menggambar ini di merah di tumpukan di sini, dan kemudian kita
akan memiliki -
ooh!
Maaf.
Jadi saat ini kita memiliki sesuatu yang disebut penyangga, dan itu di stack.
Benar?
Dan kita menyimpan di dalamnya, pada awalnya.
>> Kemudian kita memiliki panggilan kita untuk fread.
Apa fread tidak yang dibutuhkan byte dari file kita dan menempatkan di suatu tempat.
Ini menempatkan dalam apapun hal yang menunjuk ke.
Nah, sebelum kami memiliki alamat ini -
0x0.
Sekarang apa alamat yang kita miliki?
>> SISWA 63: Apapun alamat buffer.
>> JASON Hirschhorn: Apapun alamat buffer.
Ini mungkin akan menjadi sesuatu seperti itu.
Mungkin akan mulai dengan b dan f, dan kemudian memiliki enam lainnya
digit heksadesimal.
Tidak apa-apa.
Beberapa alamat.
Dan kita melewati alamat yang masuk
>> Dan kita akan menempatkan satu kami byte hal di alamat itu.
Jadi kita akan menempatkan satu kami Hal byte dalam sini.
Dan kemudian kita akan menulis dari apa pernah dalam sini.
Apakah Ada yang punya pertanyaan tentang itu?
Siapa yang berpikir kode ini akan bekerja?
>> Angkat tangan Anda jika Anda berpikir kode ini akan bekerja.
Anda harus mengambil sikap.
Dan yang berpikir kode ini tidak akan bekerja?
Angkat tangan Anda.
Semua orang harus mengangkat tangan mereka.
OK.
Michael, di mana kau berdiri?
>> MICHAEL: Saya tidak bisa memutuskan.
Jenis di tengah.
>> JASON Hirschhorn: Kau di tengah.
Pilih salah satu.
>> MICHAEL: Aku akan memiliki iman dan mengatakan ia akan bekerja.
>> JASON Hirschhorn: OK.
Anda akan memiliki iman dan mengatakan itu bekerja?
Apa yang terjadi?
>> [Interposing SUARA]
>> JASON Hirschhorn: Tidak ada seg kesalahan.
Bagaimana kita dapat memeriksa untuk melihat apakah dua hal yang sama?
Dua file adalah sama.
>> SISWA 64: Diff.
>> JASON Hirschhorn: Diff.
Cek Diff untuk perbedaan antara dua file, dan jika ia mengembalikan
apa-apa, mereka identik.
Dan jika kita membuka, kita mendapatkan file kita.
Jadi itu solusi yang tepat.
Mari kita melihat kembali sekali lagi.
Kami benar-benar bahkan tidak perlu menginisialisasi itu.
>> Mungkin akan terlihat sedikit bersih jika Anda tidak menaruh
sesuatu yang acak di sana.
Intinya menjadi, Anda perlu membuat beberapa ruang untuk menyimpan sesuatu dari
fread dan mengambil sesuatu dari fwrite.
Dan hal yang harus baik lokal variabel pada stack - Anda
bisa saja malloc'd beberapa ruang.
>> Jadi kita benar-benar bisa memiliki malloc tertulis di sini, dan
yang akan bekerja.
Dan kemudian kita akan telah menyimpan hal-hal kita di suatu tempat di heap.
Tapi ini sebenarnya, mungkin, solusi yang paling elegan.
Hanya membuat beberapa ruang pada stack untuk hal-hal ini untuk pergi.
>> Saya akan memiliki dua komentar lain.
Jika Anda adalah untuk mengambil giliran dalam hal ini, dan kemudian mendapatkan mencetak gol ini, komentar saya
akan menjadi sebagai berikut.
1 ini di sini, bagi saya, melihat seperti nomor ajaib.
Ini 1, dalam hal fread, masuk akal.
Itulah beberapa hal untuk membaca atau menulis.
>> Tapi yang satu ini di sini harus mungkin menjadi sesuatu yang lain.
Jadi apa adalah salah satu solusi?
>> SISWA 65: Ukuran byte.
>> JASON Hirschhorn: Seperti itu?
>> SISWA 65: Ukuran char.
>> JASON Hirschhorn: Ukuran char.
Ya, byte bukanlah tipe.
Jadi ukuran karya arang.
Kita bisa, di bagian atas kode kita, # didefinisikan itu.
Disebut sesuatu BYTE dan itu benar-benar sebuah char.
Sebenarnya, pendekatan yang lebih baik mungkin ini -
uint.
Ada yang tahu apa itu?
>> Maaf.
Saya memilikinya mundur.
Tunggu, tidak.
Arah mana ia pergi?
Ada yang tahu apa itu?
Ya.
>> SISWA 67: Seharusnya membantu standarisasi di sistem hal-hal yang
memiliki - seperti unsigned integer yang memiliki 8 byte?
>> JASON Hirschhorn: Itu tepat.
Pada mesin yang berbeda, ukuran char -
biasanya tidak char.
Karakter biasanya satu byte.
Tetapi ukuran tipe data lain ukuran yang berbeda pada mesin 32-bit
versus mesin 64-bit.
Sebuah uint8_t selalu 8 bit -
selalu satu byte.
>> Dan saya harus menyertakan bahwa file standar int sundulan.
Jadi sekarang, ini mungkin akan menjadi cara terbaik untuk menulis kode ini.
Jadi saya menyingkirkan angka ajaib.
Dan saya juga memiliki lebih logis ketik buffer.
Hal ini tidak hanya char, itu adalah byte, yang adalah apa yang kita harapkan untuk menjadi.
>> Dan di sini, kita sudah benar-benar telah sedikit lebih kuat.
Kami tidak menyebutnya char, yang -
mungkin, siapa tahu - bisa menjadi berbeda ukuran pada mesin yang berbeda.
Kami benar-benar mengatakan ini adalah persis satu byte, selalu, tidak peduli apa.
Dan jika kita melihat di sini, kita membuat cp.
Uh-oh.
Apa yang terjadi?
>> SISWA 68: Mungkin diaktifkan.
>> JASON Hirschhorn: Apa?
>> SISWA 69: Apakah itu?
>> SISWA 70: Anda tidak melakukan mendefinisikannya sebagai tipe.
>> SISWA 71: Tapi seharusnya didefinisikan dalam standar.
>> SISWA 72: Apa yang terjadi?
>> SISWA 73: Harus mendefinisikan menjadi huruf besar semua?
>> JASON Hirschhorn: Jadi bukan # define.
Sebenarnya, dalam hal ini, saya akan menggunakan typedef.
Karena kita menggunakannya sebagai jenis di satu lokasi.
Jadi dalam hal ini, kita benar-benar ingin typedef seperti kita mencetak jenis baru
byte, dan itu adalah, pada dasarnya, ini.
Ini sedikit berbeda dengan # define.
>> Dan sekarang, kode kita bekerja sempurna.
Jadi, sekali lagi, # define mengambil sesuatu, menggantikan di mana-mana
dengan hal lain.
Ini hanya makro -
singkatan untuk menyingkirkan angka ajaib.
Tapi dalam kasus ini, karena kita menggunakannya sebagai tipe -
di sini -
dalam rangka untuk itu untuk bekerja, kita perlu untuk typedef byte apa pun.
>> Dan kita mendefinisikan itu di sini.
Ini bukan sebuah struct, itu sebenarnya hanya integer unsigned.
Itu salah satu byte panjang.
Kode ini akan tersedia secara online, dan Anda semua harus memilikinya sekarang.
>> Jadi kita punya -
sempurna -
13 menit tersisa untuk pergi Masalah lebih set 5.
Saya ingin berjalan melalui copy.c bersama-sama, dan kemudian kita akan berbicara secara singkat
tentang bagian-bagian lain masalah ditetapkan.
Jadi biarkan aku menarik copy.c.
Dan hal yang keren adalah, kita sudah benar-benar sudah menulis banyak kode ini.
>> Kode kami menulis benar-benar hanya keluar dari sini ketika aku masih
menulis ini pada saya sendiri.
Tapi ini adalah copy.c, membentuk yayasan untuk dua bagian pertama
masalah ditetapkan untuk whodunit.c, yang Anda perlu menulis, dan resize.c.
Recover.c, yang merupakan ketiga dan terakhir bagian dari himpunan masalah, tidak
didasarkan dari file ini.
>> Anda akan perlu menulis file tersebut, kami memberikan template untuk itu
mengajukan, tapi itu tidak ada hubungannya dengan copy.c.
Tetapi karena copy.c adalah dasar untuk dua bagian pertama, kita akan
berjalan melalui sekarang, sehingga Anda memiliki pengertian yang baik dari apa yang dilakukannya.
>> Dan memberikan beberapa komentar dari itu pergi.
Kami sudah menulis beberapa hal ini.
Pertama, kami memastikan kita mendapatkan tiga argumen.
Selanjutnya, kita mengingat nama file.
Jadi kami melewatkan langkah ini ketika kami kode hal kami -
ketika cp kami.
Tapi di sini, mereka membuat sedikit lebih bersih.
>> Mereka memeriksa untuk memastikan kedua file baik, di
Selain membuka mereka.
Kami menulis semua kode ini sekarang, jadi aku tidak akan memikirkan kode ini.
Berikutnya adalah beberapa hal yang khusus untuk jenis file yang kita gunakan, yang
adalah file bitmap.
File Bitmap memiliki beberapa metadata terkait dengan mereka.
>> Jadi pasangan pertama byte memberitahu Anda tentang file.
Mereka bukan warna pixel dalam gambar itu.
Mereka memberitahu Anda tentang file.
Dan jika Anda membaca melalui set masalah, Anda akan memiliki lebih banyak informasi
pada apa jenis struktur metadata disertakan dengan bitmap.
>> Tapi itulah mengapa kita memiliki pertama ini set - kode ini di sini.
Kami membaca metadata -
dua potong metadata - file header dan informasi header.
Dan kami memeriksa beberapa bagian dari itu untuk pastikan itu adalah file bitmap yang benar
sebelum melanjutkan.
>> Dan lagi, ini adalah rincian kami tidak perlu masuk ke sekarang.
Jika Anda membaca melalui set masalah, Anda akan memahami ini.
Singkat cerita, ini hanya mengatakan, ini adalah file bitmap, dan
menyatakan bahwa.
>> Selanjutnya, kita sedang menulis mereka untuk keluar berkas.
Kita melihat bahwa di sini.
Kami menulis untuk keluar pointer.
Selanjutnya, kita menentukan bantalan.
Jadi sekali lagi, seperti kekhususan dengan file bitmap, beberapa baris termasuk
padding di akhir.
Dan jika Anda membaca melalui set masalah, Anda akan mempelajari lebih lanjut tentang bantalan.
Ini adalah formula untuk menemukan bantalan.
>> Penting untuk diingat -
ketika Anda mengubah ukuran bitmap mengajukan, perubahan bantalan.
Bila Anda mengubah ukuran mengajukan, perubahan bantalan.
Ini tidak akan menjadi lebih besar dari 3 -
itu akan menjadi 0 sampai 3, inklusif.
Tetapi ketika Anda mengubah ukuran sesuatu, perubahan bantalan.
>> Jika saya hanya memiliki satu piksel berturut-turut itu, saya membutuhkan tiga byte padding, karena
setiap baris harus kelipatan empat byte panjang dalam sebuah file bitmap.
Tapi kalau aku ganda itu, untuk pergi dari satu pixel dua pixel, masing-masing,
katakanlah, adalah byte, maka saya perlu dua byte padding untuk membuat
yang sama dengan empat.
>> Jadi ketika saya mengubah ukuran sesuatu, Saya perlu mengubah jumlah
padding yang saya miliki.
Apakah itu masuk akal bagi semua orang?
Selanjutnya, kita iterate atas setiap baris, atau melalui semua baris.
Dan kemudian kita iterate melalui setiap kolom dalam setiap baris.
Kami memperlakukan bitmap ini seperti grid, seperti kami telah diperlakukan
papan di 15.
>> Seperti kita memperlakukan batu bata ketika kami mencetak mereka di layar.
Sebuah grid baris dan kolom.
Kemudian - kami melihat ini.
Kami benar-benar hanya kode ini.
Kami menciptakan beberapa penyimpanan sementara.
Kita membaca di sana, dan kemudian kita menulis itu.
Ini adalah apa yang baru saja kita lakukan.
>> Selanjutnya, karena aku mengatakan setiap baris berakhir dalam beberapa padding, kita
melewatkan bantalan itu -
padding tua.
Dan kemudian kita tambahkan kembali.
Dalam hal ini, kita sedang menciptakan file yang tepat sama.
Kami hanya menyalin.
Jadi baris ini adalah konyol.
Kita bisa benar-benar hanya menempatkan padding masuk
>> Tetapi jika Anda mengubah ukuran file, Anda masih ingin baris ini?
Jadi jika kita mengubah ukuran file, apakah kita masih ingin melewatkan
lebih padding tua?
>> SISWA 74: Ya.
>> JASON Hirschhorn: Jadi kita lakukan.
Karena ini, sekali lagi, penawaran dengan file sumber.
Kami tidak peduli tentang padding dari file sumber.
Kami ingin pergi ke baris berikutnya.
Tapi kita tidak hanya menempatkan kembali jumlah lama padding.
Kita perlu untuk menempatkan kembali jumlah baru padding.
>> Jadi ketika kita mengubah ukuran berkas, kita masih ingin melewatkan
padding file lama - apa kita membaca dari.
Tapi apa yang kita menulis untuk, kita akan perlu untuk dimasukkan kembali beberapa berbeda
jumlah padding yang kita sudah ditentukan.
Ya.
>> SISWA 75: Urutan kedua garis tidak masalah, kan?
Karena Anda menangani file yang berbeda.
>> JASON Hirschhorn: Tepat.
Urutan dua baris tidak masalah.
Kami menulis baris ini.
Hal ini di sini untuk file kita menulis untuk.
Itu penting, sehingga kita mendapatkan jumlah yang tepat padding.
Hal ini harus berurusan dengan dalam file.
Kami ingin melewatkan hak lebih padding.
>> Kami tidak ingin membaca -
jika kita membaca byte pada suatu waktu, kita tidak peduli tentang orang-orang byte bantalan.
Kami ingin pindah ke baris berikutnya.
Akhirnya seperti Lucy berikan untuk kita, kita menutup file dan mengembalikan 0.
Jadi ini adalah copy.c.
Dan kami benar-benar menulis - kita menghabiskan sebagian besar bagian menulis ini, pada dasarnya.
>> Anda membuat ini.
Jadi mudah-mudahan Anda memiliki rasa yang baik apa yang terjadi di sini.
Perbedaan besar, jujur, hanya Bagian pertama ini yang berhubungan dengan
kekhasan file bitmap.
Jadi saya punya sebagai slide berikutnya, apa yang perlu kita lakukan?
Nah, mari kita berpikir tentang cerita detektif.
>> Dan untuk seseorang yang membaca masalahnya mengatur, apa yang kita
perlu dilakukan di cerita detektif?
Cukup.
Aleja.
>> Aleja: Bisakah Anda mengambil bagian setiap pixel yang menunjukkan merah.
Dan kemudian -
jenis?
>> JASON Hirschhorn: OK.
Jadi mengambil bagian masing-masing pixel yang menunjukkan merah.
Itu dekat, tapi tidak semuanya.
>> SISWA 76: Well, ada cara yang berbeda untuk melakukannya.
>> JASON Hirschhorn: OK.
Beri aku satu cara.
>> SISWA 76: Keluarkan semua merah, dan kemudian menekankan biru dan hijau.
>> JASON Hirschhorn: OK.
Jadi mengingat kedua cara ini -
kedengarannya seperti kita memberikan pixel, itu memiliki tingkat merah, biru, dan hijau.
Kami ingin mengubah tingkat relatif merah, biru, dan hijau, tergantung
pada pixel tersebut.
Dimana dalam kode ini harus kita ubah relatif merah, biru, dan hijau
tingkat pixel diberikan.
Setelah kami telah membacanya -
sebelum kita menulis itu?
Beri aku nomor baris.
>> MAHASISWA GANDA: 83.
>> JASON Hirschhorn: 83.
Jadi di sini.
Untuk cerita detektif, kode yang Anda butuhkan untuk menulis semua harus pergi di sana.
Dan itulah satu-satunya kode Anda perlu menulis.
Karena, seperti yang kita dengar, semua yang Anda butuhkan untuk lakukan adalah mengubah ini relatif biru,
tingkat merah, dan hijau dari setiap pixel.
>> Anda sudah membacanya, dan sekarang kau akan menulis itu.
Bagaimana cara mendapatkan - jika saya memiliki hal ini disebut tiga, di sini, dan itu dari
ketik RGBTRIPLE -
baik, jika kita melihat di bmp.h, apa RGBTRIPLE?
>> SISWA 77: Ini struct.
>> JASON Hirschhorn: RGBTRIPLE adalah struct.
Kita melihat bahwa tepat di sini.
Jadi jika saya ingin akses, katakanlah, tingkat merah dari struct, bagaimana cara
mengakses tingkat merah dari struct ini?
>> [CLASS murmur]
>> SISWA 78: RGBTRIPLE.rgbtred?
>> JASON Hirschhorn: Apakah itu benar?
>> SISWA 79: Ini harus tiga dot, bukan RGBTRIPLE dot?
>> JASON Hirschhorn: Triple.
Tiga adalah variabel lokal, sehingga sini, tidak ada petunjuk di sini.
Jadi kita hanya menggunakan notasi titik.
Hal ini akan memberikan tingkat merah.
Jika saya ingin mengubahnya, saya hanya mengatur itu sama dengan sesuatu yang berbeda.
Jadi sekali lagi, baris kode akses variabel ini di dalam struct ini, dan
kita dapat mengaturnya untuk sesuatu yang baru.
>> Jadi untuk cerita detektif, sekali lagi, ini adalah, pada dasarnya, apa yang perlu kita lakukan.
Sangat sederhana.
Hanya mengubah beberapa tingkat relatif, dan ini adalah di mana kode yang berjalan.
Resize, di sisi lain, adalah sedikit lebih sulit.
Bahkan, mengubah ukuran mungkin adalah Bagian paling sulit dari masalah ini ditetapkan.
Kami memiliki tiga menit untuk pergi di atasnya.
>> Tapi sekali lagi, kita sudah menulis sebagian besar kode ini, jadi kami
harus cukup familiar.
Apa sajakah hal yang ingin kita lakukan di mengubah ukuran, jika Anda sudah membaca selama
masalah set?
Jika Anda memberikan mereka kepada saya, kami dapat berbicara tentang mereka.
Apa sajakah hal yang ingin kita lakukan?
>> SISWA 80: Vertikal -
jadi anda harus horizontal mengubah ukurannya, tetapi secara vertikal mengubah ukurannya juga?
>> JASON Hirschhorn: Jadi jika kita diberi pixel, dan kami ingin mengubah ukurannya dengan
faktor dua, sekarang perlu ukurannya horizontal dan ukurannya
vertikal.
Apakah itu masuk akal?
Ya.
Jadi itu mungkin Tantangan terbesar.
Dan kita akan berbicara tentang itu dalam detik.
Ya.
>> SISWA 81: Cara saya memikirkannya itu Anda membutuhkan print it out -
>> JASON Hirschhorn: Tunggu.
Jangan katakan apa yang kau lakukan.
Kita akan berbicara dalam logika.
>> SISWA 81: OK.
Apa pertanyaannya?
>> JASON Hirschhorn: Anda hanya mengangkat tangan Anda.
Tidak ada pertanyaan.
Biarkan aku hadir.
Mari saya hanya membahas secara singkat ini.
Jadi kita memiliki satu pixel, kita ingin meniru, baik secara horizontal maupun
vertikal.
Jadi idealnya apa yang kita lakukan di sini adalah, kita membaca dalam pixel, kita menuliskannya
namun banyak kali.
>> Tapi kemudian kami memiliki trik kami di sini, karena maka kita ingin melompat ke
baris berikutnya dan menuliskannya pada awal baris berikutnya.
Jadi jika kita ingin meniru kedua horizontal dan vertikal, apa yang
salah satu cara yang baik untuk melakukan itu -
yang baik meskipun untuk melakukan itu?
Jadi kita tidak perlu terus-menerus mencari sekitar file kita untuk menempatkan hal-hal.
>> Pertanyaan itu mungkin tidak memiliki masuk akal, tapi saya pikir sebuah
menjawab itu akan membantu.
>> SISWA 82: Buat array?
>> JASON Hirschhorn: Jadi mari kita berpikir setiap file sebagai baris.
Mari kita berpikir dalam hal baris.
Jika kita memiliki baris pertama kami dari kecil kami gambar, kita dapat membuat baris yang
ke baris besar dari gambar besar, dan kemudian meniru baris yang bagaimanapun
berkali-kali perlu direplikasi, daripada pergi pixel by pixel,
yang akan membingungkan ketika menangani file.
>> Karena jika kita punya -
Saya kehabisan ruang.
Jika ini adalah file kita, dan kita mendapati bahwa satu pixel di sana, dan kami ingin meletakkannya
di sana, kami masih memiliki beberapa hal yang perlu untuk pergi ke sana ketika kita berada
menulis dan membuat file baru -
file kita yang dua kali lebih besar.
>> Tapi itu benar-benar keras dengan fungsi file untuk melewati sekitar untuk baris baru
seperti itu, dan kemudian kembali ke sini dan meletakkan segala sesuatu di sana.
Ini hampir mustahil untuk melakukan sesuatu seperti itu, kalau itu masuk akal.
Jadi jika kita berpikir dalam hal baris, kita bisa mengambil baris kami, dan kemudian meletakkannya -
meniru baris vertikal.
>> Dan itulah bagaimana kita berurusan dengan ukuran vertikal daripada horizontal.
Itu agak cepat, dan sedikit membingungkan.
Sayangnya waktu kita sudah habis.
Aku akan berdiri di luar bagi anda di sini yang memiliki pertanyaan tentang
masalah set, termasuk pulih.
>> Jadi mari kita menunda untuk saat ini.
Dan lagi, jika Anda memiliki pertanyaan, kita bisa chatting luar.