JASON Hirschhorna: Dobrodošli, vsakdo, do 6. tedna. Vesel sem, da vas je vse videti živ in zdrav Po Kviz 0, ker vem, da je bil malce grobo. Ampak na srečo, ste vsi naredil neverjetno dobro. In tako, da je čudovito. Če ste v mojem oddelku, sem dal najbolj od tebe nazaj svoj kvizi že. Nekaj ​​od vas, imam sestanek po pouku. In če ste študent razširitev in niste prejeli kviz nazaj Še vaš TF je verjetno delajo na tem in razvrščanje, in da jih bodo dobili nazaj z vami kmalu. Torej moj podaljški študente, ki so gledal zdaj - upam živeti - Jaz bom dobil svoje kvizi kmalu tudi. Naša agenda za danes je, kot sledi. Najprej smo šli čez nekaj Sredstva, ki CS50 zagotavlja, da vas. Mi smo šli čez kviz 0 naslednji, in Odgovoril bom na vsa vprašanja, koga ima o posameznih problemih. In potem bomo šli čez Datoteka I / O in problem določiti 5. Ti dve zadnji teme bo up večino odseka danes. Vsak teden sem dal ta seznam, ko Opomnik za vas vse, ampak jedro oddelek, imamo le 90 minut - mi niso mogla pokriti vse, kar sem bi radi, da kritje za vas. Vendar imamo ton sredstev za vam črpati, kot boste spoznali materiala in dela preko tvoj problem postavlja. Opomin, da imam na spletu besedilo box, ustanovljenega za vas, da izpolnite, če ste kakršne koli povratne informacije zame, tako pozitivno kot konstruktivno, o oddelku. Ta URL se nahaja tukaj dol. Torej prosim, vzemite si trenutek, če imate povratne informacije, ali je v oddelku, ali po njem, ali pa po ogledu videoposnetka spletu, da mi vaše povratne informacije. Res cenim vse in vse to. Torej sem imel majhne pogovorov z veliko mojih študenti ves teden - kot sem roko nazaj kvizi, ki govori o Seveda, ko vidijo, kako delaš. In je ena tema prišel mimo in več govoriti o - v Zlasti - Problem določa. In sem zaprta to temo na krovu zdaj. V bistvu, obstaja razlika med vrtenjem v nekaj, kar je pravilno in kaj storiti da je dobro opravljeno. Večina ljudi, ki so delali fantastično v smislu pravilnosti - 5 je ali 4-je na vseh psets. Večina ljudi so dobili tiste, ves čas. Vendar samo zato, ker ste naredili Nekaj ​​pravica ne pomeni, da ste naredil nekaj tako elegantno, ali učinkovito, ali kot spreten kot vi Lahko bi to storil. In to je tisto, oblikovanje - in v manjšem obsegu, stil - osi so za. Torej, jaz sem vas vse potiskanje in druge TFS potiskajo fantje, da ne samo posledično V stvari, ki so pravilne, vendar se izkažejo v stvari, ki so kodirani dobro. Ne delaš nepotrebne ZA zank, Ne preračunu spremenljivk če je vam ni treba. Na primer, če se ozremo na problem nastaviti 4, ko je dajanje opeke na zaslon, vsaka vrstica - vsak opeke dani vrsti je enaka Y-koordinata - usklajuje isti višini. Tako da je Y-koordinata ni potrebno se izračuna v notranjosti notranjosti ugnezdene zanke for, da ste verjetno, ki se uporablja , da te opeke na zaslonu. Potrebuje samo izračuna vsak ko boste preklopili vrstico, ali pomakne navzdol vrstico. Tako pravijo, če obstajajo 10 opeke v vrstica, lahko vsaka opeka, enake y-koordinata, in da je Y-koordinata se prav lahko izračuna enkrat za vse,. To ni potrebno, da se izračuna 10 krat, prav tako pa, da je treba za izračun bi se zgodilo v dejanski klic funkcije - Novi gracked klic funkcije. Torej, če bi bil malo zmedeno za ste, bolj na splošno, stvari, ki jih Ne potrebujem, da se zgodi vsak čas greš skozi zanko ne bi smelo biti pa je v zanko, in ne bi smeli se zgodi vsakič, ko greš skozi zanko. Še en dober dizajn primer smo videli v 3 tednih za 15, lahko vodi progi ničle. Torej, ko ste inicializacijo desko, vas Prihranite - v globalne spremenljivke, morda - X in Y-koordinata nič. In potem, ko ste - V vašem premakniti funkcijo, ko naredite uspešna poteza, morate posodobiti lokacijo nič. Da bi vas rešim iz da bi morali narediti ugnezdene ZA zank odmisliti vkrcati vsakič v vašem premakniti funkcijo in našli nič, ali najti ploščice, in nato preverite, kaj je pričakovati zanj. Namesto tega imate lokacijo nič, lahko samo poglej zgoraj, spodaj, in levo in desno od tega, da bi našli ploščice, kar ste iskali. Tako v smislu programov smo pisno, oni nikoli dovolj velik da so nekateri od teh konstrukcijskih odločitev se res dogaja, da ovirajo vašo Program, ali bi bilo teči bolj počasi, ali morda celo zmanjkalo pomnilnika. Vendar smo še vedno vam kljukce pisati kot elegantno in učinkovito kodo, kot je mogoče. Torej, če vam na koncu pisati stvari da imajo bistveno večji področje, bodo napisana z dobro oblikovati poleg tega, da pravilno. Torej število imate prinesel ven. To je nekaj, kar smo iskali - nekaj, kar bomo še naprej pritisneš fante. Če ste kdaj koli vprašanja o oblikovanje vašega programa, vas prosimo, da bi dosegla za mano, in sem vesel, da sprehod skozi svoj program z vami, in poudariti nekatere zasnove odločitve, ki ste jih opravili, in vam nekaj predloge o tem, kako narediti še boljše odločitve oblikovanje. Torej bomo naprej da govorimo o Kviz 0. Preden bomo to storili, ne kdo Za vsa vprašanja o tem, kaj Do sedaj sem pokriti? [Šelestenje NOISE] JASON Hirschhorna: Sedem sekund. OK. Spregovorimo o Kviz 0 za bit. Večina od vas ima svoj kviz 0 hrbtu. Če tega ne storite, upajmo se spomnite malo. Ampak, če ste vzeli kviz 0, potem imajo tudi dostop do PDF na spletu v rešitve vzorca. Ima kdo dodatna vprašanja, skočimo v gradivih teden o Poseben problem na kvizu 0 - Zato je odgovor, kaj je to? Je kdo zmeden o čemerkoli? Tudi če imaš problem v redu, ampak samo bi rad, da mu razloži malo Še več, vesel sem, da to storite zdaj. Zato sem prosil, da vi tudi pridejo pripravljeni z nekaterimi misli o Kviz 0. Torej, ki bi radi, da nam se je začel z vprašanjem, ali pripombe o Kviz 0? [KNJIGA šelestenje] JASON Hirschhorna: Ne vsi naredil odlično. Tako da vem [smeh] da morajo biti nekatera vprašanja O Kviz 0. OK. Da. Ompica. OMPICA: Number 10. JASON Hirschhorna: Število 10. Katera je bila številka 10? OMPICA: - JASON Hirschhorna: I Se nisem - OMPICA: vključuje - JASON Hirschhorna: Število 10 je bilo osem I - pisno osem na i? OMPICA: Ja. JASON Hirschhorna: OK. Torej, še eno vprašanje, bi lahko imeli vprašal sem bil resnično daljnoviden? Odgovor je pritrdilen. V odseku pred kviz, sem vprašal vidva z Zakonikom tako Sterling in osem na i. Oba se je zgodilo pojavijo na kvizu. Torej, upam, da ste ga plačali pozornost na to. In če si imel, potem bi morali verjetno storil tudi na teh dveh. Ampak osem do i, smo dejansko ni koda je v razredu, vendar je bilo spet vprašal na kvizu. Torej nekaj stvari, da sprejmejo Upoštevajte, ko kodiranje osem na i. Prva stvar, na vprašanje, je bilo , ki ga je potrebno preveriti, če niz je bila enaka null. Nekaj ​​ljudje poskušali preveriti kasneje V programu sem bil, če je nosilec - tako poseben značaj, da Niz - je bila enaka null. Vendar ne pozabite, da je v bistvu null - je dobro razmišljati o null, kot ničelni kazalec - kazalec na ničlo - nekje v spominu, kjer nikoli ne morejo dostopati. Torej, če je nekaj enako null, si vem, da ni bil inicializiran, ali pa ni ničesar. Tako je s char zvezda, S Nosilec i je znak. Zato je smiselno, da s primerjati z null, vendar ne s nosilec i na nič. Ampak še enkrat - tako, da je prva stvar, ki da si moral storiti - preverite, da ste dejansko imaš pravo niz. Naprej, boste želeli, da gredo skozi vsak znak v nizu. In zato, da bi se kot nosilcem S i, na primer, če sem vaš iterator. In da ta znak, in se njegova dejanska vrednost. Ste ga shrani kot char, ampak ASCII vrednost za nič - nič kot znak - dejansko ni celo število nič. Je kakšno drugo številko, ki jo lahko pogledate v tabeli ASCII. Torej, eden od načinov za korekcijo, ki - verjetno najboljši način za korekcijo da - se odšteje od njega vrednost značaj - nič kot znak. Torej minus enojni narekovaj, nič, drugo enojni narekovaj. Da bo ne glede na število, ki ga imajo kot char, in dobil je enaka številko, kot je dejansko število. In da je zelo podobna metodi Veliko ljudi se je v Problem nastavite 2, s Cezarjem in Viginere - te šifre, ko smo jih vrtijo. Torej, ko ga imate kot število iz nič do devet, nato - odvisno kam gre v končni številko - morate, da jo pomnožimo z močjo 10. Nekateri ljudje preselili od zadaj za spredaj, in pomnoženo posameznika Številka z močjo 10. Nekateri ljudje preselili iz naprej-nazaj - in tako je največja zaporedne številke Prvi - in bi razen tistih iz globalna spremenljivka števec. In nato vsakič, skozi FOR zanke, pomnožite velikan globalno spremenljivko števec z 10, da bi prostor za naslednjo char. Tako da je malo zmedeno, brez me je pisanje na tablo. Ampak raztopina vzorca vam je na voljo. Vendar so bile to velike stvari smo iskali. Prav tako preverite, da je vsak individualna narava je bila res lik med nič in devet in ne kakšen drug znak, kot A, npr. Tisti, ki so bile stvari, ki smo jih iskali s tem vprašanjem. Ne da odgovoriti na vaše vprašanje? OMPICA: Ja. JASON Hirschhorna: OK. Ali obstajajo druga vprašanja O Kviz 0? Kaj pa zbiranje? Vsi sestavljanje kajne? Ne Bilo - [Smeh] Imate vprašanja Kompilacija proces? Wow. [KNJIGA šelestenje] JASON Hirschhorna: Da. Michael. MICHAEL: Je številka 7 - naključno? JASON Hirschhorna: Število 7. Številka 7 je dobil naključno celo število. Odlično. Torej boš dal celih števil a in število b, in želite naključno celo število med A in B. Mi lahko dejansko napisati tole o board, ker je to eden je bila ena vrstica kode - eden od načinov, da to storite. Tako da smo glede drand kot funkcijo lahko uporabimo. In kaj drand - ob predpostavki, da so se nasadijo - kaj drand vrne? MICHAEL: float med 0,0 in 1,0. JASON Hirschhorna: številka - ja. Število med 0 in 1. In tako smo B in. In potem imamo naključno številko med 0 in 1, ki nam jih drand. Nekateri ljudje poskušali dati B ali b minus ali nekaj v tistih, oklepaje. To bi pomenilo, da so si Argumenti za to funkcijo. drand ne sprejme nobenih argumentov - kot getString ne Ne jemljite nobenih argumentov. Torej je le odprta paren, blizu paren - in to sama, je klic funkcije. In to vam daje več med 0 in 1. Seveda pa imamo celo vrsto da je lahko število podati Reči, če je B 10 in 5, res želite več z razponom od 5 let. Torej naslednja stvar, ki jo morate storiti je, pomnožite to ga je razpon b manj a. Torej, ob predpostavki, da se pomnoži. In da nam bo dal več v določenem območju. In da je specifična čemer je območje Razlika med b manj a. In končno, da ga bom samo od - pravijo območje med b minus je 5, ki bo nam dal število od 0 do 5. Ampak, če je v resnici 5, moramo povečati to območje do kje je dejansko naj bi se z dodajanjem. Tako da dobi logični pravico. In potem, bi morali eno vprašanje? MICHAEL: Ne Počutim se prav zdaj res neumno. [Smeh] JASON Hirschhorna: Ne Ne počutim res neumno. Število ljudi, ki si prizadevale s tem vprašanjem. In potem, drugo vprašanje je, drand, ste rekli, vam plovec - vrne float. Toda ta funkcija dejansko vprašal , da se celo vrne. Vam ni treba, da odda to izrecno na celo število, ker ti Operacije jo bo obravnavala kot vse a float - kot število s plavajočo vejico. Kot je ta bo - tudi če je to je celo število, bo to pravilno pomnoži. Vse množenje bo delovala. Vam ni treba, da ga odda tukaj. Dejstvo je, da ga ne bi smeli vzeti. Da bi - če bi odda več , ki je med 0 in 1 - naključno številko, s plavajočo vejico - potem bo bodisi samo 0 ali 1, tako boste izgubili vse te natančnosti. Toda na koncu, ko se vrnete, samodejno dobi poslati nazaj kot celo število. Torej vam ni treba storiti da vlivanje sami. Torej je bil to odgovor na da je vprašanje, številka 7. Katera koli druga vprašanja o Kviz 0? Ja, Annie. Annie: Kdaj bomo uporabili rekurzivno - Kdaj bomo uporabili iterativne zanke? JASON Hirschhorna: Kdaj uporabiti rekurzivna - tako bolj na splošno, prednosti in slabosti v primerjavi z rekurzija iterativni pristop. Ali lahko kdo ponudi pro ali con? Prosim? Ne more vsakdo. Kdo vam lahko ponudi pro ali con? [KNJIGA šelestenje] ŠTUDENTSKI 1: Rekurzivno je manj kodiranje - manj tipkanje? JASON Hirschhorna: Torej na splošno, rekurzija predvsem, funkcija - ali algoritem, kot spajanje sort -, ki je zelo primerna na rekurziven pristop - bi bilo bolj enostavno, da rekurzivno kodo. In samo bolj smiselno to storiti rekurzivno. Zato, da bi Pro rekurzijska. Drugi? Ja? ŠTUDENTSKI 2: Con do rekurzije - Ki jih uporablja več pomnilnika. JASON Hirschhorna: Torej, ravno prav. Rekurzivna funkcija bo vztrajati seštevanje Sveženj okvirji za dimnika. Torej, če ste delujejo na veliko številk, in so za to imenujemo deluje veliko, potem boste zagotovo zasedejo več pomnilnika, medtem iterativni pristop bo dal le eno kup okvir na sklad, ker vse se zgodi v enem funkcijo. Kakršne koli druge prednosti in slabosti? Ja. ŠTUDENTSKI 3: Pros za rekurzije. Vam ni treba določiti v napredovanje kolikokrat je bilo treba ponoviti kode. Lahko imajo vnaprej določeno število časi, ki jih imajo za ponovitev, nato rekurzija je bolje, ker je potrebno ta rezultat. JASON Hirschhorna: Mislim, da je to res. Ampak mislim, da je v obeh primerih Nikoli ne bi - bi verjetno dobili nekaj vhod od uporabnika. Ali bi to funkcijo imajo nekaj vhod da bi določili, koliko krat mora teči. Torej na splošno, ne bi trdi kode - celo v interaktivnega pristopa - kako tolikokrat, da se zanka je treba izvesti. Ali imate še ti so bili razmišljal, Annie? OK. Torej tistih, ki so verjetno dva - Največji pro in največji con na rekurzivni proti iterativni pristop. OK. Karkoli drugega na kvizu 0? Gremo naprej. Datoteka I / O. Obstaja čudovit kratek ta teden na datoteko I / O, da, upajmo ste si ogledali mnogokratnik krat, in občudovali. Veliko dela je šel v to, in sem Slišal je noro koristno. Jaz tudi povezavo na ta diapozitiv, V primeru, da niste imeli priložnost, da jo gledajo 10-krat. Torej, bomo na kratko šel čez pomembni koraki v smeri odpiranja in delo z datotekami, potem pa se bomo potopite v problem kodiranja, preden preučuje problem niz. Torej, še enkrat, bom to dal gor na zaslon, vendar bom govoril za Samo minuto o tem, kaj smo počneš tukaj z datoteko I/O-- Kaj to pomeni? To pomeni, da lahko ustvarimo naše Programi, nato pa so naše programe izstopa, in ne bi na kakršen koli vpliv na svet zunaj našega programa. Toda, ko smo začeli delati z datotekami - tako jim branje in za ustvarjanje njih - lahko imamo nekaj vpliva na svet zunaj našega programa. Tako kot če Microsoft Word ni mogel da bi vse Wordovih dokumentov, nato pa ko Microsoft Word nehal, vse vaše delo naj bi šla, in bi bilo res je neuporabna. Nam na koncu želeli, da bi lahko pisanje programov, ki lahko vplivajo svet okoli njih, tako z vključevanjem v kompleksnih vhodi - v smislu datotek in prek datotek, in tudi ustvariti zanimivo in prepričljivi rezultati - v smislu različnih vrst datotek. Tako, da je razlog, zakaj smo začeli naučiti, kako delati z datotekami. Natančneje, kaj moramo storiti, je, kot sledi. To je zelo preprosto. Obstaja le nekaj korakov, ter Tukaj so navedeni na tem zakoniku. Tako da smo šli skozi to kodo po vrsticah. Najprej boste videli poudarjeno - ko delate z datoteko, ne glede na vrsto spisu je, ga morate odpreti. In da je s pozivom, naj fopen - tukaj. Ti vključujejo ime datoteke. Če datoteka ni v vašem telefonskem imeniku, ali mapa, v kateri je ta program življenje, potem boste morali vključiti Pot, kjer je ta datoteka. Bomo Predvidevam, da je to datoteka z imenom "text.txt" - enostavno besedilo dokumenta - je v isto mapo kot tega programa. Torej, to je že druga stvar, da v um - da, če želite odpreti datoteko nekje drugje, boste dejansko potrebujejo vključiti njeno lokacijo. Drugič, lahko prenese argument, s katerim fopen, in to je tisto, kar želite storiti z datoteko. Obstajajo tri glavne argumente, ki boš preide fopen. Kdo lahko mi ti trije? Kdo mi lahko pove eden izmed njih? Da. ŠTUDENTSKI 4: ime datoteke? JASON Hirschhorna: Žal mi je. Trije glavni argumenti, ki jih lahko prestanejo kot drugi argument za fopen. Imaš prav - ime datoteke je prvi argument. Vendar je drugi argument, da so fopen splošno tri strune in - ja. Aleja. Aleja: za dodati. JASON Hirschhorna: če želite, da dodajte v datoteko, ki že obstaja. ŠTUDENTSKI 5: R za branje. JASON Hirschhorna: R, če želijo brati iz datoteke. ŠTUDENTSKI 6: W za napisati. JASON Hirschhorna: In w, če ste želim pisati v datoteko. Torej, v tem primeru, smo pisno na datoteko, tako da imamo w. Lahko ga odprete, imate tudi za shranjevanje datoteko nekje, in da je s oznaka na levi strani Operater naloga - Jaz sem ustvarjanju kazalec na datoteko imenujemo, v tem primeru spis. Ne bomo skrbeti, kaj to vsi pokrovčki FILE stvar. Dovolj je reči, da je dolg tok ničel in enic. In to je, kako bomo to deluje in jo razumeti. Naslednja stvar, ki jo morate storiti - in To je izredno pomembno - vsakič, ko odprete datoteko - v resnici, ko boste klic malloc, za Na primer, in dobili nekaj pomnilnika in poskusite in ga shranite v kazalec, vedno želeli preveriti, da se prepričajte, da je ta Funkcija ne vrne null. Torej v tem primeru smo preverjanje, da prepričani, da smo dejansko odprli vložite pravilno, in ni bilo nobena napaka v našem programu. Naprej, ko smo preverili, da poskrbite, da da imamo delovno datoteko, ne moremo pisati ali brati iz, ali priložiti k spisu. V tem primeru sem preprosto tiskanje ena vrstica v to datoteko. Kako naj vem? No, jaz sem z uporabo te funkcije imenovano ovrednotenj. Vse funkcije, ki jih bo s pomočjo ko pisno, ali branje iz ali manipulacijo datoteke bo podobno Funkcije, ki ste jih videli prej, vendar začnejo s črko F, stoji za datoteko. In ovrednotenj, za razliko od našega normalnega tiska app, traja en dodaten argument, in to je datoteka, kjer ste želite natisniti to linijo. Nimam ničesar, da bi Pravica ohai. Nimam za tretjino Trditev, da printf - ali drugi argument, da printf, Tretji argument ovrednotenj, ker sem nimajo nobene ograde tukaj. Jaz ne vključuje nobenih spremenljivk. Ampak še enkrat, fprintf in vse te datoteke Funkcije, ki delujejo z datotekami se običajno dogaja, da potrebujemo datoteko na katerem se delajo. Končno, zadnja pomembna stvar, da storiti je, da zaprete datoteko, tako kot z - kadar koli smo malloc nekaj, želimo sprostiti kaj, da ne bi mi imajo pomnilnika - želimo zapreti svojo datoteko. Če ta program zapustil, ne da bi zapiranje Datoteka, so možnosti, nič ne gre narobe, še posebej, če je je majhna datoteka. Ampak to je zagotovo dober stil kodiranja in prakso, da vedno zaprite datoteko Ko končate, da jo uporabljajo. Tako, da je osnov datoteko I / O. Verjetno ste že opazili, da je pred ali gledal v tej fantastični kratkega stika. Ima kdo kakšno vprašanje, preden gremo v nekaj prakse kodiranja Težave, o spisu I / O ali koraki sem šel čez? [Tipkanje SOUNDS] JASON Hirschhorna: Ali vam kakšno vprašanje, Avi? AVI: Ne JASON Hirschhorna: OK. Bom počakati še en sedem sekund. [Smeh] To je res dober nasvet. Vidva ne maram spraševati. To je v redu. OK. Torej, naša prva težava praksa je, da smo gre za podvajanje funkcijo Orodje ukazne vrstice, ki jih verjetno uporablja pred - kopija - Orodje kopija. Če ste tip cp in nato mimo dveh Argumenti v vašem terminalu, lahko kopirati datoteko. In to je tisto, kar bomo napisati prav zdaj. Torej še enkrat, branje off to tobogan, sem vas, da napišete program, ki traja dva in samo dva v ukazni vrstici Argumenti - vir datoteke in ciljne datoteke - in kopije vsebini vira datoteko v ciljno datoteko en bajt naenkrat. Tako da je veliko zahtevati. Spet dober pristop k temu je ne gredo naravnost v kodi C, vendar razdeliti v nekaj korakih. Najprej pomislite na logiki - natanko kaj vas prosim, da ne - in razumeti vse koraki do tega problema. Ne v C, samo v nekaterih psevdokoda, ali celo duševno model kaj se dogaja. Naprej, ko imate psevdokoda navzdol, ugotovimo, kako psevdokoda Karte na orodjih in stvari, ki smo jih naučili uporabljati v C. In na koncu, ko boste imeli vse, kar skupaj, lahko kodo problem. Traja od 5 do 10 minut dela na tem problemu. Jaz bom dal navodila nazaj na sekundo. In potem smo šli čez psevdokoda in koda živo kot skupina. Če imate kakršnakoli vprašanja, medtem ko ste delali na tem, vas prosimo, da dvig roko, in jaz bom prišel okoli in jim odgovoriti. ŠTUDENTSKI 7: Ali lahko potegnete kos papirja? JASON Hirschhorna: Kaj se dogaja? [Tipkanje SOUNDS] JASON Hirschhorna: OK. Pojdimo nad psevdokoda prvi, in potem ti bom dal nekaj več minut do konca kodiranja. Kdo bi rad, da me začnete s prvo linijo psevdokoda za to funkcijo? ŠTUDENT 8: Prepričajte se, da ti so imeli dve datoteki. JASON Hirschhorna: OK. In če nismo? ŠTUDENT 8: Jaz bi vrnili 0. JASON Hirschhorna: Če se vrnemo 0? ŠTUDENT 8: Vrnitev - slepimi. Žal mi je. JASON Hirschhorna: Ja. Verjetno ne 0. Ker 0 pomeni, da je vse v redu. OK. Tako da je prva vrstica od psevdokoda. Kdo ima drugo linijo psevdokoda? ŠTUDENTSKI 9: Odprti sta obe datoteke? JASON Hirschhorna: Odprite obe datoteki. OK? STUDENT 10: Preverite če je datoteka NULL? JASON Hirschhorna: Preverite, Prepričajte se ne NULL. Kot prahi - slash 0 - je, da NULL? STUDENT 11: Ne JASON Hirschhorna: To ni nič. To se imenuje NULL terminator. To je pravzaprav napisane samo z enim l. Tako preverjanje kaj proti, da - to je dejansko znak - tako preverjanje nekaj proti da se ni ista kot preverja, če enaka NULL. In nekateri ljudje - na svojih kvizih in njihov problem kompleti - so dobili Dva od teh zmeden. Toda dve od teh sta dejansko različno. Ena konča niz - ena je kazalec na 0. STUDENT 12: Zakaj ne bi preverite poskrbite, da datoteke niso NULL preden jih odprete? JASON Hirschhorna: Torej open prihrani nekaj v tej datoteki. In če greš nazaj - tako da je ta linija - fopen - vam bo dala naslov in trgovino da je naslov v datoteki, če deluje. Če to ne deluje, bo shranil NULL - STUDENT 12: Oh. OK. Imam te. JASON Hirschhorna: V datoteki. Tako da ne more preveriti, NULL preden ste jih odprli. NULL pomeni nekaj, kar ni storil deluje pravilno. OK. Torej, preverite, niti ni? Ali ste? Kaj mislimo? Šli bomo s tem. STUDENT 13: Je. JASON Hirschhorna: Je? Prav tako je? STUDENT 13: Je. JASON Hirschhorna: OK. Zdi se mi, da so nekateri konsenz o tem. Niti ni NULL. OK, naslednji vrstici psevdokoda. , Ki mi je ni dal linijo? Počakali bomo za vas. Ja. STUDENT 14: Moraš prebrati od prve datoteke? JASON Hirschhorna: OK. STUDENT 14: Ali bomo uporabili fscanf ali nekaj podobnega tej prvi spis? JASON Hirschhorna: Tako želimo prebral od prve datoteke in - kaj je dal, da je tukaj. Brati iz izvorne datoteke. In potem, kaj bomo naredili, ko smo brati iz izvorne datoteke? Nekdo drug? STUDENT 15: Napišite v ciljna datoteka? JASON Hirschhorna: Pišemo ciljna datoteka, in - OK. Kaj nam manjka? Nekdo drug, ki mi ni dal vrstica kode še - od psevdokoda. Ja. STUDENT 16: Mogoče lahko vedno preverite ali je kaj prebrati, kot naslednje vrstice? Da so kot v naslednjo vrstico, vidim, če ta obstaja. [ELECTRONIC BEEP] JASON Hirschhorna: Ups. To je moj dnevniški programske opreme. Ja? STUDENT 16: Ja. JASON Hirschhorna: Torej, da to se mi še enkrat. STUDENT 16: Preverite, ali obstaja še naslednji stavek iz izvorna datoteka za branje. JASON Hirschhorna: OK. Torej ne bomo branje vrstic - Bral bajte tukaj - ampak ti si pravi. Želimo, da brati in pisati, dokler ne obstajajo več bajti. OK. In tako bi morali ti res zamaknjeno bit, ker oni so tam spodaj. Kajne? Do razprodaje bajtov, bomo brati iz izvorne datoteke in pisati v ciljni datoteki. In potem, kaj je zadnja Linija psevdokoda? Nekdo, ki ni dana me še nekaj. STUDENT 17: Zapiranje datoteke? JASON Hirschhorna: Točno tako. Zaprite datoteke. Torej je naša psevdokoda. Bom dal psevdokoda v gedit, in v nekaj minutah smo Ta kodirajo skupaj. OK. Dovolite nam, da bi začeli kot skupina. Nishant, imam novo datoteko. Pravkar sem odprla. Untitled Document 1. Kaj je prva stvar, kaj naj storim? Nishant: Vključi knjižnice? JASON Hirschhorna: OK. Kaj knjižnice? Nishant: stdio.h, stdlib.h, verjamem? JASON Hirschhorna: OK. Kaj je stdlib za? Nishant: Pozabil sem. JASON Hirschhorna: OK. Tako vključujejo stdio. Kaj naj storim, še preden I začeli pisati? Nishant: Napišite glavo? JASON Hirschhorna: Kako dobim obarvana? [interposing GLAS] Nishant: Kako si ga dobil v barvi? JASON Hirschhorna: Kako jaz barvnega kodiranja? Nishant: Ne vem. Oh. Shranite. JASON Hirschhorna: Save. Da. Moral bi ga shranite kot. C. Tako da jo shranite na namizje kot cp.c. Sladko. In če želim, da bi dobili popoln slog točk, kaj naj jaz vključujejo na vrhu? Nishant: Lahko bi napisali svoje ime, ime programa, in namen programa, kot tudi? JASON Hirschhorna: Izgleda dobro. Odlično. Torej ste nas je začelo odlično. # Include - bomo napisali tudi - OK. Zato mislim, da bom vse, da gredo. Kdo ima prvo vrstico kode za mene - ali prvih vrstic kode, ki bo trajalo, da izpolnjuje naša prva pripombe v psevdokoda? You. STUDENT 18: Ne bi bilo int argc, nato pa char * argv? JASON Hirschhorna: Mislim, imaš prav. Oglejmo spremeniti, da int main, odprte paren, int argc, vejica, char * argv? Všeč? STUDENT 18: Nosilci. JASON Hirschhorna: Nosilci. Oklepaj, zaklepaj, v bližini staršev. Popolna. Zdaj sem lahko argumente v ukazni vrstici. OK. Prepričajte se, da smo imeli na voljo dve datoteke. Lahko me tudi to. STUDENT 18: Če argc - ta ni enak 3. JASON Hirschhorna: Če odprtih paren argc ni enak 3? STUDENT 18: Ja, se vrnete 1 ali kaj podobnega. JASON Hirschhorna: Žal mi je. STUDENT 18: Nazaj 1 ali kaj podobnega. JASON Hirschhorna: Nazaj 1. OK? Super. Odprite obe datoteki. Kdo mi lahko pomaga odpreti obe datoteki? , Ki mi je ni dal kodo? Kurt? KURT: Torej, vsi pokrovčki F-I-L-E vira zvezda. JASON Hirschhorna: Grem vzeti ven samoglasnike. Tisti, ki so kul. To je kot Tumblr. STUDENT 18: Enako fopen - JASON Hirschhorna: Enako fopen? STUDENT 18: Odprte paren, argv, oklepaj. JASON Hirschhorna: Počakajte. Žal mi je. Odpri paren. OK. STUDENT 18: Ja. Argv sub 1. JASON Hirschhorna: Sub 1? STUDENT 18: Ja. Argv oklepaj 1 - ja. In potem vejica, nato pa odprt dvojni citiram, r, dvojni narekovaj, tesne paren, podpičjem. JASON Hirschhorna: Sweet. Kaj pa drugi? STUDENT 18: Zelo podobno, ampak S-R-C, bi jo poklical D-S-T. JASON Hirschhorna: Oo! To mi je všeč. STUDENT 18: Just D-S-T. Ja. In potem argv, oklepaj, 2. Ja. In potem w namesto r. Ja. JASON Hirschhorna: Great. Čez par vrstic. Tudi, če ima kdo stvari za dodati, da linije, ki smo jih storili, vas prosimo, da dodali tiste, kot dobro. Prepričajte se, ali ni NULL. Kdo mi lahko pove kodo moram izpolnjuje te linije psevdokoda? Archer. ARCHER: Če src enaka enaka NULL ali DST enaka enaka NULL, nato pa se vrnete - JASON Hirschhorna: Kaj? ARCHER: Vrnitev 2? JASON Hirschhorna: Vrnitev 2. Torej, če je odprt paren src enaka enak NULL, ali - karkoli da thing's - pipo? Cev? Imenovali jo bomo cevi. Cevi, cevi, dst enaka enaka NULL, vrnite 2. OK? Do razprodaje bajtov - smo nekako preskočijo ta korak od psevdokoda del, da boš tukaj. Vendar dokler ne pridemo iz bajte - Kaj to zvok všeč? Kakšen tip konstrukcije C - ampak jaz ne uporabljajo strukturo besedo, ker bomo začeli uporabljati da je v drugih primerih - vendar C orodje ne ta zvok všeč? STUDENT 19: zanka. JASON Hirschhorna: zanka. Sliši se kot zanke. Torej, kdo mi lahko pove prvo vrstico kode zanke tukaj? Lahko izberete tudi kakšno zanka hočeš, če mi daš ta vrstica kode. Obstajajo tri vrste. Vam izbrati. Jaz bi predlagal enega. Avi. Katerega hočeš? AVI: ZA. JASON Hirschhorna: ZA. AVI: int i enaka nič. JASON Hirschhorna: OK. AVI: Ta del nisem prepričan o tem. Toda i manjša od velikosti vira zvezdic? Nisem prepričan. JASON Hirschhorna: OK. AVI: Ker želite velikost datoteke, kajne? JASON Hirschhorna: Torej, to verjetno ne bo nam velikost dejanske vloži v bajti. Torej, kaj še lahko storimo? Kaj je druga vrsta zanke? Ali bi morali vztrajati z zanko? STUDENT 20: Ali bi lahko naredil, medtem ko zanko? In potem, kaj boš naredil je, tako boste - ker imamo char * za datoteko. Torej, če bomo kar naprej se povečevanje da dokler sva našli NULL znaka na Konec tem? Ali ne, je, da ni kaj slik deluje? JASON Hirschhorna: Torej lahko hranimo povečevanje char * dokler ne najdemo NULL - STUDENT 20: V bistvu nadaljuj znak za znakom, dokler ne zadenemo Konec datoteke. JASON Hirschhorna: Da. Tako da je tisto, kar želimo narediti. Želimo ohraniti branje, značaj ga značaja, dokler ne pridemo do Konec datoteke. STUDENT 20: Ja. Najdi - kaj je konec ali stop znak na koncu besedilne datoteke. JASON Hirschhorna: OK. Torej, ko pridemo do konca datoteke - kako vemo, da smo dosegli Konec datoteke? Če kličem - tako da je korak nazaj. Kaj je funkcija? Pojdimo k tej vrstici tukaj. Brati iz izvorne datoteke. Kdo mi lahko pove, da vrstico kode? STUDENT 21: Fscanf? JASON Hirschhorna: Fscanf. OK. Kaj, če želim, da se glasi, zelo Konkretno je bajt? STUDENT 21: Ne vem. JASON Hirschhorna: OK. Celo lažje kot fscanf - kaj je - Želim brati iz izvorne datoteke? Brati iz izvorne datoteke. Kaj je funkcija - ja. STUDENT 22: To je fread? JASON Hirschhorna: fread. Mislim, kaj je s palico da je eden za zdaj. Kakšno argumentov ne fread traja? STUDENT 22: Verjetno tip datoteke, in potem mesto v datoteki? JASON Hirschhorna: Kaj lahko vnesete tukaj da ugotovimo, kakšne vrste argumentov fread traja? VEČ Študenti: Man fread. JASON Hirschhorna: Man fread in fwrite. Izgleda, da so družila. Torej fread traja, koliko argumentov? STUDENT 23: Štiri. JASON Hirschhorna: Traja štiri trditve. To traja kazalec, velikost, in da stvar, ki je čudno, nekatere datoteke. OK? Oglejmo brati o tem tukaj. "Funkcija fread prebere n memb Elementi podatkov, vsaka velikosti bajta dolgo, od toka usmerjen z tok, jih shranite na lokaciji dana s kazalcem. " Torej štirje argumenti. Zakaj ne samo kopirati to, in ga prilepite tukaj. OK. Torej, kdo lahko začnete izpolnjevanje ti argumenti za mene? Avi. AVI: Vzemite praznino. Dal samo src. Vzemite kazalec in zvezdo. Put src. Nato - JASON Hirschhorna: Torej bom ustaviti si tam, ker to je napačna. Prav imaš s src, vendar kam naj src iti? [interposing GLAS] JASON Hirschhorna: mora šel sem. To je src - naša src je tip. Oglejmo si tukaj. To se prosi za vrsto datoteke * smo pravzaprav jih ponavadi vidimo tako. Torej je ta zaprosila za argument Tip datoteke * imenovano tok, ki je src. OK? Kaj velikost stvari narediti želimo brati? Dal sem vam to Opis problem. STUDENT 24: En bajt naenkrat. JASON Hirschhorna: En bajt. Kako velika je bajt? Njena velikost je v bajti, pa kaj Lahko sem dal tam? STUDENT 25: One. JASON Hirschhorna: One. Prav. Njena velikost je v enoti bajta, zato 1 je 1 bajt. Koliko jih želim prebrati naenkrat. STUDENT 26: One? JASON Hirschhorna: Ena stvar. Želim, da se glasi eno stvar velikosti 1, en ugriz naenkrat. In kje sem ga, ko sem ga prebral? STUDENT 27: Destinacija? JASON Hirschhorna: Torej ne morem dati je naravnost v okolici. STUDENT 28: Ti boš dal je v tretji kazalca? STUDENT 27: Do cilja. JASON Hirschhorna: OK. Ja. STUDENT 29: Lahko razglasi nekaj deluje kot začasno skladiščenje prej. JASON Hirschhorna: OK. Daj mi to. STUDENT 29: Še ena datoteka kazalec, morda? JASON Hirschhorna: OK. Torej je ta nična zvezda - to je tip void zvezda, tako da ne biti datotek kazalec. In če berem en bajt, kjer bi bilo dobro mesto za shranjevanje en bajt? STUDENT 29: matrika? JASON Hirschhorna: Niz. OK. In kaj je še nekaj, kar je samo dimenzionira en bajt? STUDENT 30: char *? STUDENT 29: Ja. JASON Hirschhorna: char * ni en bajt. STUDENT 29: znak. JASON Hirschhorna: char je en bajt. Kajne? Torej, kaj je to imenujemo buffer je generično ime se uporablja za te stvari za shranjevanje Nekaj ​​začasno. Zato sem ustvariti varovalo. Kajne? Vendar to ne bo praznino *. Mogoče imaš prav, da je mora biti pufer velikosti 0. Tako da shranjuje eno - prav. Ker je ta tukaj - char pufer učinek, ampak to traja praznino * - kazalec. Torej, jaz bi to naredil in zdaj buffer je kazalec. Kaj še lahko storim? STUDENT 31: Put zvezdo poleg char. JASON Hirschhorna: sem lahko Ustvarili pa char *. OK. Kaj je ena stvar, kar sem lahko naredil? Ali pa gremo s to eno. Char * buffer, pa kaj sem dal tu? STUDENT 31: Buffer. JASON Hirschhorna: Buffer. Buffer je kazalec na char. In na tem mestu, smo dajanje en bajt nekaj, kar sem prebral. Ja. Avi. AVI: Samo hitro vprašanje. Ali želite malloc buffer? JASON Hirschhorna: Kdo lahko odgovoriti na to vprašanje? STUDENT 32: No, pravzaprav ni točka za vse, zdaj, tako da - JASON Hirschhorna: Toda, ali želimo, da ga malloc? STUDENT 32: Če bi to naredil, da Tako, mislim, ja, saj bi si morali nekaj prostora za to, da kaže. JASON Hirschhorna: Ali imamo morali malloc? STUDENT 33: Če boste uporabljati zunaj zanke. JASON Hirschhorna: Ali bomo uporabljati zunaj zanke? STUDENT 34: Da. STUDENT 35: Počakajte. Ne želimo, da se ugotovi, v zanki z onstranstva? JASON Hirschhorna: Torej, mislim, da imamo nekateri pseudo while zanko sem, da smo poskuša ugotoviti, da Vam še ni prišel do. Mi ne potrebujemo, da ga malloc. Mi deluje v glavnem, to je samo še za uporabo v notranjosti te zanke. Ni pa potrebno, da obstaja izven tega. Tako je lahko lokalna spremenljivka. Imate kazalec Lokalna spremenljivka. STUDENT 36: Ampak to ni kaže na nič. JASON Hirschhorna: Ne, to ni inicializiran ničesar. Ampak mi ne bo uporabljala tudi. Bomo dal nekaj v to prvič, da jo uporabite. Tako da se zdi v redu. Torej ne potrebujemo malloc tukaj. In mislim, da je v redu, kot je. OK. Imamo fread linijo. Naredimo naslednje vrstice. Če želimo pisati v datoteko, kaj je Dobra funkcija uporabiti za to? STUDENT 37: fwrite? STUDENT 38: fprintf? JASON Hirschhorna: fprintf je ena. Kaj je še eden? STUDENT 39: fwrite. JASON Hirschhorna: fwrite. In za naše namene, fwrite, ki smo ga videli tukaj, je verjetno boljša izbira. To traja štiri argumente, kot dobro. Nishant, lahko daš me argumenti? Nishant: prva, ki je v teku biti samo pufer. JASON Hirschhorna: OK. Nishant: drugi pa je samo bo 1. Tretji pa se dogaja, da je 1. In četrti se bo dst. JASON Hirschhorna: Ima kdo vsa vprašanja o tej progi? Da izgleda dobro. OK. Torej, zdaj izgleda, da je eno stvar, ki smo si manjka - pravzaprav, kaj je pisanje ta zadnja vrstica. Zaprite datoteke. Kdo nam lahko končal pisanje ti zadnji dve vrstici? Da. Žal mi je, kako ti je ime? LUCY: Lucy. JASON Hirschhorna: Lucy. LUCY: fclose src in potem fclose destinacija. JASON Hirschhorna: fclose, odprt paren, src, blizu paren, podpičje. In fclose - ja? LUCY: Odprto oklepaje, dst in potem podpičjem. JASON Hirschhorna: Great. In kaj naj vključi na koncu? LUCY: Vrnitev 0. JASON Hirschhorna: Vrnitev 0. Ali moram? Samo vprašanje. Ali moramo vključiti return 0? VEČ ŠTUDENTI: Ne JASON Hirschhorna: Ne Glavni počne avtomatsko Če prideš do konca. Ampak mislim, da je lepo, da vključiti eksplicitno. Še posebej, ko smo se vračajo drugo Stvari v celotnem programu. OK. To je tisto, kar nam manjka - MEDTEM, kaj? Kdo lahko zamislite nekaj - ima nekaj smisla za kaj stvari bi lahko šel tja? Tudi če je samo v nekaterih psevdokoda kot jezik? Kaj smo res - kaj Ne želimo iti še? Ja, Lucy. LUCY: konec datoteke. JASON Hirschhorna: konec datoteke. Torej, kaj misliš s konca dokumenta? LUCY: Ko dosežete konec datoteke, nehaj. JASON Hirschhorna: OK. Torej, ko pridemo do konca datoteke. Kako vemo, kdaj smo dosegli Konec datoteke? STUDENT 40: Mislim, da buffer bo nastavljen na NULL. STUDENT 41: Buffer se razglasi znotraj zanke. JASON Hirschhorna: Torej menite, buffer bo nastavljen na NULL. Zakaj bi varovalni nastavljen na NULL? STUDENT 40: Ker, ko ste fread, skušate postaviti nič v pufru. JASON Hirschhorna: OK. Torej misliš fread - ko smo prišli do konca Datoteka, kaj se fread storili? Mislim, da je vprašanje moramo ugotoviti. Kaj fread storiti? Ali je dal NULL v pufru, ali Ali pa kaj drugega? Kako lahko ugotovimo, kaj ne? STUDENT 42: Man. JASON Hirschhorna: Man. Tako da je pogled tukaj. Vrne vrednost. O uspehu, fread in fwrite vrnete število kosov prebrati in vpisati. To število je enako številu bajtov prenesejo samo, če je velikost 1. Če pride do napake, ali na koncu je dosežena datoteke, vrne vrednost Skratka Število element ali 0. Torej za naše namene, če fread toku konec datoteke in bere iz konec datoteke, ni nič ostalo da se glasi, kaj bo, da se vrnete? STUDENT 43: Zero? JASON Hirschhorna: Kaj? STUDENT 43: Zero? JASON Hirschhorna: Zero. To se dogaja, da se vrnete nič. Torej vemo, da fread, ko smo se dosegel konec datoteke, se bo , da se vrnete nič. Kako lahko uporabimo, da v našo korist? AVI: Lahko razglasi spremenljivko zunaj zanke, imenovano pregled. Če potrditveno enaka - za zdaj - eno. JASON Hirschhorna: OK. AVI: In potem jih lahko naredi IF Izjava takoj po fread rekel, če fread enaka nič - št. JASON Hirschhorna: Kdo lahko pomaga Avi ven? AVI: Kakšna je vrednost z fread vrnil? JASON Hirschhorna: Pravkar smo šli čez to. AVI: Kako si to predstavljajo? JASON Hirschhorna: Torej se vrne - dajmo poglej tukaj - se vrne size_t, ki je v bistvu celo število. Tako da vrne celo število. In v našem primeru bo to vrne 1 ali 0 - 1. če je prebral eno stvar - en bajt, in 0, če smo prišli do konca. Torej, če fread - ja? STUDENT 45: Ne moreš dati polno fread (pufer, 1, 1, SRC) v medtem ko je zanka? JASON Hirschhorna: Torej vi predlagate tem v tam? [interposing GLAS] JASON Hirschhorna: Drži. Torej bomo znebili tega. Torej predlaga dajanje v tam fread? Kaj moramo tudi premakniti Če želite to narediti? STUDENT 45: buffer zunaj. JASON Hirschhorna: Morali bi tudi to izseliti tukaj. STUDENT 45: Ampak ne, da nenehno premakniti naprej? [interposing GLAS] JASON Hirschhorna: OK. Torej, to je tisto, kar Okshar predlagal. Mi ustvarjamo našo buffer. Mi MEDTEM fread, potem fwrite. Misli o tem? STUDENT 46: Moje edino vprašanje je, ali bi dejansko izvršiti ukaza fread? JASON Hirschhorna: Great vprašanje. Ko ste dajanje klic funkcije notranjost stanju, ne da klic funkcije usmrtitev? Videli smo primere že prej. Kajne? STUDENT 46: OK. Ja. Torej to ne izvrši. JASON Hirschhorna: Videli smo stvari tako pred, kjer imamo klic funkcije znotraj pogoj. Ali ta klic funkcije usmrtitev? Da. Torej, odgovor je pritrdilen. Ta klic funkcije bodo izvajale. Ampak še enkrat, je to tisto, kar si želimo? Kar je eden od načinov, da bi lahko ugotovili , če je to tisto, kar si želimo? VEČ ŠTUDENTI: to Run? JASON Hirschhorna: Lahko bi ga zaženite. Toda preden bomo to storili, smo lahko Razumno, tudi skozi to. Če - pravijo, da imamo en bajt v našem datoteko, bomo prišli do sem, bomo prišli do te kode. Ta bo deloval. fread bo vrnil en bajt in shranite v pufru. In to bo ocenila na 1, Prav, potem ko se vrne 1. Torej, medtem ko 1. Ali to pomeni kodo notranjosti zanko, medtem ko bo usmrtitev? STUDENT 47: Ja. Res je. JASON Hirschhorna: Da. 1. Res je. To ni 0. Tako bo koda noter izvršiti. Torej bomo napisali to. Bomo premakniti nazaj na to linija še enkrat. Zdaj imamo - smo na koncu naše datoteke. Beremo od konca našega spisa, ker smo imeli samo en bajt v njem. Fread vrne 0, trgovin nekaj v pufru. Iskreno ne vem, kaj ga shrani v vmesni pomnilnik. Mi bi verjetno poglej gor da vidim, kaj počne. Da Iskreno ne vem. Ne vemo, koga briga kaj ga shrani v buffer? Vendar pa vrne 0.. In medtem ko 0 usmrtitev? MEDTEM 0 ne bodo izvajale. Torej bova odšla sem. Torej, kaj je z dvigom rok, če je to je koda, da bi morali teči, ali če je treba storiti, spremembe prvi. Torej, če mislite - boste morali glasovati. Če menite, da bi morali zagnati to kodo kot je, prosim, dvignite roko. OK. Še ena - imaš kakšno vprašanje, zaskrbljenost? Ja. STUDENT 48: Ko gremo buffer zunaj zanke, bomo morali malloc? JASON Hirschhorna: Great vprašanje. Potem gremo blažilce zunaj zanka, bomo morali malloc? To je področje vprašanje. Če želimo zagnati buffer zunaj te zanke, bo obstajajo Notranjost zanke? VEČ ŠTUDENTI: Da. JASON Hirschhorna: Da. Njeno področje zajema znotraj zanke, in, res, kaj je spodaj v notranjosti tega kodeksa, vključno stvari tu notri. Torej nam ni treba, da ga malloc. To je lokalna spremenljivka, in njegov obseg še vedno vsebuje zanko. STUDENT 49: Ali moramo to zastonj? JASON Hirschhorna: Ali imamo potrebujete za brezplačno buffer? STUDENT 49: Ja, če ne bomo malloc. JASON Hirschhorna: Ali imamo potrebujete za brezplačno buffer? Mi pa ne. Spet je lokalna spremenljivka, tako da nam ni treba sprostiti. OK. Poglejmo, kaj se zgodi. Torej je Neinicializirano. To je bilo kar nekaj, Marcus predlagajo prej. Torej imamo, da napake, spremenljivo buffer se nezačeto ko se uporablja tukaj. Kako lahko to popravimo? STUDENT 50: to malloc? STUDENT 51: Enako NULL? STUDENT 52: Povejte buffer enaka NULL. JASON Hirschhorna: OK. Izgleda dobro. Jo imamo zdaj. Poglejmo nekaj ustvariti, da bi poskušali kopirati. Torej imamo besedilno datoteko. Kako lahko zaženete ta program? Ja. STUDENT 53: To lahko naredite piko slash CP test.txt. In potem lahko naštejemo še eno datoteko , ki se bo shranjevanje v. JASON Hirschhorna: OK. Imenovali jo bomo out.txt. Kul? Seg krivda. Misli o krivdi uvodnih? To je super. Kako lahko ugotovite, kje napaka seg je? Kaj? STUDENT 54: Gdb. JASON Hirschhorna: Gdb. Vodimo gdb s pisanjem gdb dot poševnica, ime našega programa. Ni argumenti v ukazni vrstici tam. Bomo nastavite Ustavljanje na glavni. Če želim, da začnete gdb, kaj naj storim? STUDENT 55: R. JASON Hirschhorna: R. In kaj potem? STUDENT 55: Argumenti? JASON Hirschhorna: Nato argumenti v ukazni vrstici. Sprehodimo se skozi. N se mi samo ob po vrsticah. Jaz grem, dokler Dobim SEG napako. Tukaj je moja krivda seg. Izgleda, da fread povzročil moja seg krivda. Vem fread povzročil moj SEG napako, ker so bili linijo smo pravkar usmrtili. In edina stvar, ki je bila dogaja v tej smeri - Dve stvari so se dogaja. Fread je šlo, potem pa smo bili delaš nekaj Med preverjanjem. Jaz sem pripravljen staviti, da MEDTEM preverjanje ni bila povzroča moje SEG napako. Najverjetneje je bil fread povzroča moje SEG napako. Vidim tudi nekaj tukaj, memcopy. Spomin kopijo. Podoben gibljejo spomin iz ene lokacije na drugo. Zveni kot nekaj, kar bi se zgodilo V fread, morda nekaj pomnilnika gibljejo od tu do tu. Gremo skozi to še enkrat. Kako se začeti znova in ga ponovno zagnati? Ja. STUDENT 56: Ali boste morali dati ampersand pred buffer? JASON Hirschhorna: Torej ampersand pred buffer bi mi naslov pufer, ki je znak *. Oglejmo teči skozi to še enkrat. Kako teči skozi to še enkrat? STUDENT 57: Ali lahko samo tip spet teči? JASON Hirschhorna: Samo enkrat vnesite tek. Torej ne gremo na izvršitev te vrstice. Torej buffer je NULL kazalec. Popraviti? To kaže, da - poglejmo. Če imamo - pripraviti hitro sliko o tem. Lahko vsi videli, če Pišem tukaj? Torej, v plasteh, imamo lokalno spremenljiva in je pozval buffer, in to je kazalec na char. Kaj je naslov ta znak na? STUDENT 58: 0x0. JASON Hirschhorna: Right. To je to. V tu notri buffer, ki je shranjena 0x0. To je tisto, kar imamo - Nastavitev imamo zdaj. Torej, ta vrstica, fread, postavlja nekaj od vira kje? V to okno ali te škatle? Ki škatla? Levo okno ali desno okno? Ta pravica polje. Iz tega sledi, kazalec, in ga postavi tukaj. Ko smo poskušali in spomin na dotik Lokacija 0, kaj smo dobili? Segmentacije krivda. To je napaka imamo zdaj. Ja. STUDENT 59: Ali nimate naj zvezda buffer? Ali ne? Za fread? JASON Hirschhorna: Torej fread traja kazalec. Tako da prehaja v pufru. In potem bomo de-reference nekje v notranjosti fread. Ampak še enkrat, bomo videli, je potrebno kazalec. Mi ne potrebujemo, da jo posredujejo zvezdicami rezerve. To bi lahko opravile je vse, kar je tukaj. In da bi nam verjetno dal napako ker smo ga de primerjal. Kajne? Ko smo de referenčna ta kazalec, ko skušamo dostop do te lokacije, smo dobili napako - naša segmentacije krivda. Torej - oops. Bomo nehal iz GDB. Naša linija - naš problem - prav Tukaj na tej liniji. In to je problem, ker te cevi. Kako lahko ustvarite polje, ki je dostopen v fread. Kajne? Moramo ustvariti polje, ki je eden bajt velika, velikost ZNAK. Vendar pa moramo, da je škatla, da so dostopni ko se ta funkcija izvaja. Torej, če - ja. Vse ideje? STUDENT 60: Samo nastavite kot koli naključno znak. Samo naredi Char Buffer enaka značaj. In potem, ko ste tam blažilce - JASON Hirschhorna: Počakajte. Char buffer? Torej ni zvezda? STUDENT 60: Ja. Vzemite zvezda. Enako naključni značaj. JASON Hirschhorna: OK. Daj mi eno. STUDENT 60: Kot ali kaj podobnega. In potem, ko imate buffer tam, boste uporabili - STUDENT 61: Star? Oh no, ampersand. STUDENT 60: Uporabite znak &. JASON Hirschhorna: OK. In kaj je v fwrite? STUDENT 60: Ponovno uporabite znak &. JASON Hirschhorna: V redu. Torej tvoja ideja je, da smo ustvarili char in dal nekaj v njem, in nato pisati v char. STUDENT 60: Ja. JASON Hirschhorna: Kaj ljudje mislijo? STUDENT 62: To je zapletena. JASON Hirschhorna: OK. Dajmo ga potegnili. Torej ta čas, grem, da pripravi to rdeči na kupu tukaj, potem pa bodo imeli - ooh! Žal mi je. Torej, tokrat imamo nekaj, kar ti pufer, in da je na kupu. Popraviti? In smo varčevanje v njem je, na začetku. Potem imamo klic fread. Kaj fread pa se je potrebno bajt od naša datoteko in jo postavi nekam. To ga postavlja v kakršnikoli stvar je, ki kažejo na. No, preden smo imeli ta naslov - 0x0. Zdaj, kaj naslov imamo? STUDENT 63: Karkoli naslov blažilec. JASON Hirschhorna: Karkoli naslov blažilec. To je verjetno, da bo nekaj takega. Verjetno bo, da začnete z b in f, nato pa še šest drugih šestnajstiških številk. Ni važno. Nekatere naslov. In mi gre ta naslov noter In bomo, da bo naš enega bajt stvar na tem naslovu. Torej bomo, da bo naš enega bajt stvar tu notri. In potem se bomo pisati kaj je kdaj tu notri. Ima kdo kakšna vprašanja o tem? Ki misli, da je ta koda bo delovalo? Dvignite roko, če menite, ta koda bo delovala. Moraš sprejeti stališče. In ki misli, da je ta koda ne bo delovalo? Naj dvigne roko. Vsi ostali morajo biti dvig svoje roke. OK. Michael, kje stojiš? MICHAEL: Ne morem se odločiti. Nekako v sredini. JASON Hirschhorna: Ti si v sredini. Izberi eno. MICHAEL: Jaz bom vero in pravijo, da bo delovalo. JASON Hirschhorna: OK. Boste imeli vero in pravijo, da deluje? Kaj se je zgodilo? [interposing GLAS] JASON Hirschhorna: Ne seg krivda. Kako lahko preverite, če Dve stvari sta enaka? Dve datoteki sta enaki. STUDENT 64: Diff. JASON Hirschhorna: Diff. Primerjanje pregledi za razlike med dve datoteki, in če se vrne nič, oni so enaki. In če bomo odprli, bomo dobili naše datoteke. Tako, da je pravilna rešitev. Oglejmo pogled nazaj na to še enkrat. Mi dejansko sploh ni morali zagnati. Verjetno bi bilo videti malo čistejše, če nisi dal nekaj naključno tam. Točka pa si je potrebno ustvariti nekaj prostora za shranjevanje nekaj iz fread in traja nekaj iz fwrite. In to, kar je bilo treba bodisi lokalno spremenljivka na kupu - vi Lahko bi malloc'd nekaj prostora. Tako da bi lahko dejansko napisal malloc tukaj, in da bi delali. In potem bi bili shranjevanje naši stvari nekje na kupu. Ampak to je dejansko verjetno, Najbolj elegantna rešitev. Samo ustvariti nekaj prostora na kupu za te stvari, da gredo. Jaz bi imel dve druge pripombe. Če ste bili, da bo na vrsti v tem, in Nato se je dosegel to, moji komentarji bi bila, kot sledi. Gre 1 je tukaj, z mano, poglej kot čarobne številke. Ta 1, v smislu fread, smiselna. To je veliko stvari, brati ali pisati. Ampak tale tukaj bi morala Verjetno je nekaj drugega. Torej, kaj je ena rešitev? STUDENT 65: Velikost bajt. JASON Hirschhorna: Tako? STUDENT 65: Velikost char. JASON Hirschhorna: Velikost char. Ja, bajt ni tip. Torej velikost značil del. Lahko bi, na vrhu naša koda, # opredeljeno, da. Imenuje nekaj BYTE in to je res znak. Pravzaprav, še boljši pristop Morda je bil to - UINT. Ali kdo ve, kaj je to? Žal mi je. Imam ga nazaj. Čakaj, no. V katero smer gre? Ali kdo ve, kaj je to? Ja. STUDENT 67: Naj bi pomagala poenotiti preko sistemov stvari, ki jih imajo - kot nepodpisane celih da imajo 8 bajtov? JASON Hirschhorna: To je Točno tako. Na različnih strojih, velikost char - običajno ni znak. Znakov so navadno en bajt. Vendar velikosti iz drugih podatkovnih tipov različnih velikosti na 32-bitnem računalniku v primerjavi s 64-bitno napravo. Uint8_t je vedno 8 bitov - Vedno en bajt. In moram vključiti, da standardna int glava datoteke. Torej sedaj, bi bili verjetno Najboljši način, da napišem to kodo. Tako se znebim čarobne številke. In sem tudi bolj logično tip za buffer. To ni le znak, da je bajt, kar je tisto, kar smo pričakovali, da bo. In tu gor, ki smo jih dejansko bil malo bolj robusten. Nismo ga kliče znak, ki - Mogoče kdo ve - je lahko drugačna velikost na različnih strojih. Mi smo dejansko rekel to je točno en bajt, vedno, ne glede na to, kaj. In če pogledamo tukaj, naredimo cp. Uh-oh. Kaj se je zgodilo? STUDENT 68: Morda se vklopi. JASON Hirschhorna: Kaj? STUDENT 69: Ali je to? STUDENT 70: Nisi opredelimo kot vrsto. STUDENT 71: Ampak to bi morali opredeljena v standardu. STUDENT 72: Kaj se dogaja? STUDENT 73: Ali naj opredeli biti vsi pokrovi? JASON Hirschhorna: Torej ni # define. Pravzaprav, v tem primeru, sem boste uporabljali typedef. Ker smo ga uporabljate kot tip na enem mestu. Torej, v tem primeru dejansko želimo typedef kot smo tiskanju novo vrsto bajt, in je v bistvu to. To je nekoliko drugačna kot # define. In zdaj naša koda deluje odlično. Torej, še enkrat, # define traja nekaj ga nadomešča povsod z drugo stvarjo. To je samo makro - okrajšava, da se znebite čarobne številke. Toda v tem primeru, ker smo jo uporabljajo kot neke vrste - tukaj - z namenom, da se to dela, moramo da typedef karkoli bajt. In mi smo ga opredeljuje tukaj. To ni struct, da je dejansko Samo nepodpisani celo število. To je en bajt dolgo. Ta koda bo na voljo na spletu, in ti bi morali vsi ga imajo zdaj. Torej imamo - popoln - V 13. minuti zapustil, da gredo več problem nastaviti 5. Želim, da sprehod skozi copy.c skupaj, in potem bomo na kratko pogovorila o drugih delov problema nastaviti. Zato mi dovolite, dvigni copy.c. In kul stvar je, ki smo jih dejansko že napisal veliko tega kodeksa. Koda smo pisali dobesedno tik prišel ven, ko sem bil to pisanje na svoje. Ampak to je copy.c, je osnova v prvih dveh delih Problem nastavite za whodunit.c, ki boste morali napisati, in resize.c. Recover.c, ki je tretja in zadnja Del problema niza, ni temelji off te datoteke. Boste morali napisati datoteko, smo vam predlogo za to datoteko, vendar pa to nima nič storiti z copy.c. Ampak zato, ker copy.c je temelj za prva dva dela, bomo hoditi po njem zdaj, tako da boste imeli Dober občutek, kaj počne. In pripombe dati nekaj od tega proč. Smo že napisal nekaj o tem. Najprej smo se prepričajte smo dobili tri argumente. Nato smo si zapomniti imena datoteke. Tako smo preskočili ta korak, ko smo označeni našo stvar - ko je naša cp. Ampak tukaj, oni so tako je nekoliko čistejši. Oni preverimo, obe datoteki so dobri, v Poleg tega, da jih odpira. Napisali smo vse to kodo šele zdaj, zato sem ne bom spuščala v to oznako. Naprej je nekaj stvari, ki je specifična za vrste datotek, smo z uporabo, ki so bitnih slik. Bitnih slik imajo nekaj metapodatkov povezane z njimi. Torej, prvih nekaj bajtov vam povem o datoteki. Niso barve pixel v tej podobi. So vam povem o datoteki. In če ste prebrali problem niz, boste imeli veliko več informacij na kakšne vrste metapodatkov struktur so vključeni v bitne slike. Ampak to je, zakaj imamo ta prvi set - to kodo tukaj. Beremo metapodatke - dva kosa meta - datoteko Glava in info glavo. In mi smo preverjanje nekaterih njegovih delov na prepričajte, da je res, bitna slika pred nadaljevanjem. In spet, to so podrobnosti smo vam ni treba iti v zdaj. Če ste prebrali problem niz, boste razumeli to. Skratka, ti samo pravim, to je bitna slika, in potrjuje, da. Nato smo pišete tiste, do datoteke ven. Vidimo, da je tu. Pišemo na ven kazalca. Nato smo si določanju oblazinjenje. Še enkrat, kot je posebnost z bitna slika, nekatere linije vključujejo oblazinjenje na koncu. In če ste prebrali problem niz, boste izvedeli več o oblazinjenja. To je formula najti oblazinjenje. Pomembno je vedeti - Ko spremenite velikost bitno sliko datoteko, spremembe oblazinjenja. Ko spremenite velikost datoteko, spremembe oblazinjenja. To se ne bo nikoli večja od 3 - da bo od 0 do 3, vključujoča. Toda, ko spremenite velikost nekaj, spremembe oblazinjenje. Če imam samo eno piko v tej vrstici, sem Potrebujem tri bajte oblazinjenja, saj Vsaka vrstica mora biti mnogokratnik štirih bajte v bitne datoteke. Ampak, če sem ga podvojili, da gredo iz enega piksla dvema piksel, od katerih je vsak, recimo, je bajt, potem moram dva bajta oblazinjenja, da bi , ki je enak štiri. Torej, ko sem spremeniti velikost nečesa, Moram spremeniti višino oblazinjenja imam. Ali to smiselno za vsakogar? Nato smo Ponovil nad vsako vrstico ali prek vseh vrstic. In potem smo Ponovil skozi vsak stolpec v vsaki vrstici. Mi zdravljenju te bitne slike kot omrežje, kot smo obdelan odbor v 15. Tako kot smo se zdravijo opeke, ko jih natisnjena na zaslonu. Mreža vrsticah in stolpcih. Potem pa - smo videli tole. Mi pravzaprav le ta kodirana. Ustvarili smo nekaj začasnega skladiščenja. Prebrali smo tam, in potem smo ga napisali ven. To je natanko tisto, kar smo pravkar storil. Dalje, ker sem rekel, vsaka vrstica konča v neki oblazinjenja, smo preskočite ta oblazinjenje - stara oblazinjenje. In potem smo jo dodali nazaj. V tem primeru smo ustvariti Enako natančna slika. Mi samo kopiranje. Tako da je ta linija je nekako neumno. Lahko bi dobesedno samo dal oblazinjenje prijavite Ampak, če spremenite velikost datoteke, še vedno hočeš to linijo? Torej, če bomo spremenili velikost datoteke, Ali smo še vedno želite preskočiti nad starim oblazinjenja? STUDENT 74: Da. JASON Hirschhorna: Tako delamo. Ker To pa ponovno obravnava z izvorno datoteko. Mi ne skrbi oblazinjenje Iz izvorne datoteke. Želimo, da gredo v naslednjo vrstico. Ampak ne bomo preprosto rečeno nazaj stari znesek oblazinjenja. Moramo postaviti nazaj nov znesek oblazinjenja. Torej, ko smo spreminjanje velikosti Datoteka, smo še vedno želijo, da jih preskočite oblazinjenje v stari datoteki - tisto, smo berete v od. Toda kaj smo pisno, gremo bi morali dati nazaj nekaj drugačen Število oblazinjenja, ki Ugotovili smo. Ja. STUDENT 75: Vrstni red teh dveh linije ni važno, kajne? Ker ste ravnanje različne datoteke. JASON Hirschhorna: Točno tako. Vrstni red teh dveh linij ni važno. Pišemo te vrstice. To je tukaj za datoteko smo pisno. To je zelo pomembno, da smo dobili Pravilna količina oblazinjenja. To ima opravka z datoteko v. Želimo, da preskočite desno nad polnilo. Nočemo, da se glasi - če bereš bajt naenkrat smo ne skrbi teh bajti zapolnitve. Želimo, da se premaknete na naslednjo vrstico. Na koncu tako kot Lucy je dal za nas, zapremo datoteke in vrne 0. Torej je to copy.c. In smo dejansko napisal - smo porabili večino oddelek to pisanje, v bistvu. To si je. Torej, upam, da boste imeli dober občutek o tem, kaj se dogaja tukaj. Velika razlika je, po pravici povedano, je samo ta prvi del, ki se ukvarja z posebnosti bitne datoteke. Torej imam kot moj naslednji diapozitiv Kaj moramo storiti? No, pomislite whodunit. In za nekoga, ki se glasi prek problem določiti, kaj počnemo morate storiti v whodunit? Preprosto. Aleja. Aleja: Ali ste vzeli ven del vsake točke, ki označuje rdeča. In potem - vrsta? JASON Hirschhorna: OK. Torej, vzemite ven del vsakega slikovnih pik, ki označuje rdeča. To je blizu, vendar ne vse. STUDENT 76: No, tam je različnih načinov, da to storite. JASON Hirschhorna: OK. Daj mi en način. STUDENT 76: Vzemite vse rdeče, in nato pa poudarjajo, modra in zelena. JASON Hirschhorna: OK. Torej, glede na oba načina - zveni kot smo dali to piko, je ima rdečo, modro in zeleno raven. Želimo spremeniti relativne ravni rdeča, modra, zelena, odvisno na tej piko. Kadar je v tem kodeksu, bi morali spremeniti relativna rdeča, modra, zelena ravni v danem piko. Potem, ko smo ga prebrali - preden smo jo napisali? Daj mi številko vrstice. VEČ ŠTUDENTI: 83. JASON Hirschhorna: 83. Torej tukaj. Za whodunit, kodo morate pisati bi morali vsi iti tja. In to je samo koda morate pisati. Ker, kot smo slišali, vse, kar morate storiti, je spremeniti te relativno modro, rdeče in zelene ravni v vsak piksel. Ki ste jo prebrali v, in zdaj si bo to napiši. Kako dobim - če imam to stvar imenovano trojno, tukaj, in to je tip RGBTRIPLE - dobro, če bi pogledal v bmp.h, kaj je RGBTRIPLE? STUDENT 77: To je struct. JASON Hirschhorna: RGBTRIPLE je struct. Vidimo, da tukaj dol. In tako, če sem hotel, da dostop do, recimo, Rdeča stopnja struct, kako sem dostop rdečo stopnjo tega struct? [CLASS šumi] STUDENT 78: RGBTRIPLE.rgbtred? JASON Hirschhorna: Je to res? STUDENT 79: Ali je treba triple pika, namesto RGBTRIPLE piko? JASON Hirschhorna: Triple. Triple je lokalna spremenljivka, tako tu ni nobenih nasvetov tukaj. Tako da smo samo uporabo dot zapis. To mi bo dal raven rdeče. Če želim, da jo spremenite, sem nastavljena je enaka za nekaj drugačnega. Torej še enkrat, ta vrstica kode dostopov ta spremenljivka znotraj tega struct, in jo lahko nastavite na nekaj novega. Torej za whodunit, še enkrat, to je, v bistvu, kaj moramo storiti. Zelo preprosto. Samo spremeniti nekatere relativne ravni, in to je, če je ta koda gre. Širino, na drugi strani pa je malo težje. V bistvu, velikost je verjetno najtežavnejših del tega problema nastavljena. Imamo tri minute, da gredo nad njim. Ampak še enkrat, smo že pisali večina tega kodeksa, zato smo bi morala biti precej pozna. Katere so nekatere stvari, ki smo želeli storiti spreminjanje velikosti, če ste prebrali več problem nastaviti? Če jih daš, smo Lahko govorimo o njih. Katere so nekatere stvari, ki jih želijo narediti? STUDENT 80: Vertikalno - tako da boste morali, da jo horizontalno spreminjanje velikosti, ampak ga vertikalno spreminjanje velikosti, kot tudi? JASON Hirschhorna: Torej, če sva dana pixel, in želimo, da spremenite velikost s faktor dva, je treba sedaj spreminjati vodoravno in spreminjati navpično. Ali to smiselno? Ja. Tako, da je verjetno Največji izziv. In se bova pogovorila o tem, da je v sekundi. Ja. STUDENT 81: Tako sem mislil na to je, da potrebuješ tisk ven - JASON Hirschhorna: Počakajte. Ali nam ne pove, kaj si naredil. Bomo govorili v logiki. STUDENT 81: OK. Kaj je bilo vprašanje? JASON Hirschhorna: Pravkar si dvigne roko. Ni bilo vprašanje. Dovolite mi, da ga predstavi. Naj samo na kratko razpravljali o tem. Torej imamo en piksel, želimo je repliciral, tako horizontalno in navpično. Torej v najboljšem primeru, kaj počnemo tukaj je, da smo preberete v našem pik, smo ga napisali Vendar pa je veliko krat. Toda potem imamo trik tukaj, ker nato pa želimo, da preskočite Naslednja linijo in pisati začetek naslednje vrstice. Torej, če želimo posnemati tako horizontalno in vertikalno, kar je en dober način za to - ena dobra, čeprav za to? Tako da nam ni treba nenehno iskati okoli naše datoteke postaviti stvari. To vprašanje se morda ne bo smiseln, vendar mislim, odgovorili, da tega ne bo pomagalo. STUDENT 82: Ustvarjanje niz? JASON Hirschhorna: Torej, kaj mislite posamezne datoteke, kot zapored. Razmislimo v smislu vrstic. Če imamo prvo vrstico iz naše majhne slike, lahko naredimo to vrstico v veliki vrsti od velikega slike, in nato posnemati to vrstico Toda večkrat ga je treba ponoviti, namesto da gredo pixel s piko, ki postane zmedeno, ko , ki se ukvarjajo z datotekami. Ker če bomo imeli - Jaz sem zmanjkuje prostora. Če je to naša slika, in imamo, da en piksel tam, in želimo, da ga tam imamo še nekaj stvari da je treba iti tja, ko smo pisanju in ustvarjanju naše nove datoteke - naša datoteka, ki je dvakrat večji. Ampak to je res težko z datoteko funkcij preskočiti okoli novih progah všeč, nato pa pojdite nazaj in dal stvari tam. To je skoraj nemogoče narediti nekaj tako, če je to smiselno. Torej, če razmišljamo v smislu vrstic, smo lahko vzamemo vrstico, nato pa jo dal - ponovitev vrstic navpično. In to je, kako smo se ukvarjajo s spreminjanjem velikosti vertikalno namesto horizontalno. To je bilo nekako hitro, in malo zmedeno. Žal naš čas se je iztekel. Stala bom zunaj, za tiste, ki ste tu, ki imate vprašanja o Problem set, vključno z izterjavo. Torej, kaj je preloži za zdaj. In spet, če imate kakršnakoli vprašanja, bomo lahko klepetajo zunaj.