JASON Hirschhorna: Dobrodošli, svatko, u tjedan 6. Sretan sam što vas sve vidim živ i zdrav Nakon kviza 0, jer znam da je bio je malo grub. Ali, srećom, sve vas je nevjerojatno dobro. I tako to je divno. Ako ste u mom dijelu, ja sam dao najviše od vas poduprijeti svoje kvizove već. Nekoliko vas, ja sam sastanak nakon predavanja. A ako ste student i proširenje niste dobili svoj kviz natrag Ipak, vaša TF vjerojatno radi na tome i ocjenjivanja, i da će ga dobiti natrag da vas uskoro. Dakle, moj produžni studenti koji su Zamislite sada - nadam se živjeti - Ja ću dobiti svoje kvizove kratko, kao dobro. Naš plan za danas je sljedeći. Prvo, mi ćemo ići preko neke sredstva koja CS50 koje vam pruža. Mi ćemo ići preko Kviz 0 next, i Ja ću odgovoriti na sva pitanja ikoga ima o pojedinim problemima. A onda ćemo se ide preko file I / O i problema postaviti pet. Tih posljednjih dvije teme će potrajati najveći dio odjeljka danas. Stavio sam taj popis svaki tjedan kao podsjetnik za sve vas, ali od jezgre poglavlje, imamo samo 90 minuta - mi nisu u mogućnosti pokriti sve ono što sam bi rado zamijenio za vas. No mi imamo tonu sredstava za li izvući nakon što ste upoznati materijal i rad kroz tvoj problem postavlja. Podsjetnik da moram online tekst Kutija, postavljen za vas da ispunite ako bilo kakve povratne informacije za mene, i pozitivne i konstruktivna, o dijelu. Taj URL se nalazi ovdje dolje. Dakle, molim vas, uzmite trenutak, ako imate bilo povratne informacije, bilo za vrijeme sekcije, ili poslije, ili nakon što gledati video online, da mi daju svoj komentar. Ja stvarno poštovati bilo i sve od nje. Dakle, imao sam malih razgovore s puno mojih studenti tijekom tjedna - kao što sam ruku natrag kvizovi, govori o Naravno, s obzirom na to što radite. I jedna tema je došao do više i više u razgovoru o - u Konkretno - Problem postavlja. I ja sam oklopljenog tu temu na brodu upravo sada. U biti, postoji razlika između pretvara u nešto što je učinio ispravno i nešto da je učinio dobro. Većina ljudi su radili fantastično u smislu točnosti - 5-a ili 4-a na svim psets. Većina ljudi su uzimajući one sve vrijeme. Međutim, samo zato što ste učinili nešto dobro ne znači da ste učinio nešto što je elegantno, ili učinkovito, ili kao čisto kao i ti je to mogao učiniti. I to je ono što dizajn - te u manjoj mjeri, stil - sjekire su za. Pa ja sam vas sve gura, a drugi TFS su pritom momci, ne samo pak u stvari koje su točne, ali zauzvrat u stvarima koje su kodirane dobro. Ne radi nepotrebna ZA petlje, Ne izračunavanje varijable ako je ne moraju. Na primjer, kada se prisjeti problema postaviti 4, kada je postavljanjem cigle na screen, svaki redak - svaka cigla u dao red ima isti y-koordinata - iste visine koordinirati. Tako da je y-koordinata ne trebaju se izračunati unutar interijera ugniježđeni for petlje da vjerojatno koristi staviti one cigle na zaslonu. To samo treba izračunati svaki put prebacio na red, ili preselio dolje red. Tako kažu, ako postoji 10 cigle u red, svaki opeke mogu imati isto y-koordinata, a da je y-koordinata Možete jednostavno može izračunati jednom za sve one. To ne treba biti izračunat 10 puta, niti da je izračun potreba dogoditi u stvarni Funkcija poziva - Nova gracked funkcija poziva. Dakle, ako je to bilo malo zbunjujuće za vi, više općenito, stvari koje Ne trebate se dogoditi svaki put idete preko for petlje ne bi trebalo biti staviti unutar for petlje, i ne treba biti dogoditi svaki put kad odete preko for petlje. Još jedan dobar dizajn primjer smo vidjeli u tjednu 3 za 15, što bi moglo zadržati Staza od nule. Dakle, kada započeti odbora, te spasi - u globalnoj varijabli, možda - x i y-koordinata nule. I onda kad god - u svoj potez funkciji, kad god bi uspješan potez, ažurirate Položaj nule. To će vas spasiti od vlasništvo to učiniti uklopljeni ZA petlje gledati kroz ukrcati svaki put u vaš potez funkciji i naći nulu, ili pronaći pločica, a zatim provjerite što je pokraj njega. Umjesto toga, imate mjesto nula, možete samo pogledati gore, dolje, i lijevo i desno od njega, kako bi pronašli pločica što su tražili. Dakle, u smislu programa smo mi pisanju, oni nikad dovoljno velik da su neki od tih dizajnerskih odluka su stvarno ide na spriječiti vaš Program, ili bi ga pokrenuti sporije, ili možda čak ponestane memorije. No, mi smo još uvijek gura vas dečki pisati kao elegantan i učinkovit kod moguće. Dakle, ako ne završiti pisanje stvari da imaju znatno veći Opseg, oni će biti napisan s dobrom dizajn osim ispravnim. Dakle, broj imate Donio to. To je nešto što mi tražimo - nešto što ćemo dalje gurati vam dečki na. Ako ste ikada imate bilo kakvih pitanja u vezi dizajn svoj program, slobodno doprijeti do mene, a ja sam sretan prošetati kroz svoj program s vama, i istaknuti neke od dizajna Odluke koje ste napravili, i dati vam neke prijedloge o tome kako bi još bolje dizajnerske odluke. Tako ćemo krenuti dalje to govori o kvizu 0. Prije nego što smo to učinili, ne bilo tko imate pitanja o tome što Ja sam do sada pokrivena? [Šuštanje] JASON Hirschhorna: Sedam sekundi. OK. Pričajmo o kvizu 0 za malo. Većina od vas ima svoj kviz 0 u leđa. Ako to ne učinite, nadamo što ga se sjećam malo. Ali, ako ste uzeti kviz 0, onda također imaju pristup PDF-u online uzorak rješenja. Da li itko ima bilo kakvih pitanja prije smo skočiti u ovotjednom materijala o Poseban problem na kvizu 0 - Zato je odgovor što je to? Je li bilo tko zbunjen o bilo čemu? Čak i ako imaš problema u pravu, ali Samo bih htio da to objasni malo više, ja sam sretna da to učinite sada. Zato sam zatražio da vi dolaze pripremljeni s nekim misli o kvizu 0. Pa tko bi želio nam se Počelo je s pitanjem ili komentar o kvizu 0? [PAPIR šuštanje] JASON Hirschhorna: Ne može svatko nije savršeno. Tako da znam [smijeh] moraju postojati neka pitanja o kvizu 0. OK. Da. Ompica. OMPICA: Broj 10. JASON Hirschhorna: Broj 10. Koji je broj 10? OMPICA: - JASON Hirschhorna: haven't sam - OMPICA: to su - JASON Hirschhorna: Broj 10 je osam na i - pisanje osam do i? OMPICA: Da. JASON Hirschhorna: OK. Dakle, još jedno pitanje, što bi moglo imati upitao je ja sam čak i predviđanja? Odgovor je potvrdan. U poglavlju prije kviza, pitala sam ti dečki to kod oba Sterling i osam do ja. Obojica se dogodilo pojaviti na kvizu. Dakle, nadamo se, što ste platili pozornost na to. I ako je, onda bi vjerojatno učinio dobro na ta dva. Ali, osam do i, nismo zapravo kod to je u klasi, ali to je, opet, pitao na kvizu. Dakle, nekoliko stvari koje treba uzeti umu kada kodiranje osam do i.. Prva stvar, po pitanju, bio da li je potrebno da provjerite je li string bio jednak nuli. Nekoliko ljudi pokušali provjeriti kasnije u programu, ako je nosač bio sam - tako specifičan lik u koji string - bio je jednak nuli. Ali zapamtite, to je u biti null - to je dobro razmišljati o null kao nula pokazivač - kazaljka na nuli - negdje u memoriji gdje nikada ne može pristupiti. Dakle, ako nešto je jednaka nuli, što Znam da to nije inicijaliziran, ili tamo nema ničega. Tako je s char zvijezda, S Nosač i je char. Tako da ima smisla uspoređivati ​​s. na nulu, ali ne s nosača i na nulu. Ali opet - tako da je prva stvar da su trebali učiniti - provjeriti kako bi bili sigurni da ste zapravo dobio pravi niz. Dalje, što ste željeli proći kroz svaki lik u nizu. A kako bi bilo kao s nosačem Ja, na primjer, ako je i vaš iteratora. I uzeti taj lik, i dobiti svoju pravu vrijednost. Vi ste ga pohraniti kao char, ali ASCII vrijednost za nulu - nula kao lik - zapravo nije cijeli broj nula. To je neki drugi broj koji možete pogledati u ASCII tablice. Dakle, jedan od načina da se ispravi za to - Vjerojatno najbolji način za ispravljanje da - je oduzeti od nje Vrijednost lik - nula kao lik. Dakle minus jedan citat, nula, još jedan singl citat. To će se bez obzira na broj imate kao char, i dobiti ga jednaka broj kao stvarni cijeli broj. I to je vrlo sličan pristup Mnogo ljudi je u Problem set 2, s Cezarom i Viginere - te šifre, kada su ih okreće. Dakle, nakon što su ga kao broj iz nula do devet, onda - ovisno o gdje to ide u konačan broj - morate ga pomnožiti od strane vlasti od 10.. Neki ljudi se preselio s leđa na Prednji i množi pojedinca Broj od strane vlasti od 10.. Neki ljudi sele iz naprijed prema natrag - i tako je najviši naručiti brojeve prva - i da će spasiti one koji u Globalna varijabla brojač. I onda svaki put kroz za petlje, pomnožite to div globalni suprotstaviti varijablu sa 10, da bi Prostor za sljedeći char. Tako da je malo konfuzno, bez ja to pisanje na brodu. A uzorak otopine je dostupan za vas. No, to su bile velike stvari smo tražili. Također provjerite kako biste bili sigurni da je svaki individualni karakter doista bio lik između nule i devet, a ne neki drugi lik, poput A, na primjer. To su bile stvari koje su u potrazi jer u tom pitanju. Je li to odgovor na vaše pitanje? OMPICA: Da. JASON Hirschhorna: OK. Ima li kakvih drugih pitanja o kvizu 0? Što o sastavljanju? Svatko sastavljanju zar ne? Ne. Bilo je - [Smijeh] Sva pitanja o Kompilacija proces? Wow. [PAPIR šuštanje] JASON Hirschhorna: Da. Michael. MICHAEL: Je li broj 7 - slučajna? JASON Hirschhorna: Broj 7. Broj 7 je dobiti slučajan prirodan broj. Izvrsno. Dakle, ti si dao cijeli broj A i cijeli broj b, a želite slučajna broj između A i B. Mi zapravo može pisati ovaj na ploča, jer je to jedan bila je jedna linija koda - jedan od načina kako to učiniti. Tako smo dati drand kao Funkcija smo mogli koristiti. A što se drand - uz pretpostavku da je bio prepun - što drand vratiti? MICHAEL: float između 0.0 i 1.0. JASON Hirschhorna: broj - da. Broj između 0 i 1. I tako smo B i. I onda mi imamo slučajni broj između 0 i 1 koju nam je drand. Neki ljudi pokušali staviti B ili b minus , ili nešto u onima zagradi. To bi značilo da su oni Argumenti za tu funkciju. drand ne poduzimati nikakve argumente - kao getString radi Ne poduzimati nikakve argumente. Dakle, to je samo otvorene zagr, u neposrednoj blizini zagr - i to, samo po sebi, je Funkcija poziva. I to vam daje broj između 0 i 1. Naravno, imamo čitav niz da brojevi mogu biti u. Recimo, ako je b 10 i 5, mi stvarno želite broj s nizom od 5. Dakle, sljedeća stvar koju trebate učiniti je pomnožite to po području B minus. Dakle, pod pretpostavkom da se množe. I to će nam dati broj unutar određenog raspona. I to specifičan asortiman se Razlika između B minus. I na kraju, da će samo dati od - kažu raspon između B minus je 5, koji će nam dati broj od 0 do 5. No, ako je u stvari 5, moramo pojačati ovaj raspon do mjesta gdje je zapravo bi trebala biti, dodajući. Tako da dobiva logika pravo. I onda, bi li drugo pitanje? MICHAEL: Ne. Osjećam se jako glupo sad. [Smijeh] JASON Hirschhorna: Ne. Ne osjećam se jako glupo. Broj ljudi borili s ovim pitanjem. A onda, s druge strane pitanje je, drand, što je rekao, daje vam plovak - vraća plovak. No, ova funkcija zapravo pitao za cijeli bi se vratio. Ne morate baciti to izričito u cijeli broj, jer je riječ o Operacije će ga tretirati kao sve A plutaju - kao decimalni broj. Kao i to će - čak i ako to je cijeli broj, to će biti ispravno množe. Sve množenja će raditi. Vi ne morate ga baci ovdje. U stvari, da ne bi trebali baciti. To bi - ako će imati onoliki broj to je između 0 i 1 - slučajni broj, s pomičnim zarezom, - tada je ili će biti samo 0 ili 1, tako izgubit ćete sve to precizno. No, na kraju, kada se vratite, on automatski dobiva poslao natrag kao cijeli broj. Dakle, ne morate učiniti se da je bacanje. Dakle, to je bio odgovor na to pitanje, broj 7. Još neka pitanja na kvizu 0? Da, Annie. ANNIE: Kada ćemo koristiti rekurzivna - kada koristimo iterativni petlje? JASON Hirschhorna: Kad koristite rekurzivna - tako općenito, prednosti i mane u odnosu na rekurzije iterativni pristup. Može li itko ponuditi pro ili con? Molim te? Ne može bilo tko. Tko može ponuditi pro ili con? [PAPIR šuštanje] STUDENTSKI 1: Rekurzivna je manje kodiranje - manje tipkati? JASON Hirschhorna: Pa općenito, rekurzija pogotovo, funkcija - ili algoritam kao pismo vrsta - što se dade na rekurzivni pristup - može biti jednostavnije da kod rekurzivno. I baš više smisla to učiniti rekurzivno. Dakle, da bi se pro da rekurzije. Drugima? Da? STUDENTSKI 2: Con na rekurzije - Ona koristi više memorije. JASON Hirschhorna: Pa upravo pravo. Rekurzivna funkcija će držati dodajući stog okviri na stogu. Dakle, ako ste s radom na puno brojeva, te moraju zvati funkcionirati puno, onda ćete sigurno zauzimaju više memorije, dok je iterativni pristup samo će staviti jedan stog okvir na stogu, jer je sve to se događa u jednoj funkciji. Sve ostale prednosti i mane? Da. STUDENT 3: Pros za rekurzije. Ne morate odrediti u unaprijed koliko puta Kod morao ponoviti. Što može imati unaprijed određeni broj Vrijeme koje morate ponoviti, a zatim rekurzija je bolje, jer je to traje taj rezultat. JASON Hirschhorna: Mislim da je to istina. Ali mislim da je u oba slučaja Vi nikada ne bi - vjerojatno će dobiti neki Ulaz od korisnika. Ili ova funkcija će imati neki ulaz kako bi se utvrdilo koliko je puta treba pokrenuti. Dakle, općenito, ne bi teško kod - čak iu iterativni pristup - kako mnogo puta da je petlje treba pokrenuti. Jeste li imali još jedan ste bili razmišljam o, Annie? OK. Dakle, oni su vjerojatno dvije - Najveći pro i najveći con se rekurzivna odnosu iterativni pristup. OK. Bilo što drugo na kvizu 0? Idemo dalje. File I / O. Tu je prekrasan kratko ovaj tjedan na datoteci I / O koja nadam ste gledali višekratnik puta, i divio. Puno posla je otišao u to, a ja sam Čuo je suludo korisno. Također sam uključen link na ovaj slajd, u slučaju da niste imali šanse da ga gledaju 10 puta. Dakle, mi ćemo ukratko ići preko glavna koraka do otvaranja i rada s datotekama, a zatim ćemo zaroniti u problem kodiranja prije Razmatrajući problem set. Pa opet, ja ću staviti ovo na zaslon, ali ja ću govoriti za Samo minutu o tome što smo radiš ovdje s datotekom I/O-- Što to znači? To znači da možemo stvoriti našu programi, a zatim su naše programe izlaz, a nisu napravili nikakav utjecaj na svijet izvan našeg programa. No, kada smo počeli raditi s datotekama - i čitajući ih i stvarajući ih - možemo imati neki utjecaj na svijet izvan našeg programa. Baš kao i ako Microsoft Word nije bio u mogućnosti kako bi bilo Word dokumenata, a zatim kada Microsoft Word prestati, sve svoje Rad bi otišao, a to bi stvarno biti beskoristan. Mi u konačnici ne želim biti u mogućnosti pisati programe koji mogu utjecati na svijet oko njih, i uzimajući u složeni ulazi - u smislu datoteke i putem datoteka, i stvaranje zanimljiva i uvjerljiv izlazi - u pogledu različitih tipova datoteka. Dakle, to je razlog zašto smo se počinju naučiti kako raditi s datotekama. Točnije, što mi je sljedeći. To je vrlo jednostavno. Postoji samo nekoliko koraka, a Oni su navedeni ovdje na ovom kodu. Tako ćemo proći kroz ovaj kod redak po redak. Prvo, vidjet ćete istaknuo - kada radite s datotekom, Bez obzira na vrstu datoteke je, morate ga otvoriti. A da je s pozivom na fopen - upravo ovdje. Ti su naziv datoteke. Ako datoteka nije u telefonskom imeniku, ili mapu gdje ovaj program životi, onda također treba uključiti Put do mjesta gdje da je datoteka. Mi ćemo pretpostaviti da je ovaj spis pod nazivom "text.txt" - Jednostavan tekstualni dokument - u iste mape ovom programu. Dakle, to je još jedna stvar koju treba imati na um - da, ako želite otvoriti datoteku negdje drugdje, što je zapravo potrebno uključiti svoje mjesto. Drugo, možete proći argument da fopen, i to je ono što želim učiniti s datotekom. Postoje tri glavna argumenta da ti ćeš proći na fopen. Tko mi može dati ta tri? Tko mi može dati jedan od njih? Da. STUDENT 4: naziv datoteke? JASON Hirschhorna: Žao mi je. Tri glavne argumente možete proći kao drugi argument da fopen. U pravu si - ime datoteke je prvi argument. No, drugi argument da su fopen uglavnom tri žice, i - da. Aleja. ALEJA: za dodati. JASON Hirschhorna: ako želite dodajte u datoteku koja već postoji. STUDENTSKA 5: R za čitanje. JASON Hirschhorna: R, ako želite pročitati iz datoteke. STUDENTSKA 6: W za pisanje. JASON Hirschhorna: I w, ako želim pisati u datoteku. Dakle, u ovom slučaju, pišemo u datoteku, tako da imamo w. Možete ga otvoriti, te isto tako morati spasiti datoteku negdje, i da je s Kod na lijevoj strani operator pridruživanja - Ja sam stvaranje pokazivač na datoteku zove, u ovom slučaju, datoteke. Nećemo se brinuti što to sve kape SLIKA stvar. Dovoljno je reći, to je dugi tok jedinica i nula. A to je kako ćemo to rade i razumijem ga. Sljedeća stvar koju trebate učiniti - a ovo je nevjerojatno važno - svaki put kad otvorite datoteku - Zapravo, svaki put kad kontaktirate malloc, za Na primjer, i dobiti neke memorije i pokušati i spremiti ga u pokazivač, uvijek želite provjeriti kako bi bili sigurni da je ta Funkcija nisu vratili null. Dakle, u ovom slučaju, mi smo provjeru napraviti sigurni da smo zapravo otvorio podnijeti ispravno, a tu je pogreška u našem programu. Zatim, nakon što smo provjeriti kako bi bili sigurni da imamo radnu datoteku, možemo pisati ili čitati iz, ili dodati u datoteku. U ovom slučaju, ja sam jednostavno ispis jedan redak na ovu sliku. Kako ću znati da? Pa, ja sam koristeći ovu funkciju zove fprintf. Sve funkcije koje će se koristiti prilikom snimanja, ili čitanje iz, ili manipulira datoteke će biti sličan Funkcije koje ste vidjeli prije, ali početi sa slovom F, stoji za datoteku. I fprintf, za razliku od našeg normalnog tiska app, traje jedan dodatni argument, i da je datoteka u kojoj ste želite ispisati ovu liniju. Nemam ništa za Pravo ohai. Nemam treći Argument za printf - ili drugi argument za printf, Treći argument da fprintf, jer sam Nemam ja rezerviranih mjesta ovdje. Neću uključujući sve varijable. Ali opet, fprintf i sve ove datoteke Funkcije koje rade s datotekama općenito će morati datoteku na kojem oni djeluju. Konačno, posljednja važna stvar za učiniti je zatvoriti datoteku, baš kao i s - kad god smo malloc nešto, želimo nešto besplatno, ne bismo imaju otjecanje memorije - želimo zatvoriti našu datoteku. Ako ovaj program je izašao bez zatvaranja datoteka, izgledi su ništa ne bi ići u redu, pogotovo ako je to je mala datoteka. No, to je svakako dobra stila i praksa da se uvijek zatvoriti datoteku kad ste gotovi. Tako da je osnove datoteci I / O. Vjerojatno ste vidjeli da je prije, ili ga gledao u toj fantastičnoj Short. Da li itko ima bilo kakvih pitanja, prije idemo u neke prakse kodiranje probleme o datoteci I / O ili koraka sam samo otišao? [PREPISIVANJE ZVUČI] JASON Hirschhorna: Dali Imam pitanje, avi? AVI: Ne. JASON Hirschhorna: OK. Ja ću čekati još sedam sekundi. [Smijeh] To je jako dobar savjet. Vi dečki jednostavno ne vole postavljati pitanja. To je u redu. OK. Dakle, naš prvi praksa je problem, mi smo će udvostručiti funkciju alat naredbenog retka koji vjerojatno koristiti prije - primjerak - alat za kopiranje. Ako ste tip CP i onda to prođe dva Argumenti u svoj terminal, možete kopirati datoteku. I to je ono što mi se događa pisati upravo sada. Pa opet, iščitavanja ovog slajda, ja bih što napisati program koji traje dva i samo dva naredbenog retka argumenti - izvorna datoteka i odredišna datoteka - i kopira sadržaj izvora podnijeti na odredište datoteke jedan bajt odjednom. Dakle, to je puno za tražiti. Opet, dobar pristup za to je da Ne ide ravno u C kod, ali to break down u nekoliko koraka. Prvo, razmislite o logici - točno ono što ja tražim da učinite - i razumjeti sve koraci prema tom problemu. Ne u C, samo u nekom pseudocode, ili čak i mentalni model što se događa. Zatim, nakon što su pseudocode dolje, shvatiti kako pseudocode Karte na alate i stvari koje smo naučili koristiti u C. I na kraju, nakon što su sve to zajedno, možete kodirati problem. Uzmi 5 do 10 minuta da raditi na ovom problemu. Ja ću staviti upute vratio se u sekundi. A onda ćemo ići preko pseudocode, a kod to živjeti kao grupa. Ako imate bilo kakvih pitanja, dok ste raditi na tome, slobodno podizanje tvoja ruka, i ja ću doći okolo i odgovoriti na njih. STUDENTSKA 7: Mogu li swipe komad papira? JASON Hirschhorna: Što je bilo? [PREPISIVANJE ZVUČI] JASON Hirschhorna: OK. Idemo preko pseudocode prvi, a onda ću vam dati par više minuta do kraja kodiranja. Tko bi htio da me počnete s prve crte pseudocode za tu funkciju? STUDENTSKA 8: Provjerite kako bi bili sigurni da je što su dobili dvije datoteke. JASON Hirschhorna: OK. A ako nismo? STUDENTSKA 8: Ja bih se vratiti 0.. JASON Hirschhorna: Trebamo se vratiti na 0? STUDENTSKA 8: Povratak - zatamnjenja. Oprostite. JASON Hirschhorna: Da. Vjerojatno ne 0. Budući da 0 znači sve je bilo dobro. OK. Dakle, to je prva linija od pseudocode. Tko ima drugu liniju pseudocode? STUDENTSKA 9: Otvorena su i slika? JASON Hirschhorna: Otvorite obje datoteke. OK? STUDENTSKA 10: Provjerite ako je datoteka NULL? JASON Hirschhorna: Provjerite kako bi Sigurno nisi ni NULL. Kao na stranu - Slash 0 - to je NULL? STUDENTSKA 11: Ne JASON Hirschhorna: To nije NULL. To se zove NULL terminator. To je zapravo napisane sa samo jednim l. Pa ček nešto protiv toga - to je zapravo lik - pa ček nešto protiv da se nije isto što i provjere da li je jednaka NULL. I neki ljudi - na svojim kvizovima i njihov problem setovi - imaju dvije od onih zbunjeni. No, dvije od onih koji su u stvari drugačije. Jedan završava niz - jedan je kazaljka na 0. STUDENTSKA 12: Zašto se ne bi li provjerili da bi bili sigurni da datoteke nisu NULL Prije nego li ih otvoriti? JASON Hirschhorna: Dakle otvoreno štedi nešto u toj datoteci. I ako se vrati ovdje - tako da je ovo linija - fopen - će vam dati adresu i trgovinu da je adresa u datoteci ako se to radi. Ako to ne radi, to će pohraniti NULL - STUDENTSKA 12: Oh. OK. Jesam te. JASON Hirschhorna: U datoteci. Tako da se ne može provjeriti NULL Prije nego što ste ih otvorili. NULL znači nešto što nije učinio ispravno raditi. OK. Dakle, provjerite je li niti je? Ili? Što mi mislimo? Ići ćemo s tim. STUDENTSKA 13: Je. JASON Hirschhorna: Je li? Niti je? STUDENTSKA 13: Je. JASON Hirschhorna: OK. Čini se da su neki konsenzus o tome. Niti je NULL. OK, sljedeća linija pseudocode. Tko mi nije dao liniju još? Mi ćemo čekati. Da. STUDENTSKA 14: Morate pročitati od prve datoteke? JASON Hirschhorna: OK. STUDENTSKA 14: Ili ćemo koristiti fscanf ili nešto kao da je prvi datoteku? JASON Hirschhorna: Dakle, želimo čitati od prve datoteke i - neka je stavi da su upravo ovdje. Posjeta iz izvorne datoteke. A onda, što ćemo učiniti nakon što smo čitati iz izvorne datoteke? Netko drugi? STUDENTSKA 15: Write u odredište varalica? JASON Hirschhorna: Mi pisati odredište varalica, i - OK. Što još nedostaje? Netko drugi tko mi nije dao linija koda, ali - od pseudocode. Da. STUDENTSKA 16: Možda uvijek možete provjeriti da li postoji nešto čitati, kao sljedeći linije? To su kao novi redak vidjeti ako ona postoji. [ELECTRONIC BEEP] JASON Hirschhorna: Ups. To je moj journaling softver. Da? STUDENTSKA 16: Da. JASON Hirschhorna: Pa daju to mi se još jednom. STUDENTSKA 16: Provjerite da li postoji još sljedeća linija iz izvorna datoteka za čitanje. JASON Hirschhorna: OK. Dakle, mi ne čitaš linije - su čitanje bajtova ovdje - ali ti si točna. Želimo čitati i pisati dok nema više bajtova. OK. I tako to treba stvarno biti razvedena malo, jer oni su tamo ispod. Zar ne? Dok smo iz bajtova, idemo u čitati iz izvorne datoteke i pisati na odredište datoteke. A onda, što je zadnji put Linija pseudocode? Netko tko nije dao mi nešto još. STUDENTSKA 17: Zatvaranje datoteke? JASON Hirschhorna: Točno. Zatvaranje datoteke. Dakle, tu je naš pseudocode. Ja ću staviti pseudocode u gedit, a za par minuta smo će kodirati to zajedno. OK. Neka nam započnete kao skupina. Nishant, imam svoju novu datoteku. Upravo sam otvorio ovaj gore. Untitled Document 1. Što je prvo što mi je činiti? Nishant: Uključi knjižnice? JASON Hirschhorna: OK. Što knjižnice? Nishant: Stdio.h, stdlib.h, vjerujem? JASON Hirschhorna: OK. Što je stdlib za? Nishant: Zaboravio sam. JASON Hirschhorna: OK. Tako su stdio. Što sam trebao učiniti još prije Ja početi kodiranja? Nishant: Napišite zaglavlje? JASON Hirschhorna: Kako ja bi to boje? [ubačenih GLASOVI] Nishant: Kako ste ga dobili u boji? JASON Hirschhorna: Kako ja Boja kodiranje? Nishant: Ne znam. Oh. Spremi. JASON Hirschhorna: Spremi. Da. I treba ga spremiti kao. C. Tako ga spremiti na desktop kao cp.c. Sweet. A ako želim dobiti punu stil poena, što bih su na vrhu? Nishant: Možete napisati svoje ime i prezime, ime programa, te u svrhu programa, kao i? JASON Hirschhorna: Izgleda dobro. Izvrsno. Dakle, što ste nas započela savršeno. # Include - ćemo također pisati - OK. Dakle, mislim da sam sve skupa ići. Tko ima prvu liniju koda za mene - ili su prva linija kod koje bit će potrebno zadovoljiti naš prvi komentirati pseudocode? Vi. STUDENTSKA 18: Ne bi bilo int argc, a zatim char * argv? JASON Hirschhorna: Mislim u pravu si. Promijenimo to int main, otvorena zagrada, int argc, zarez, char * argv? Kao da je? STUDENTSKA 18: Nosači. JASON Hirschhorna: Nosači. Otvorena zagrada, u neposrednoj blizini zagrada, blizu roditelja. Savršeno. Sada mogu uzeti argumente naredbenog retka. OK. Osigurati ćemo dati dvije datoteke. Vi mi možete dati da je kao dobro. STUDENTSKA 18: Ako argc - ovo ne jednaka 3. JASON Hirschhorna: Ako otvorenih zagrada argc ne jednaka 3? STUDENTSKA 18: Da, vraćate 1 ili ništa. JASON Hirschhorna: Žao mi je. STUDENTSKA 18: Povratak 1 ili ništa. JASON Hirschhorna: Povratak jedan. OK? Velika. Otvorite obje datoteke. Tko će mi pomoći otvoriti obje datoteke? Tko mi nije dao kod još uvijek? Kurt? KURT: Pa svi kape F-I-L-E izvor zvijezda. JASON Hirschhorna: Idem izvaditi vokala. Oni su super. To je kao Tumblr. STUDENTSKA 18: Jednako fopen - JASON Hirschhorna: Jednako fopen? STUDENTSKA 18: Otvorene zagrada, argv, otvorena zagrada. JASON Hirschhorna: Čekaj. Oprostite. Otvorena zagrada. OK. STUDENTSKA 18: Da. Argv sub 1. JASON Hirschhorna: Sub 1? STUDENTSKA 18: Da. Argv otvorena zagrada 1 - Da. A onda zarez, a zatim otvorena bračna citat, r, dvostruki navodnici, bliski zagrada, zarez. JASON Hirschhorna: Sweet. A što je s drugim? STUDENTSKA 18: Vrlo slična, ali umjesto S-R-C, što bi to nazvao D-S-T. JASON Hirschhorna: Oo! To mi se sviđa. STUDENTSKA 18: Samo D-S-T. Da. A onda argv, otvoreno nosač, dva. Da. I onda w umjesto r. Da. JASON Hirschhorna: Velika. Sljedeća par redaka. Također, ako netko ima stvari koje treba dodati linije koje smo učinili, slobodno dodajte i njih. Provjerite kako bi bili sigurni niti je NULL. Tko mi može dati kod trebam zadovoljiti tu liniju pseudocode? Archer. Strijelac: Ako src jednako dosegne NULL ili DST jednako dosegne NULL, onda ste se vratili - JASON Hirschhorna: Što? Strijelac: Povratak dva? JASON Hirschhorna: Povratak dva. Dakle, ako je otvoren zagr src jednaka jednaka NULL, ili - što god da thing's - lulu? Pipe? Mi ćemo ga nazvati cijevi. Cijevi, cijevi, DST jednako dosegne NULL, vratiti dva. OK? Dok smo iz bajtova - mi vrsta preskočili ovaj korak od pseudocode dio da će ovdje. No, dok smo iz bajtova - Što vam to zvuči? Koji tip C strukture - ali ja se ne koriste riječi strukturu, zato jer ćemo početi koristiti da se u drugim slučajevima - ali C alat vam to zvuči? STUDENTSKA 19: loop. JASON Hirschhorna: loop. Zvuči kao petlju. Dakle, tko mi može dati prvu liniju od petlje kod ovdje? Također možete odabrati kakvu loop želite, ako mi date ova linija koda. Postoje tri vrste. Ti biraš. Predložio bih jedan od tih. Avi. Koji ti želiš? AVI: ZA. JASON Hirschhorna: ZA. AVI: int i jednak nuli. JASON Hirschhorna: OK. AVI: Ovaj dio nisam sigurna. Ali ja manja od veličine od izvora zvijezda? Ja nisam siguran u to. JASON Hirschhorna: OK. AVI: Zato što želite veličina datoteke, zar ne? JASON Hirschhorna: Dakle, to vjerojatno neće nam veličinu stvarni podnijeti u bajtove. Dakle, što smo drugo mogli učiniti? Ono što je još jedna vrsta petlje? Ili bi se trebali držati s for petlje? STUDENTSKA 20: Možete li napraviti while petlja? A onda, što bi učinio je you'd - jer imamo char * za datoteku. Dakle, ako ćemo samo zadržati povećavanjem da dok ćemo naći NULL znak po kraj njega? Ili ne, jest da nije kako slika raditi? JASON Hirschhorna: Pa možemo zadržati povećavanjem char * dok ne nađemo nul - STUDENTSKA 20: U osnovi zadržati ide slovo po slovo dok se ostvario kraj datoteke. JASON Hirschhorna: Da. Dakle, to je ono što želimo učiniti. Želimo zadržati čitanje, karakter po karakteru, dok ne dođemo do kraj datoteke. STUDENTSKA 20: Da. Traži - što je kraj ili znak stop na kraju tekstualnu datoteku. JASON Hirschhorna: OK. Dakle, kada smo dobili na kraju datoteke - Kako ćemo znati da smo postigli završetak datoteke? Ako zovem - pa neka je korak natrag. Što je funkcija? Idemo na ovoj liniji ovdje. Posjeta iz izvorne datoteke. Tko mi može dati tu liniju koda? STUDENTSKA 21: fscanf? JASON Hirschhorna: fscanf. OK. Što ako želim čitati, vrlo Naime, jedan bajt? STUDENTSKA 21: Ne znam. JASON Hirschhorna: OK. Čak i jednostavnije nego fscanf - što je - Želim čitati iz izvorne datoteke? Čitati iz izvorne datoteke. Što je funkcija - da. STUDENTSKA 22: To je fread? JASON Hirschhorna: Fread. Mislim da ćemo staviti s da je jedan za sada. Kakav argumenata ne fread potrajati? STUDENTSKA 22: Vjerojatno tip datoteke, a zatim mjesto u datoteci? JASON Hirschhorna: Što mogu upisati ovdje shvatiti što tip argumenata fread traje? VIŠE STUDENTI: Čovjek fread. JASON Hirschhorna: Čovjek fread i fwrite. Izgleda da su se družiti zajedno. Dakle fread traje koliko argumente? STUDENTSKA 23: Četiri. JASON Hirschhorna: Potrebno Četiri argumenti. Potrebno je pokazivač, veličinu, i da stvar, što je čudno, a neki file. OK? Idemo pročitati o tome ovdje. "Funkcija fread čita n memb elementi podataka, svaka veličina bajta dugo, od potoka na koji pokazuje potok, da ih pohranite na mjestu dao pokazivač. " Dakle, četiri argumenti. Zašto ne bih samo kopirati ovaj, i zalijepite ga ovdje. OK. Pa tko može započeti ispunjavanjem ti argumenti za mene? Avi. AVI: Izvadite prazninu. Stavite samo src. Izvadite pokazivač i zvijezdu. Put src. Onda - JASON Hirschhorna: Pa ću prestati što postoji, jer to je netočno. U pravu si s src, ali gdje src trebao ići? [ubačenih GLASOVI] JASON Hirschhorna: To bi trebalo idu ovamo. To je src - naša src je tipa. Idemo pogledati ovdje. To je molba za vrstu datoteke *, mi zapravo ih najčešće vide kao što je to. Dakle, ovo je molba za argumentom tip datoteke * zove potok koji je src. OK? Koja veličina stvari učiniti želimo čitati? Dao sam to u Opis problema. STUDENTSKA 24: Jedan bajt u isto vrijeme. JASON Hirschhorna: Jedan bajt. Kolika je bajt? Njegova veličina je u bajtove, pa što mogu staviti tamo? STUDENTSKA 25: Jedna. JASON Hirschhorna: Jedan. Točno. Njegova veličina je u jedinici bajtu, pa 1 je 1 bajt. Koliko ih želim pročitati na vrijeme. STUDENTSKA 26: Jedan? JASON Hirschhorna: Jedna stvar. Želim čitati jednu stvar o veličini 1, jedan ugriz na vrijeme. A gdje sam ga stavio, nakon što sam ga pročitao? STUDENTSKA 27: Odredište? JASON Hirschhorna: Pa ja ne mogu staviti to ravno u okolici. STUDENTSKA 28: Ti ćeš staviti je u trećoj pointer? STUDENTSKA 27: do odredišta. JASON Hirschhorna: OK. Da. STUDENTSKA 29: Možete izjaviti nešto za djelovati kao privremeno skladištenje i ranije. JASON Hirschhorna: OK. Daj mi to. STUDENTSKA 29: Još jedna datoteka pointer, možda? JASON Hirschhorna: OK. Dakle, ovo je ništavan zvijezda - to je tipa void zvijezda, tako da ne moraju biti file pointer. A ako čitam jedan bajt, gdje će biti dobro mjesto pohraniti jedan bajt? STUDENTSKA 29: Niz? JASON Hirschhorna: polje. OK. I što je još nešto što je Samo je jedna veličina bajta? STUDENTSKA 30: char *? STUDENTSKA 29: Da. JASON Hirschhorna: char * nije jedan bajt. STUDENTSKA 29: char. JASON Hirschhorna: char je jedan bajt. Zar ne? Tako ćemo nazvati ovu tampon je generički naziv se koristi za takve stvari za pohranu nešto privremeno. Tako sam stvoriti tampon. Zar ne? No, to ne uzeti prazninu *. Dakle, možda ste u pravu, da je trebao biti veličine 0 pufer. Dakle, ona sprema jedan - u pravu. Budući da je ovaj ovdje - char tampon je lik, ali to traje prazninu * - pointer. Tako sam mogao to učiniti i sada tampon je pointer. Što sam drugo mogao učiniti? STUDENTSKA 31: Stavite jednu zvjezdicu pored char. JASON Hirschhorna: Mogao bih stvorili su to char *. OK. Ono što je još jedna stvar koju sam mogao napraviti? Ili idemo s ovom jednom. Char * tampon, pa što da stavim ovdje u? STUDENTSKA 31: Buffer. JASON Hirschhorna: Buffer. Buffer je pointer na char. I na tom mjestu, mi smo stavljajući jedan bajt nešto smo čitali. Da. Avi. AVI: Samo brzo pitanje. Želite li malloc tampon? JASON Hirschhorna: Tko može odgovoriti na to pitanje? STUDENTSKA 32: Pa, to zapravo nije točka za bilo što u ovom trenutku, tako da - JASON Hirschhorna: Ali učiniti želimo ga malloc? STUDENTSKA 32: Ako ste bili na to da je način, valjda, da, zato što bi potrebno neko mjesto za to ukazati. JASON Hirschhorna: Dali smo moraju ga malloc? STUDENTSKA 33: Ako idete koristite ga izvan petlje. JASON Hirschhorna: Hoćemo li koristite ga izvan petlje? STUDENTSKA 34: Da. STUDENTSKA 35: Čekaj. Želimo ga proglasiti u petlji na svijetu? JASON Hirschhorna: Pa mislim da imamo neki pseudo WHILE petlje ovdje da smo Pokušavam shvatiti, da nismo došli do još. Ne trebamo ga malloc. Mi smo s radom u glavno, to je samo ide da se koristi u ovoj petlji. To ne treba postojati izvan toga. Dakle, to može biti lokalna varijabla. Imate pokazivač područna promjenljiva. STUDENTSKA 36: Ali to nije ukazujući na sve. JASON Hirschhorna: Ne, to nije inicijaliziran na bilo što. No, nećemo ga koristiti također. Mi ćemo staviti nešto u je prvi put da smo ga koristiti. Tako da se čini u redu. Dakle, mi ne trebamo malloc ovdje. I mislim da je u redu što je. OK. Imamo fread liniju. Učinimo slijedeću liniju. Ako želimo pisati u datoteku, što je Dobar funkcija koristiti za to? STUDENTSKA 37: Fwrite? STUDENTSKA 38: fprintf? JASON Hirschhorna: fprintf je jedan. Ono što je još jedan? STUDENTSKA 39: Fwrite. JASON Hirschhorna: Fwrite. A za naše potrebe, fwrite, što smo vidjeli ovdje, je vjerojatno bolji izbor. To traje četiri argumenta kao dobro. Nishant, možete li dati mene su argumenti? Nishant: Prvi će da se samo tampon. JASON Hirschhorna: OK. Nishant: drugi je samo će biti 1. Treći će biti 1. A četvrti će biti DST. JASON Hirschhorna: Ima li netko Imate li pitanja o toj liniji? To izgleda dobro. OK. Dakle, sada to izgleda kao jedna stvar mi smo nedostaje - zapravo, idemo pisati ovo zadnje linije. Zatvaranje datoteke. Tko nas može završiti pisanje ove zadnje dvije linije? Da. Žao nam je, kako se zoveš? LUCY: Lucy. JASON Hirschhorna: Lucy. LUCY: Fclose src a zatim fclose odredište. JASON Hirschhorna: Fclose, otvorena zagrada, src, bliski zagrada, zarez. I fclose - Je li? LUCY: Otvorena zagrade, DST a zatim zarezom. JASON Hirschhorna: Velika. A što sam trebao uključiti na kraju? LUCY: Vrati 0. JASON Hirschhorna: Vrati 0. Moram li? Samo je pitanje. Moramo li se uključiti povratak 0? VIŠE STUDENTI: Ne. JASON Hirschhorna: Ne. Glavni to radi automatski ako bi se na kraju. No, mislim da je lijepo su ga eksplicitno. Pogotovo kad smo se vraćamo drugi stvari kroz program. OK. To je ono što mi nedostaje - DOK što? Tko može sjetiti neke - ima neki smisao onoga što se stvari mogao ići tamo? Čak i ako je to samo u nekim pseudocode kao i jeziku? Ono što smo stvarno - što Ne želimo ići do? Da, Lucy. LUCY: kraj datoteke. JASON Hirschhorna: kraj datoteke. Pa što misliš kraju datoteke? LUCY: Kada dođete kraj datoteke, zaustaviti. JASON Hirschhorna: OK. Dakle, nakon što smo do kraja datoteke. Kako znamo kada smo postigli kraj datoteke? STUDENTSKA 40: Mislim da tampon će biti postavljena na NULL. STUDENTSKA 41: Buffer je proglasio unutar petlje. JASON Hirschhorna: Pa što mislite tampon će biti postavljen na NULL. Zašto bi tampon biti postavljena na nulu? STUDENTSKA 40: Jer kada fread, pokušavate staviti ništa u tampon. JASON Hirschhorna: OK. Pa si razmišljam fread - kad smo došli do kraja datoteka, što je fread će učiniti? Mislim da je to pitanje moramo shvatiti. Što fread učiniti? Da li to staviti NULL u tampon, ili to učiniti nešto drugo? Kako možemo shvatiti što to znači? STUDENTSKA 42: Čovjek. JASON Hirschhorna: Man. Pa pogledajmo ovamo. Povratak vrijednost. Na uspjeh, fread i fwrite vratiti broj predmeta ili sati. Taj broj jednak je broju bajtova prenositi samo kada je veličina 1. Ukoliko dođe do pogreške, ili kraj datoteka je postignut, povratna vrijednost je Ukratko računati stavka ili 0. Dakle, za naše potrebe, ako fread doseže kraj datoteke, a čita iz kraj datoteke, nema ništa lijevo čitati, što se to događa da se vrate? STUDENTSKA 43: Nula? JASON Hirschhorna: Što? STUDENTSKA 43: Nula? JASON Hirschhorna: Zero. To će se vratiti na nulu. Dakle, mi znamo da je fread, kad smo do kraja datoteke, ide Za povratak na nulu. Kako možemo iskoristiti da u našu korist? AVI: Možete proglasiti varijablu izvan petlje zove provjera. Ako provjera jednako - za sada - jedan. JASON Hirschhorna: OK. AVI: A onda možete staviti IF izjavu odmah nakon fread govoreći, ako fread jednaka nuli - br. JASON Hirschhorna: Tko može pomoći Avi out? AVI: Koja je vrijednost vratio fread? JASON Hirschhorna: Upravo smo otišao preko toga. AVI: Kako vam se čine? JASON Hirschhorna: Dakle, ona se vraća - Idemo pogledati ovdje - to vraća size_t, što je u suštini cijeli broj. Tako da se vraća cijeli broj. A u našem slučaju, to će vratiti 1 ili 0 - 1 ako je pročitao jednu stvar - jedan bajt, i 0, ako smo došli do kraja. Dakle, ako fread - Je li? STUDENTSKA 45: A da jednostavno stavite full fread (pufer, 1, 1, src) u while petlja? JASON Hirschhorna: Pa što predlažu to se u tu? [ubačenih GLASOVI] JASON Hirschhorna: Drži se. Tako smo oslobođenje od toga. Dakle, ti si predlaganje stavljajući fread u tu? Što bi mi također premjestiti ako želite to učiniti? STUDENTSKA 45: tampon van. JASON Hirschhorna: Trebamo također premjestiti ovo ovdje. STUDENTSKA 45: Ali ne da se stalno pomaknuti prema naprijed? [ubačenih GLASOVI] JASON Hirschhorna: OK. Dakle, to je ono što Okshar predložio. Mi stvaramo naš tampon. Mi DOK fread, onda smo fwrite. Misli se na to? STUDENTSKA 46: Moje jedino pitanje je, bi to zapravo izvršiti naredbu fread? JASON Hirschhorna: Veliko pitanje. Kada ste stavljajući funkciju poziv unutar stanja, koje ne Funkcija poziva izvršiti? Vidjeli smo primjere ovo prije. Zar ne? STUDENTSKA 46: OK. Da. Dakle, on ne izvrši. JASON Hirschhorna: Vidjeli smo stvari kao što je to prije, gdje smo Funkcija poziva unutar uvjet. Da li izvršiti tu funkciju poziv? Da. Dakle, odgovor je potvrdan. Ova funkcija poziv će izvršavati. Ali opet, to je ono što želimo? Što je jedan način na koji smo mogli shvatiti je li to ono što želimo? VIŠE STUDENTI: Pokrenite ga? JASON Hirschhorna: Mogli bismo ga pokrenuti. No, prije nego što smo to učinili, što smo mogli također razlog kroz to. Ako - kažu imamo jedan bajt u našoj podnijeti, mi ćemo doći do ovdje, mi ćemo doći do tog koda. To će pokrenuti. fread će se vratiti jedan bajt i spremiti ga u tampon. A to će se ocjenjivati ​​na 1, pravo, nakon što se on vrati jedan. Dakle, dok 1. Znači li to da kod unutar while petlja će se izvršiti? STUDENTSKA 47: Da. To je istina. JASON Hirschhorna: Da. 1 je istina. Nije 0. Dakle, kod unutar ovdje će izvršavati. Dakle, mi ćemo napisati da. Mi ćemo se vratiti u to linija opet. Sada imamo - mi smo na kraju naše datoteke. Čitali smo od kraja našeg datoteke, jer smo imali samo jedan bajt u njega. Fread vraća 0, trgovina nešto u spremniku. Ja iskreno ne znam što pohranjuje u spremniku. Vjerojatno bismo mogli gledati da vidim što se to dogodi. To ja iskreno ne znam. Mi ne znamo, koga briga što pohranjuje u tampon? No, to ne vraća 0.. I da će, dok 0 izvršiti? DOK 0 neće izvršavati. Pa onda ćemo preseliti ovamo. Tako ćemo dobiti dizanjem ruku ako je to je kod trebamo raditi, ili ako smo treba napraviti promjene na prvom mjestu. Dakle, ako mislite - morate glasati. Ako mislite da bismo trebali pokrenuti ovaj kod kao što je, molim neka digne ruku. OK. Postoji jedan - da li vi imate pitanje, zabrinutost? Da. STUDENTSKA 48: Nakon što smo preseliti tampon izvan petlje, mi moraju ga malloc? JASON Hirschhorna: Veliko pitanje. Nakon što smo preseliti tampon izvan petlje, moramo ga malloc? To je opseg pitanje. Ako ćemo započeti tampon izvan ove petlje, hoće li postojati unutar petlje? VIŠE STUDENTI: Da. JASON Hirschhorna: Da. Njegov opseg pokriva unutar petlje, i, zapravo, ništa ispod ga iznutra ovog zakona, uključujući stvari unutar ovdje. Dakle, ne treba nam to malloc. To je lokalna promjenjiva, a njezin opseg Još uvijek uključuje petlje. STUDENTSKA 49: Trebamo li ga osloboditi? JASON Hirschhorna: Dali smo trebaju slobodne tampon? STUDENTSKA 49: Da, ako mi ne malloc. JASON Hirschhorna: Dali smo trebaju slobodne tampon? Mi ne. Opet, to je lokalna varijabla, tako da mi ne treba ga osloboditi. OK. Da vidimo što će se dogoditi. Tako da je Nepoznati. To je ono nešto što Marcus je predložio ranije. Dakle, imamo tu pogrešku, varijabilni tampon Nepoznati je kada se ovdje koristi. Kako možemo popraviti? STUDENTSKA 50: malloc to? STUDENTSKA 51: Jednako NULL? STUDENTSKA 52: Recite tampon jednako NULL. JASON Hirschhorna: OK. Izgleda dobro. Mi ga imamo sada. Idemo napraviti nešto pokušati kopirati. Dakle, mi imamo tekstualnu datoteku. Kako možemo pokrenuti ovaj program? Da. STUDENTSKA 53: Možete napraviti točku slash SP, test.txt. A onda možete odrediti drugu datoteku koje će pohraniti u. JASON Hirschhorna: OK. Mi ćemo ga nazvati out.txt. Cool? Seg fault. Misli na krivu segmentu? To je super. Kako možemo saznati gdje kriv seg je? Što? STUDENTSKA 54: GDB. JASON Hirschhorna: GDB. Mi smo mali gdb pisanjem gdb dot crtu, Naziv našeg programa. Nema argumenata naredbenog retka tamo. Mi ćemo postaviti Prijelomna točka na glavni. Ako želim pokrenuti gdb, što da radim? STUDENTSKA 55: R. JASON Hirschhorna: R. I što onda? STUDENTSKA 55: Argumenti? JASON Hirschhorna: Onda naredbenog retka argumente. Idemo prošetati. N samo mi uzimanje redak po redak. Ja ću ići do Ja dobiti moj SEG kvar. Tu je moj seg fault. Izgleda fread uzrokovana moja seg fault. Znam fread uzrokovalo moje SEG kvar, jer je to bio linija smo upravo pogubljen. I jedina stvar koja je događa u toj liniji - Dvije stvari koje su se događale. Fread se događa, a onda smo bili radi neke provjere, dok. Ja sam spreman kladiti da DOK ček nije uzrok mog SEG kvar. Najvjerojatnije, fread bio uzrok moje SEG kvar. Vidim nešto ovdje, memcopy. Memorija kopija. Zvuči kao da se kreće uspomenu iz jednog mjesta na drugo. Zvuči kao nešto što će se dogoditi u fread, možda neki memorije kreće odavde do ovdje. Idemo kroz to opet. Kako ga mogu početi ispočetka i pokrenite ga ponovno? Da. STUDENTSKA 56: Da li je potrebno staviti znak za struju prije tampon? JASON Hirschhorna: Dakle Ampersand prije tampon će mi dati adresu pufer, koji je char *. Trčimo kroz ovo još jednom. Kako pokrenuti kroz to još jednom? STUDENTSKA 57: Može li samo ponovno upisati trčati? JASON Hirschhorna: Samo opet upisati vožnji. Dakle, mi se ne ide na izvršiti ovu liniju. Dakle, tampon je NULL pokazivač. Ispravite? To pokazuje da se - da vidimo. Ako mi imamo - povući brzu sliku o tome. Može li svatko Pišem ovamo? Tako je u dimnjaku, imamo lokalne promjenjiva i to se zove buffer, a to je pointer na char. Što adresa je ovo char u? STUDENTSKA 58: 0x0. JASON Hirschhorna: Točno. To je ono što je to. U ovdje, unutar tampon, pohranjen 0x0. To je ono što imamo - Postavljanje imamo upravo sada. Dakle, ova linija, fread, stavlja nešto iz izvora gdje? U ovoj kutiji ili ovoj kutiji? Koji box? Lijevi okvir ili desni okvir? Ovo pravo kutija. Slijedi pokazivač, i stavlja ga ovdje. Kada smo probati i dodir memorije na položaj 0, što smo dobili? Segmentacije kriv. To je pogreška imamo upravo sada. Da. STUDENTSKA 59: Ne morate staviti tampon zvijezda? Ili ne? Za fread? JASON Hirschhorna: Pa fread Potrebno je pokazivač. Dakle, to prolazi u tampon. I onda ćemo de-referenca to negdje unutar fread. Ali opet, što smo vidjeli, to traje pokazivač. Ne treba nam da se prođe zvijezdu tampon. To bi se prolazi to sve što je ovdje. I da, vjerojatno bi nam dati na pogrešku jer smo ga de-pozivom. Zar ne? Kad smo de-reference ovu pokazivač, kada nastojimo pristupiti ovoj lokaciji, mi smo dobivanje na pogrešku - naš segmentacije kriv. Dakle - Ups. Idemo dati otkaz iz gdb. Naša linija - naš problem - je u pravu ovdje na ovoj liniji. I to je problem, jer ove linije. Kako možemo stvoriti okvir koji je dostupan u fread. Zar ne? Moramo stvoriti okvir koji je jedan Bajt velika, veličine znakom. No, moramo da kutija biti dostupan kad je ova funkcija izvršava. Pa gdje je - Da. Bilo koji ideja? STUDENTSKA 60: Samo ga postaviti kao bilo random lik. Dovoljno je učiniti Char Buffer jednakima karakter. A onda, kad su tampon postoji - JASON Hirschhorna: Čekaj. Char tampon? Dakle, bez zvijezda? STUDENTSKA 60: Da. Izvadite zvijezdu. Jednako slučajni karakter. JASON Hirschhorna: OK. Pa daj mi jednu. STUDENTSKA 60: Kao ili nešto. I onda kada imate tampon postoji, koristite - STUDENTSKA 61: Star? Oh ne, znak za struju. STUDENTSKA 60: Koristite ampersand. JASON Hirschhorna: OK. A što je u fwrite? STUDENTSKA 60: opet koristiti ampersand. JASON Hirschhorna: U redu. Dakle, vaša ideja je, možemo stvoriti char i stavio nešto u njoj, a zatim snimati na taj char. STUDENTSKA 60: Da. JASON Hirschhorna: Što ljudi misle? STUDENTSKA 62: To je zamršena. JASON Hirschhorna: OK. Idemo ga izvući. Dakle, ovaj put, ja ću izvući to na crvena na stog ovdje, a onda smo imat će - uh! Oprostite. Dakle, ovaj put imamo nešto što se zove tampon, i to je na hrpi. Ispravite? I mi smo spas u njoj, u početku. Onda imamo poziv fread. Što fread nema se što je potrebno bajt iz naš sliku i stavlja ga negdje. To ga stavlja u god stvar je pokazujući. Pa, prije nego što smo imali ovu adresu - 0x0. Sada ono adresa imamo? STUDENTSKA 63: Što god adresa tampon. JASON Hirschhorna: Štogod adresa tampon. Vjerojatno će biti nešto slično. Vjerojatno će se početi s b i f, a zatim su šest drugima heksadecimalni znamenki. Nije važno. Neki adresa. A mi prolaze tu adresu u. I mi ćemo staviti našu jednu Bajt stvar na toj adresi. Tako ćemo staviti našu jednu Bajt stvar unutar ovdje. A onda ćemo pisati ono što je ikada ovdje unutra. Da li itko ima bilo kakvih pitanja o tome? Tko misli da je ovaj broj će raditi? Podignite ruku ako mislite taj broj će raditi. Morate uzeti stav. A tko misli da se to kod neće raditi? Podignite ruku. Svatko drugi bi trebali biti podizanje njihove ruke. OK. Michael, gdje stojite? MICHAEL: Ne mogu se odlučiti. Nekako u sredini. JASON Hirschhorna: Ti si u sredini. Izaberite jednu. MICHAEL: ja ću imati vjeru i kažu da će raditi. JASON Hirschhorna: OK. Vi ćete imati vjeru i reći to radi? Što se dogodilo? [ubačenih GLASOVI] JASON Hirschhorna: Ne seg fault. Kako možemo provjeriti je li Dvije stvari su jednaki? Dvije datoteke su jednaki. STUDENTSKA 64: Diff. JASON Hirschhorna: Diff. Diff provjerava razlikama između dvije datoteke, a ako se ne vrati ništa, oni su identični. A ako mi se otvoriti, dobili smo našu datoteku. Tako da je točna rješenja. Idemo se osvrnuti na to još jednom. Mi zapravo nije ni treba ga započeti. To će vjerojatno izgledati malo čišći, ako niste stavili nešto slučajnim tamo. Stvar se, što je potrebno za stvaranje neki prostor za pohranu nešto od fread i poduzeti nešto iz fwrite. I to je stvar morala biti ili lokalne varijabla na dimnjak - što Mogao sam malloc'd neki prostor. Tako smo zapravo mogli imati napisano malloc ovdje, i da bi radili. I onda bismo bili pohranjivanje naše stvari negdje na hrpi. No, to je zapravo, vjerojatno, najelegantnije rješenje. Dovoljno je stvoriti prostor na dimnjaku za te stvari ići. Ja bi još dva komentara. Ako ste bili da se red u to, i zatim se zabio na to, moji komentari će biti kako slijedi. To 1 je ovdje, za mene, izgleda kao magija brojeva. Ovaj 1, u smislu fread, ima smisla. To je niz stvari čitati ni pisati. Ali ova ovdje trebao vjerojatno biti nešto drugo. Dakle, što je jedno rješenje? STUDENTSKA 65: Veličina bajt. JASON Hirschhorna: Kao ovo? STUDENTSKA 65: Veličina crnila. JASON Hirschhorna: Veličina crnila. Da, bajt nije tipa. Dakle, veličina char djela. Mogli smo, na vrhu naš broj, # definirano da. Zove se nešto BYTE i to je stvarno znak. Zapravo, čak i bolji pristup Možda bi bilo to - UINT. Zna li itko što je to? Oprostite. Imam ga unatrag. Čekaj, ne. Koji put to ići? Zna li itko što je to? Da. STUDENTSKA 67: Trebala bi standardizirati preko sustava stvari koje su - kao ružan cijelih brojeva da ima 8 bajtova? JASON Hirschhorna: To je točno u pravu. Na raznim strojevima, veličina char - obično ne char. Znakova su obično jedan bajt. No, veličina ostalih tipova podataka su različite veličine na 32-bitni stroj u odnosu na 64-bitni stroj. Uint8_t je uvijek 8 bitova - uvijek jedan bajt. I trebam uključiti da standardni int zaglavlje datoteke. Pa sad, to bi vjerojatno bio Najbolji način napisati ovaj kod. Tako sam se riješiti čarobnim brojevima. A imam i logičnije tip za tampon. To nije samo char, to je bajt, što je ono što mi očekujemo da će biti. I ovdje, mi smo zapravo je malo robusniji. Nećemo ga zovete char, koji je - Možda, tko zna - mogla biti drugačija veličina na različitim strojevima. Mi zapravo reći da je to upravo jedan bajt, uvijek, bez obzira na sve. A ako pogledamo ovdje, možemo napraviti up. Uh-oh. Što se dogodilo? STUDENTSKA 68: To bi moglo biti uključen. JASON Hirschhorna: Što? STUDENTSKA 69: Je li? STUDENTSKA 70: Nisi definira ga kao vrstu. STUDENTSKA 71: ali to bi trebalo je definirano u standardu. STUDENTSKA 72: Što se dešava? STUDENTSKA 73: Treba definirati biti sve kape? JASON Hirschhorna: Dakle, to nije # definirati. Zapravo, u ovom slučaju, ja sam će se koristiti typedef. Zato smo ga koristite kao tipa na jednom mjestu. Dakle, u ovom slučaju, mi zapravo žele typedef kao da smo tiskanje novog tipa Bajt, a to je, u biti, to. To je malo drugačiji od # define. A sada, naš kod radi savršeno. Dakle, opet, # define traje nešto, zamjenjuje ga posvuda s onim drugim. To je samo makro - Skraćeno riješiti čarobnim brojevima. No, u ovom slučaju, jer smo koristite ga kao vrsta - upravo ovdje - kako bi za to da rade, trebamo da typedef god bajt je. I mi smo ga definirali ovdje. To nije struct, to je zapravo samo nepotpisani cijeli broj. To je jedan bajt dugo. Ovaj broj će biti dostupan online, a što bi svi trebali imati upravo sada. Dakle, imamo - savršena - 13 minuta napustio ići više problema postaviti pet. Želim šetati copy.c zajedno, i onda ćemo kratko govoriti O drugim dijelovima problema postaviti. Pa neka mi podići copy.c. I super je stvar, mi smo zapravo već se puno pisalo o ovom kodu. Kod smo pisali doslovno samo došao odavde kad sam bio pisanje to sam. No, to je copy.c, tvori temelj za prva dva dijela Problem postavljen za whodunit.c, koji morate napisati, a resize.c. Recover.c, što je treći i završni Dio problema skupa, nije temelji off ove datoteke. Ti ćeš morati napisati tu datoteku, dajemo vam predložak za to podnijeti, ali to nema veze veze s copy.c. Ali zato copy.c je temelj za prva dva dijela, idemo hodati kroz njega sada, tako da imate Dobar osjećaj za ono što radi. A komentari daju nešto od toga daleko. Već sam napisao nešto od toga. Prvo, mi smo pazeći dobili smo tri argumente. Dalje, mi smo prisjećajući naziv datoteke. Dakle, mi preskočila ovaj korak kada smo kodirana našu stvar - kada je naša up. Ali ovdje, oni su stvaranje je malo čišći. Oni provjeru kako bi bili sigurni obje datoteke su dobri, u Osim da ih otvara. Napisali smo sve to kod samo sada, pa sam neće boraviti na tom kodu. Sljedeća je neke stvari koje je specifično za vrste datoteka koju koristimo, koji su bitmap datoteke. Bitmap slika imaju neke metapodataka povezane s njima. Dakle, prvih par bajtova reći o spisu. Oni nisu boje piksela u toj slici. Oni vam reći o spisu. A ako ste pročitali kroz problem setu, ćete imati puno više informacija o tome što vrste metapodataka struktura su uključeni u bitmape. No, to je razlog zašto smo ovaj prvi set - ovaj kod ovdje. Mi smo čitajući metapodataka - Dva komada metapodataka - file header i info header. I provjeravamo neke dijelove na pobrinite se da je istina bitmap sliku prije nastavka. A opet, to su detalji smo Ne morate ići u sada. Ako ste pročitali kroz problem setu, shvatit ćete to. Da ne duljimo, oni samo govore, ovo je bitmap datoteka, a potvrđuje da. Dalje, pišemo onima na van datoteku. Vidimo da je ovdje. Pišemo na van pokazivač. Dalje, mi smo utvrđivanje padding. Pa opet, što je posebnost s bitmap datoteke, neke linije uključuju punjenje na kraju. A ako ste pročitali kroz problem setu, saznat ćete više o padding. To je formula pronaći padding. Važno je zapamtiti - kada promijeniti veličinu bitmap podnijeti, za nadopunu promjene. Kad promijenite veličinu podnijeti, za nadopunu promjene. On nikada neće biti veći od 3 - to će biti 0 do 3, uključivo. Ali kad promijenite veličinu nešto, nadopune promjene. Ako imam samo jedan piksel u tom redu, ja potrebna tri bajtova padding, jer svaki redak mora biti višekratnici četiri bajtova u bitmap datoteku. Ali, ako sam ga dva puta, ići od jednog piksela do dva piksela, od kojih je svaki, recimo, je bajt, onda moram Dva bajtova padding kako bi da je jednako četiri. Dakle, kada sam promijeniti veličinu nečega, Moram se promijeniti iznos padding imam. Da li to smisla svima? Zatim smo ponoviti tijekom svakog reda, ili kroz sve redove. A onda ćemo ponoviti kroz svaki stupac u svakom retku. Mi smo liječenje ove bitmap kao mreža, kao što smo tretirani odbora u 15. Kao što smo tretirani cigle kada smo ih ispisuje na zaslonu. Rešetka od redaka i stupaca. Onda - vidjeli smo to. Mi smo zapravo samo kodirani to. Stvorili smo neke privremeno skladištenje. Čitali smo tamo, a zatim mi to napisati. To je upravo ono što smo upravo učinio. Dalje, jer sam rekao svaki redak završava na neki padding, mi preskočimo tu padding - stara padding. I onda smo ponovno dodati. U ovom slučaju, mi stvaramo isto točno sliku. Samo smo ga kopirati. Dakle, ova linija je glupavo. Mogli smo doslovno samo staviti padding u. No, ako promijenite veličinu datoteke, Želite li još uvijek tu liniju? Dakle, ako ćemo promijeniti veličinu datoteke, Što nam još žele preskočiti preko stare padding? STUDENTSKA 74: Da. JASON Hirschhorna: Pa mi radimo. Jer ovaj, opet, bavi s izvorne datoteke. Nije nas briga o padding iz izvorne datoteke. Želimo ići u sljedeći redak. No, mi ne samo vratiti stari iznos padding. Moramo se vratiti Novi iznos padding. Dakle, kada smo promjenu veličine file, mi još uvijek žele preskočiti padding u starom datoteke - što mi smo čitajući u iz. No, ono što pišemo se, idemo morati vratiti neke drugačije broj padding koji smo utvrditi. Da. STUDENTSKA 75: Kako bi od ta dva linije ne smeta, zar ne? Budući da ste rukovanje različitih datoteka. JASON Hirschhorna: Točno. Redoslijed ove dvije linije nije važno. Pišemo ovu liniju. To je ovdje za datoteku pišemo se. To je važno, tako da smo dobili Pravo iznos padding. To mora baviti u datoteci. Želimo preskočiti pravo preko padding. Mi ne želimo čitati - ako smo čitajući bajt na vrijeme, mi ne brinu o tim padding bajtova. Želimo da se presele u sljedeći redak. Konačno baš kao i Lucy je dao za nas, ćemo zatvoriti datoteke i vratiti 0. Dakle, ovo je copy.c. I mi zapravo napisao - mi proveo većinu poglavlje pišem ovo, u biti. Vi napravili to. Dakle, nadam se da imate dobar osjećaj onoga što se ovdje događa. Velika razlika, iskreno, samo je ovaj prvi dio koji se bavi Specifičnosti bitmap datoteke. Tako sam kao moj sljedeći slajd, ono što trebamo učiniti? Pa, neka je razmišljati o Tko je uradio. A za nekoga tko pročitao Problem postaviti, što nam je činiti trebate učiniti u detektivski roman? Jednostavno. Aleja. ALEJA: Može li se iz dijela svakog piksela koja označava crveno. A onda - vrsta? JASON Hirschhorna: OK. Dakle uzmu dio svakog piksela koji označava crveno. To je u neposrednoj blizini, ali ne sve. STUDENTSKA 76: Pa, postoji različitih načina kako to učiniti. JASON Hirschhorna: OK. Daj mi jedan način. STUDENTSKA 76: Izvadite sve crvene, a zatim istaknuti plave i zelene. JASON Hirschhorna: OK. Dakle, s obzirom oba ta načina - to zvuči kao da smo mu dati piksela, što ima crvenu, plavu, zelenu i razinu. Želimo promijeniti relativne razine crvene, plave i zelene boje, ovisno Na tom piksela. Gdje je u ovom pravilniku trebaju mijenjamo relativna crvene, plave i zelene razine određenog piksela. Nakon što smo ga pročitali - prije nego što smo ga pisati? Daj mi broj linije. VIŠE STUDENTI: 83. JASON Hirschhorna: 83. Dakle ovdje. Za detektivski roman, kod trebate pisati svi trebali ići tamo. I to je jedino kod morate napisati. Jer, kao što smo čuli, sve što trebate učiniti je promijeniti ove relativnu plava, crvene i zelene boje iz svakog piksela. Vi ste to pročitali u, a sada ste ide to napisati. Kako mogu dobiti - ako imam tu stvar zove triple, upravo ovdje, a to je od upisati RGBTRIPLE - Pa, ako smo gledali u bmp.h, što je RGBTRIPLE? STUDENTSKA 77: To je rekonstruirati. JASON Hirschhorna: RGBTRIPLE je rekonstruirati. Vidimo da je ovdje dolje. I tako, ako sam htjela pristup, recimo, Crvena razina rekonstruirati kako ja radim pristupiti crvenu razinu ove struct? [CLASS žamor] STUDENTSKA 78: RGBTRIPLE.rgbtred? JASON Hirschhorna: Je li to točno? STUDENTSKA 79: To bi trebao biti triple dot, umjesto RGBTRIPLE točke? JASON Hirschhorna: Trostruki. Trostruki je lokalna varijabla, pa ovdje, nema pokazivače ovdje. Tako smo samo koristiti dot zapis. To će mi dati razinu crveno. Ako želim to promijeniti, samo sam postaviti je jednak za nešto drugo. Pa opet, ova linija koda pristupa ova varijabla unutar ove rekonstruirati i možemo ga postaviti na nešto novo. Tako je za detektivski roman, opet, to je, U biti, ono što trebamo napraviti. Vrlo jednostavno. Dovoljno je promijeniti neke relativne razine, a ovo je mjesto gdje to ide kod. Veličinu, s druge strane, je malo teže. Naime, promjena veličine je vjerojatno najzahtjevnijim dio ovog problema postavili. Mi imamo tri minute da ide preko njega. Ali opet, mi smo već pisali većina ovog koda, tako da smo bi trebao biti prilično upoznat. Koje su neke stvari koje želimo učiniti u stanovati, ako ste pročitali tijekom Problem postaviti? Ako mi ih dati, mi može govoriti o njima. Koje su neke stvari koje želimo učiniti? STUDENTSKA 80: Vertikalno - tako da ga morate vodoravno veličinu, ali vertikalno ga promijeniti veličinu, kao i? JASON Hirschhorna: Dakle, ako nam je dan piksela, i želimo to promijeniti veličinu po faktorom dva, što sada treba da bude mijenjati vodoravno i mijenjati vertikalno. Ima li to smisla? Da. Dakle, to je vjerojatno Najveći izazov. A mi ćemo govoriti o tome da je u tren. Da. STUDENTSKA 81: način razmišljao sam o tome je li potrebno isprintati - JASON Hirschhorna: Čekaj. Nemojte nam reći što ste učinili. Idemo razgovarati u logici. STUDENTSKA 81: OK. Koje je bilo pitanje? JASON Hirschhorna: Vi samo podigao ruku. Nije bilo pitanje. Dopustite mi da ga prezentirati. Dopustite mi samo o ovoj kratko. Tako smo jedan piksel, želimo ponoviti ga, i horizontalno i vertikalno. Tako je idealno što radimo ovdje, mi pročitati u našem piksela, mi to napisati No mnogi od puta. No, onda mi imamo trik ovdje, jer onda želimo da preskočite Sljedeći linije i napisati to na počevši od sljedeće linije. Dakle, ako želimo ponoviti i horizontalno i vertikalno, što je jedan dobar način za to - jedna dobra, iako za to? Dakle, mi ne trebamo stalno traže oko našeg datoteke staviti stvari. To pitanje ne bi mogli imati imalo smisla, ali mislim odgovoriti na to će vam pomoći. STUDENTSKA 82: Napravite niz? JASON Hirschhorna: Pa razmislimo svake datoteke kao redom. Razmislimo u smislu reda. Ako mi imamo prvi red od naše male slika, možemo napraviti taj red u velikom nizu od velike slike, a zatim ponoviti taj red međutim mnogo puta to treba replicirati, nego ide piksel po piksel, koji dobiva zbunjujuće kad bave datoteke. Jer, ako smo imali - Ja sam ponestaje prostora. Ako je ovo naša sliku, a imamo da jedan piksel postoji, a mi želimo da se stavi upravo tamo, još uvijek imamo neke stvari da je potrebno ići tamo kad smo pisanju i stvaranju naše nove datoteku - naša datoteka koja je dvostruko veći. No, to je stvarno teško s funkcije datotečnih preskočiti oko na nove linije kao što je to, a onda se vratiti ovdje i staviti stvari tamo. To je gotovo nemoguće učiniti nešto kao što je to, ako to ima smisla. Dakle, ako mislimo u smislu reda, što možemo se naš red, a zatim ga staviti - replicirati redaka vertikalno. A to je kako se nositi s promjenom veličine okomito nego vodoravno. To je vrsta brzo i malo zbunjujuće. Nažalost, naša je vrijeme isteklo. Ja ću stajati vani za one od vas ovdje koji imaju pitanja u vezi Problem set, uključujući i oporaviti. Tako ćemo odgoditi za sada. I opet, ako imate bilo kakvih pitanja, možemo razgovarati van.