[Powered by Google Translate] [5. JAGU: vähem mugavad]
[Nate Hardison, Harvard University]
[See on CS50.] [CS50.TV]
Nii et tere tulemast tagasi, poisid.
Tere tulemast 5. jagu.
Sel hetkel, kui on lõpule viidud viktoriin 0 ja olles näinud, kuidas sa oled teinud,
loodetavasti tunned tõesti hea, sest ma olin väga muljet hinded käesolevas paragrahvis.
Meie online vaatajaid, meil oli paar küsimust
umbes kaks viimast probleemid lahendamist - või viktoriin, pigem.
Nii et me läheme üle need tõesti kiiresti, nii et igaüks näeb, mis juhtus
ja kuidas minna läbi tegelik lahendus, mitte lihtsalt vaadates lahendus ise.
Me läheme viimase paari probleeme tõesti kiiresti, 32 ja 33.
Lihtsalt jällegi nii, et online vaatajad saavad näha seda.
>> Kui lülitate oma probleemile 32, mis on leheküljel 13,
13 liikmesriiki 16, probleem 32 on kõik umbes vahetustehingud.
See kõik oli umbes Vahetatakse kaks täisarvu.
See on probleem, et me olime üle paar korda loengus.
Ja siin, mida me palume teil teha, on kiire mälu jälgi.
Täita muutujate väärtused nagu nad on virnas
kui kood läbib see swap funktsiooni.
Eelkõige, milliseid me vaatame - Ma panen selle iPadi alla -
eriti, mida me vaatame on seda joont järjekorranumbritega 6 siinsamas.
Ja see on nummerdatud 6 lihtsalt piirnevuse eelmise probleem.
Mida me tahame teha, on näidata või märgistada riik mälu
kui see on ajal, mil me täita seda liini number 6,
mis on tegelikult tagasi meie swap funktsiooni siin.
Kui me keri siin nägime, et aadressid kõik mälu oli meile andnud.
See on väga võti; me tuleme tagasi selle üks hetk.
Ja siis siia alla allosas oli meil vähe mälu diagramm et me ei kavatse viidata.
Ma olen tegelikult teinud läbi minu iPad.
Nii et ma lähen vaheldumisi edasi-tagasi vahel iPad ja see kood ainult viitega.
>> Alustame. Esiteks, ärgem keskenduda paari esimest rida peamiste siin.
Et alustada, me ei kavatse initsialiseerida x 1 ja y 2.
Nii et meil on kaks täisarvu muutujad, nad mõlemad kavatse panna virna.
Me läheme pane 1 ja 2 neist.
Nii et kui ma flip üle minu iPad, loodetavasti, vaatame -
Apple TV peegeldamine, ja seal me läheme. Okei.
Nii et kui ma flip üle minu iPad
Ma tahan initsialiseerida x 1 ja y 2.
Me teeme seda lihtsalt kirjutades 1 lahter x
ja 2 lahter y. Üsna lihtne.
Nii et nüüd lähme tagasi laptop, vaata, mis juhtub järgmisena.
Nii et see järgmisel real on koht, kus asjad keeruliseks.
Me liigu aadress x ja aadress y parameetrid a ja b konverteerimist funktsioon.
Aadress x ja aadress y on asju, mida me ei saa arvutada
viitamata nende bullet punkte siinsamas.
Ja õnneks kahe esimese bullet punkte ütle meile täpselt, mis vastused on.
Aadress x mälu on 10, ja aadress y mälu on 14.
Nii et need on väärtused, et saada edasi nii a ja b up üles meie swap funktsiooni.
Nii et taas, sisse tagasi meie skeem, võin kirjutada 10
ja 14 b.
Nüüd on see punkt, mille me jätkata swap.
Nii flipping tagasi laptop jälle,
näeme, et kuidas swap toimib on ma esimest dereference ja salvesta tulemus tmp.
Nii dereference operaator ütleb: "Hei. Treat sisu muutuja nagu aadress.
Mine iganes hoitakse sellel aadressil ning aseta. "
Mis saab laadida läbi muutuja läheb hoida meie tmp muutuja.
Flipping tagasi iPad.
Kui läheme Aadress 10, me teame, et aadress 10 on varible x
sest meile öeldi Meie täppjaotis et aadress x mälu on 10.
Nii saame sinna minna, saada väärtus see, mis on 1, nagu näeme meie iPad
ja koormus seda arvesse tmp.
Jällegi, see ei ole lõplik sisu.
Me läheme läbi kõndida ja me jõuame meie lõplikku seisu programmi lõpus.
Aga praegu on meil väärtus 1 salvestatud tmp.
>> Ja seal on kiire küsimus siia.
[Aleksandr] Kas dereference operaator - see on lihtsalt täht õiguse ees muutuja?
>> Jah. Nii dereference operaator, nagu me flip tagasi meie sülearvuti taas
on see täht õiguse ees.
Selles mõttes on see - sa vastandada seda korrutus
mis eeldab kahte asja; dereference operaator on unaarsed operaator.
Lihtsalt kohaldada üks väärtus, mitte binaarne operaator,
kus te kohaldatakse kaks erinevat väärtust.
Nii see on, mida juhtub seda joont.
Panime väärtus 1 ja hoida see meie ajutine täisarv muutuja.
Järgmine rida, me salvestada sisu ja B -
või õigemini, me salvestada sisu, et b on suunaga sinna paika, kus osutab.
Kui me analüüsime seda paremalt vasakule, me dereference b,
me tegelema 14, me haarata täisarv, mis on seal,
ja siis me minna aadress 10
ja me visata tulemus meie dereference B sellesse ruumi.
Flipping tagasi meie iPad, kus saame teha seda veidi konkreetsem,
See aitaks, kui ma kirjutan numbrid kõik aadressid siia.
Nii et me teame, et y, oleme aadressiga 14, x on aadressil 10.
Kui me hakkame kell b, me dereference b, me haarata väärtus 2.
Me rüütama see väärtus, kuna see on väärtus, kes elab aadressil 14.
Ja me ei kavatse seda ellu muutuja, mis elab aadressil 10,
mis on seal, mis vastab meie muutuja x.
Nii et me saame teha natuke kirjutada siia
kus me vabaneda meie 1 ja selle asemel me kirjutame 2.
Nii et kõik on hästi ja hea maailma, kuigi me oleme kirjutatakse x nüüd.
Meil on salvestatud x vana väärtus meie tmp muutuja.
Nii et me suudaks swap järgmisele reale.
Flipping tagasi meie sülearvuti.
Nüüd jääb üle võtta sisu välja meie ajutine täisarv muutuja
ja salvestada need muutuja, mis elab aadressil, et b hoiab.
Nii et me ei kavatse tõhusalt dereference b, et saada ligipääsu muutuja
mis aadressil, et B omab see,
ja me ei kavatse kraami väärtus, mis tmp hoiab ta.
Flipping tagasi iPad veel kord.
Ma ei kustuta seda väärtust siin, 2,
ja selle asemel me kopeerida 1 õige asja.
Siis järgmisel real, mis täidab muidugi -
kui me flip tagasi sülearvuti - on see punkt 6,
mis on koht, kus me tahtsime, et meie diagramm täielikult täidetud.
Nii flipping tagasi iPad veel kord, lihtsalt et näeksite lõpetatud skeem,
näete, et meil on 10, 14 b, 1 tmp, 2 x, ja 1 a.
Kas on mingeid küsimusi selle kohta?
Kas see mõttekam, kes kõndis läbi selle?
Tee vähem mõtet? Loodetavasti mitte. Okei.
>> Näiturid on väga keeruline teema.
Üks noormees töötame koos on väga levinud ütlus:
"Selleks, et mõista suunanäitajaks, peate kõigepealt mõistma lähtekohtadeks."
Mis minu arvates on väga õige. See ei võta aega, et harjuda sellega.
Joonistus palju pilte, loosi mälu diagrammid nagu see on väga kasulik,
ja pärast sa suudad näiteks pärast näiteks pärast näiteks
see saab hakata tegema veidi rohkem mõistust ja veidi rohkem mõistust ja natuke rohkem mõistust.
Lõpuks ühel päeval, siis on see kõik täiesti selgeks.
Kõik küsimused enne kui me liigume edasi järgmise probleemi? Hea küll.
Nii flip tagasi sülearvuti.
Järgmine probleem on meil on probleem number 33 faili I / O.
Suumimiseks seda natuke.
Probleem 33 - Jah?
>> [Daniel] Ma lihtsalt pidin kiire küsimus. See täht või tärn,
seda nimetatakse viite mahavõtmine, kui kasutate tärniga enne.
Mis selle nimi on, kui te kasutate ampersand enne?
>> Ampersand enne on aadress-kasutaja.
Nii et olgem liikuda varundada.
Oih. Ma olen suum režiimis nii et ma ei saa tõesti liikuge.
Kui me vaatame seda koodi tõesti kiiresti siinsamas,
uuesti, sama asi juhtub.
Kui me vaatame seda koodi siin, sellel joonel, kus me helistada vahetada,
ampersandi lihtsalt ütlen "saada aadress, kus muutuja x elu."
Kui teie kompilaator kompileerib koodi,
see on tegelikult füüsiliselt tähistama koht mälus kõiki oma muutujate elada.
Ja mis siis kompilaator saab siis teha, kui see on koostatud kõike,
ta teab, "Oh, ma panen x aadressiga 10. panin y aadressil 14."
Seda saab siis täitke need väärtused teile.
Nii saab siis - see saab siis andke sellest ja liigu & y samuti.
Need kutid saada aadressi, kuid ka nemad, kui te kaotate need swap funktsiooni,
Seda tüüpi teavet, seda int * siinsamas, ütleb kompilaator,
"Okei, me lähme tuleb tõlgendada seda aadressi aadress täisarv muutuja."
Nagu aadress int, mis erineb aadress märk muutuja
sest int kulub, 32-bit masin, kulub 4 baiti ruumi,
arvestades iseloomu ainult kulub 1 bait ruumi.
Seega on oluline teada ka seda, mis on - mis elab, millist väärtust
elab aadressil, mis sai möödunud sisse
Või aadress, et olete tegelevad.
Nii, sa tead, kui palju baiti informatsiooni tegelikult koormus läbi oma RAM.
Ja siis, jah, see on käivitatav operaator, nagu sa küsisid,
läheb ja pääseb teavet konkreetse aadressi.
Nii ta ütleb, selle muutuja siit, ravida sisu nagu aadress,
minna sellele aadressile ja tõmmake, laaditakse protsessor, koorma ümber registreerima
tegelikke väärtusi või sisu, mis elada sellel aadressil.
Kas veel küsimusi? Need on head küsimused.
See on palju uut terminoloogiat liiga.
See on ka kuidagi kahtlane, nähes & ja * erinevates kohtades.
>> Hea küll.
Nii tagasi probleem 33 faili I / O.
See oli üks neid probleeme, mis minu arvates paar asja juhtunud.
Üks, see on suhteliselt uus teema.
See esitati üsna varsti enne viktoriin,
ja siis ma arvan, et see oli selline nagu üks neist sõna probleeme matemaatika
kus nad teile palju infot, aga sa tegelikult ei lõpuks võttes kasutada ton ta.
Esimene osa sellest probleemist on kirjeldada, mida CSV fail on.
Nüüd CSV-faili, vastavalt kirjeldusele, on komadega eraldatud väärtuste fail.
Põhjus need on üldse huvitav, ning põhjus, miks sa kunagi neid kasutada,
on, sest kui paljud teist on kunagi kasutatud asju Excel?
Joonis enamik teist on ilmselt või kasutab mingil hetkel oma elus.
Sa kasutad midagi Excel.
Selleks, et saada andmeid välja Exceli tabeli või teha mingit töötlemist sellega,
kui sa tahad kirjutada C programmi või Pythoni programm, Java programm,
tegelema andmed olete salvestanud sinna,
üks levinumaid viise, et saan seda välja on CSV-faili.
Ja saate avada Exceli ja kui lähete "Save As" dialoog,
saad välja tegelik CSV-faili.
>> Handy teada, kuidas lahendada need asjad.
Kuidas see toimib on see, et see on sarnane - ma mõtlen, see on sisuliselt imiteerib arvutustabeli,
kus, nagu me näeme siin, väga vasemmanpuolimmaista tükk,
meil on kõik perekonnanimed.
Nii et meil on Malan, siis Hardison ja seejärel Bowden, MacWilliam ja seejärel Chan.
Kõik perekonnanimi. Ja siis koma eraldab viimane nimed eesnime.
David, Nate, Rob, Tommy, ja Zamyla.
Olen alati segatakse Robby ja Tom.
Ja siis viimaks, kolmas tulp e-posti aadresse.
Kui sa mõistad, et ülejäänud programmi on üsna lihtne rakendada.
Mida oleme teinud selleks, et jäljendada seda sama struktuuri meie C programmi
on meil kasutada struktuuri.
Hakkame mängides need natuke rohkem ka.
Me nägime neid esimest natuke ka Ülesanded nr 3, kui olime tegelevad sõnastikke.
Aga see personal struct salvestab perekonnanimi, eesnimi ja e-posti.
Just nagu meie CSV faili salvestamiseks.
Nii et see on lihtsalt teisendamine ühest formaadist teise.
Me peame muutma, sel juhul töötaja struct arvesse liin,
komadega eraldatud liin, lihtsalt niisama.
Kas see on loogiline? Te kõik oleme võtnud viktoriin,
nii et ma kujutan ette, et teil on vähemalt oli mõnda aega mõtlema.
>> Kui rendi funktsioon, probleem palub meil võtta - we'll suurendada selle natuke -
võtta personali struktuur, personal struct, mille nimi on,
ja lisab selle sisu meie staff.csv faili.
Selgub, et see on üsna lihtne kasutada.
Me omamoodi mängida neid funktsioone veel natuke täna.
Aga sel juhul, fprintf funktsioon on tõesti võti.
Nii fprintf, saame trükkida, nagu kutid on kasutanud printf kogu see termin.
Võite printf rida faili.
Nii et selle asemel lihtsalt tegemise tavaline printf kõne, kus sa andsid selle stringi
ja siis asendada kõik muutuja järgmised argumendid,
koos fprintf, oma väga esimene argument on selle asemel fail, mida soovite kirjutada.
Kui me vaatame seda seadet, näiteks mees fprintf,
näeme vahe printf ja fprintf.
Ma suumida siin natuke.
Nii printf, anname selle stringi ja seejärel hilisemaid vaidlusi
kõik muutujad väljavahetamist või asendamist meie stringi.
Ning arvestades, fprintf esimene argument on tõepoolest seda faili * nimega oja.
>> Liikumine tagasi siia, et meie rent,
Meil on juba meie fail * oja avas meie jaoks.
Vot see esimene rida teeb, see avab staff.csv faili
see avab selle append mode ja kõik mis on jäänud meie jaoks teha, on
kirjuta personali struktuuri failile.
Ja vaatame, kas ma tahan kasutada iPad?
Ma kasutan iPadi. Meil on tühine - paneme selle lauale, et ma saaks kirjutada veidi paremini -
kehtetuks rendi ja see võtab ühe argumendina, personali struktuuri nimetatakse s.
Sai meie traksid, meil meie fail * nn faili
meil fopen rida meile antud,
ja ma lihtsalt kirjutan selle punktidena sest see on juba Vikipeedia.
Ja siis meie järgmisele reale, me ei kavatse helistada fprintf
ja me läheme edasi toimikust, et me tahame, et printida,
ja siis meie stringi, mis -
Ma annan teile kutid mulle kuidas see välja näeb.
Kuidas sinuga on, Stella? Kas tead, mida esimene osa stringi välja näeb?
[Stella] Ma pole kindel. >> Julgelt küsida Jimmy.
Kas sa tead, Jimmy?
[Jimmy] Kas see just viimane? Ma ei tea. Ma pole päris kindel.
>> Okei. Kuidas, ei keegi saada see õige kohta eksam?
No küll.
Tuleb välja, et siin kõik me peame tegema, et me tahame iga osa meie personali struktuur
tuleb välja printida kui string meie fail.
Me lihtsalt kasutada stringi asendamist iseloom kolmel erineval korda, sest meil on perekonnanimi
järgneb koma, siis eesnimi järgneb koma,
ja siis lõpuks e-posti aadress, millele järgneb - mis ei ole
paigaldamise minu ekraanil - kuid see järgneb reavahetus sümbol.
Nii et ma lähen kirjutan selle lihtsalt sinna.
Ja siis pärast meie stringi,
me lihtsalt peame vahetused, mis me pääsete ligi dot märke
et me nägime probleem set 3.
Saame kasutada s.last, s.first ja s.email
asendada neis kolmes väärtused meie stringi.
Nii et kuidas see läks? Mõtet?
Jah? Ei? Võimalik? Okei.
>> Viimane asi, mida me teeme, kui me oleme trükitud ja pärast oleme avanud meie faili:
kui oleme avanud faili, me peame alati meeles pidama sulgeda.
Sest muidu me lõpetame lekib mälu,
kasutades üles fail kirjeldustega.
Nii et sulgege see, mis funktsiooni meil kasutada? Daniel?
[Daniel] kirjutamisel? >> Kirjutamisel, täpselt.
Nii et viimane osa sellest probleemist oli korralikult sulgeda fail, kasutades kirjutamisel funktsioon,
mis lihtsalt tundub nii.
Mitte liiga hull.
Lahe.
Nii et see probleem 33 viktoriini.
Me peame kindlasti rohkem faili I / O tulemas.
Teeme natuke rohkem loeng täna, või punktis täna,
sest seda läheb moodustavad suurema osa sellest tulemas pset.
Liigume edasi tegema selles punktis. Jah?
>> [Charlotte]] Miks kirjutamisel (fail) asemel kirjutamisel (staff.csv)?
>> Ah. Sest tuleb välja, et - nii küsimus, mis on suur üks,
Seetõttu, kui me kirjutame kirjutamisel, me kirjalikult kirjutamisel (fail) täht muutuja
mitte faili nimi, staff.csv? Kas see on õige? Jah.
Võtame pilk. Kui ma saan tagasi oma sülearvuti,
ja vaatame kirjutamisel funktsioon.
Nii kirjutamisel funktsioon sulgeb oja ja ta võtab kursor oja, et me tahame sulgeda,
mitte tegeliku faili nimi, mida tahame sulgeda.
Ja seda sellepärast, kulisside taga, kui sa helistada fopen,
Kui avada faili, sa oled tegelikult eraldada mälu, et salvestada teavet faili.
Nii et teil on faili viitaja et on teavet faili,
nagu see on avatud, selle suurus, kus kasutaja parajasti asub fail,
nii et saad teha lugemine ja kirjutamine nõuab, et erilist aset faili.
Sa lõpuks sulgeda kursor sulgemise asemel faili nimi.
>> Jah? [Daniel] Nii et kasutada rendi, te ütlete - kuidas see saada kasutaja sisend?
Kas fprintf käitunud getString selles mõttes, et see lihtsalt ootama kasutaja sisend
ja palun kirjuta see - või ootama teil sisestada need kolm asja?
Või sa pead kasutama midagi rakendada rendi?
>> Jah. Nii et me ei ole - küsimus on, kuidas me saame kasutaja sisend
et rakendada rendi? Ja mis meil siin on helistaja rendileping
sooritanud käesoleva personal struct koos kõigi salvestatud andmete struct juba.
Nii fprintf on võimalik lihtsalt kirjutada, et andmed otse faili.
Pole oodanud kasutaja sisend.
Kasutaja juba antud panust korralikult panna see selline tööjõud struct.
Ja asjad, muidugi, murdub, kui mõni neist vihjeid oli null,
nii me kerige tagasi siia ja me vaatame meie struct.
Meil on stringi viimane, string esimene, string email.
Nüüd teame, et kõik need tõesti, kapoti alla, on char * muutujad.
See võib olla või mitte olla suunatud tühjaks.
Neid võib osutades mälu hunnik,
võibolla mälu pinu.
Me tõesti ei tea, kuid kui mõni neist suunistest ei null, või kehtetu,
et mis sa kindlasti krahhi meie rendi funktsioon.
See oli midagi, mis oli omamoodi väljuvad eksam.
Me ei muretse, et.
Suur. Okei. Nii liigub edasi viktoriini.
>> Olgem sulgeda see kutt, ja me ei kavatse vaadata pset 4.
Nii et kui te vaatate pset spec, kui pääsete siis, cs50.net/quizzes,
me ei lähe läbi mõned jagu probleemid täna.
Ma kerides - osa küsimusi algab kolmanda lehekülje pset spec.
Ja esimene osa küsib minna ja vaadata lühike suunates ja torud.
Milline oli selline jahe lühike, näitab teile mõned uued, jahe käsurea nippe, mida saab kasutada.
Ja siis on meil mõned küsimused teile samuti.
See esimene küsimus ojad, mille printf kirjutab vaikimisi
me liiki käsitlenud natuke hetk tagasi.
See fprintf et me just arutasime võtab toimikus * oja selle väitega.
kirjutamisel võtab toimikus * oja samuti,
ja tagastatav väärtus fopen annab sulle faili * oja samuti.
Põhjus, miks me ei ole näinud neid enne, kui oleme käsitlenud printf
seetõttu printf on vaikimisi oja.
Ja vaikimisi oja, mida ta kirjutab
saate teada lühikese.
Nii et kindlasti võtta pilk see.
>> Tänapäeva jagu, me ei kavatse rääkida natuke GDB,
sest mida rohkem kursis olete koos, seda rohkem praktikat saate koos,
paremini peate olema tegelikult jälile vigu oma koodi.
See kiirendab protsessi silumine üles tohutult.
Nii et kasutades printf, iga kord sa, et sa pead kompileeri kood,
teil on käivitada uuesti, mõnikord sa pead liikuma printf kõne ümber,
kommenteeri välja koodi, see lihtsalt võtab aega.
Meie eesmärgiks on proovida ja veenda teid, et koos gdb, saate sisuliselt
printf midagi kordagi oma koodi ja sa ei pea kunagi kompileeri see.
Sa ei pea kunagi alustada ja hoida aim kuhu printf kõrval.
Esimene asi, mida teha on kopeerida seda joont ja saada osa koodi off veebis.
Ma kopeerimine rida koodi, mis ütleb: "wget ​​http://cdn.cs50.net".
Ma lähen kopeeri see.
Ma lähen üle mu aparaat, suumida, nii et saate näha, mida ma teen,
kleepides see seal, ja kui ma Enter, see wget käsu sõna otseses mõttes on veebi saada.
See saab lammutama seda faili välja Interneti,
ja see läheb salvestage see jooksev kataloog.
Nüüd, kui ma oma praeguses kataloogis näete, et mul on see section5.zip fail otse seal.
Viis lahendada see kutt on unzip see,
mida saab teha käsurealt, just niimoodi.
Section5.zip.
See teeb unzip see, luua kausta minu jaoks,
paisutavad kogu sisu, panna neid seal.
Nii et nüüd ma ei saa minna oma 5. jagu kataloogi kasutades cd käsu.
Ekraani tühjendamiseks kasutades selge. Nii selge ekraan.
Nüüd ma sain kena puhas terminali tegeleda.
>> Nüüd, kui ma loetleda kõik failid, et ma näen selle kataloogi,
näed, et mul on neli faili: buggy1, buggy2, buggy3 ja buggy4.
Ma sain ka oma vastava. C faile.
Me ei kavatse vaadata. C failid nüüd.
Selle asemel, me ei kavatse kasutada neid siis, kui me avada GDB.
Me oleme hoidnud neid umbes nii, et meil on juurdepääs lähtekoodi kui me kasutame GDB,
kuid Eesmärk on see osa osa on käpard ringi GDB
ja kuidas me seda kasutada aru saada, mis on valesti koos nende nelja lollakas programmid.
Nii et me lihtsalt läheb mööda tuba ringi tõesti kiiresti,
ja ma küsin keegi joosta üks lollakas programme,
ja siis läheme rühmana läbi GDB, ja me näeme, mida me saame teha, et määrata nende programmide
või vähemalt selgitada, mis toimub vale igaühes neist.
Alustame siin koos Daniel. Kas sa jooksed buggy1? Vaatame, mis juhtub.
[Daniel] See ütleb, et taotluse süü. >> Jah. Täpselt.
Nii et kui ma saan buggy1, saan SEG süü.
Sel hetkel, ma võiks minna ja avada buggy1.c,
proovida aru saada, mis toimub vale,
aga üks ebameeldiv asju selle seg süü viga
on see, et see ei ütle teile, mida rida programmi asjad tegelikult läks valesti ja murdis.
Sa mingi pead vaatama kood
ja nuputada kasutades oletus ja kontrollida või printf et näha, mis toimub vale.
Üks lahedam asju GDB on, et see on tõesti väga lihtne
välja mõtlema joon, mis teie programm jookseb kokku.
See on täiesti väärt, et seda kasutada, isegi kui lihtsalt selle eest.
Nii käivitamisel GDB, writing GDB, ja siis ma annan talle teed käivitatava et ma jooksen.
Siin ma olen masinakirja gdb ./buggy1.
Enter. Annab mulle kõik see autoriõiguse info,
ja siin all näete seda rida, mis ütleb: "Lugemine sümbolid / home /
jharvard/section5/buggy1. "
Ja kui kõik hästi läheb, näete see välja printida sõnum mis näeb välja selline.
Seda saad lugeda sümbolid, siis saad öelda "Ma loen sümboleid oma käivitatava faili"
ja siis see on see "tehtud" sõnum siia.
Kui näed mõne muu variant see, kui sa näed seda ei leidnud sümboleid
või midagi sellist, mida see tähendab, et sa lihtsalt ei ole koostanud oma käivitatava korralikult.
Kui oleme kompileerida programme kasutamiseks GDB, peame kasutama, et erilist-g lipp,
ja see on tehtud vaikimisi, kui sa kompileerida programme, vaid käsuga make
või teha lollakas või muuta tagasi, mõni neist.
Aga kui sa oled koostamise käsitsi rõkkama, siis pead minema ja lisada, et-g lipp.
>> Sel hetkel, nüüd, et meil on meie GDB kiire,
see on üsna lihtne käivitada programmi.
Me tippida kas run, või saame lihtsalt kirjutada r.
Enamik GDB käske saab lühendada.
Tavaliselt ainult ühe või paar kirja, mis on päris kena.
Nii Saad, kui tipite r ja vajuta Enter, mis juhtub?
[Saad] Ma sain SIGSEGV, killustatust süü, ja siis kõik see mitmesugused märgid.
>> Jah.
Nagu me näeme ekraanil kohe ja nagu Saad ütles,
kui me tüüpi katse või r ja vajuta Enter, me ikka sama SEG süü.
Nii et kasutades GDB ei lahenda meie probleemi.
Aga see annab meile mõned mitmesugused märgid, ja selgub, et see mitmesugused märgid
tegelikult ütleb meile kus see toimub.
Sõeluda see natuke, see esimene natuke on funktsioon, kus kõik läheb valesti.
Seal on see __ strcmp_sse4_2, ja see ütleb meile, et see juhtub ka seda pilti
nimetatakse sysdeps/i386, kõik see omakorda paras segadus - kuid rida 254.
See on selline raske sõeluda. Tavaliselt, kui näed selliseid asju,
see tähendab, et see on seg faulting ühes süsteem raamatukogudes.
Nii et midagi pistmist strcmp. Te näinud strcmp enne.
Mitte liiga hull, kuid kas see tähendab, et strcmp on katki või et seal on probleem strcmp?
Mis sa arvad, Alexander?
[Aleksandr] Kas see on - on 254 rida? Ja - mitte binaarne, kuid see ei ole nende laed,
ja siis seal on muus keeles iga funktsiooni. Kas see 254, et funktsioon, või -?
>> See on liin 254. Tundub selles. Toimikule, nii et see on koost kood ilmselt.
>> Aga ma arvan, pakilisemaks asi on, sest me oleme saanud SEG süü,
ja tundub, et see on pärit strcmp funktsioon,
tähendab see siis, et strcmp on katki?
See ei tohiks loodetavasti. Nii lihtsalt, sest sa oled killustatust süü
ühes süsteem toimib, tavaliselt see tähendab, et sa lihtsalt ei kutsunud seda õigesti.
Kiireim asi, mida teha, et aru saada, mis tegelikult toimub
kui sa näed midagi hullu nagu see, kui sa näed SEG süü,
eriti kui teil on programm, mis on kasutades midagi enamat kui lihtsalt põhiline,
on kasutada tagasijälitust.
Ma lühendada tagasijälitust kirjutades BT, mitte täis tagasijälitust sõna.
Aga Charlotte, mis juhtub, kui tipite bt ja vajuta Enter?
[Charlotte] See näitab mulle kaks rida, rida 0 ja rida 1.
>> Jah. Nii rida 0 ja rida 1.
Need on tegelikud korstnat raamid, mis olid praegu mängu, kui teie programm jooksis kokku.
Alates tähtsaim raam, raam 0, ja läheb kõige alumisel, mis on frame 1.
Meie tähtsaim raam on strcmp raam.
Sa ei mõtle seda kui sarnane probleem me lihtsalt teeme viktoriin suunanäitajaks,
kus meil oli vahetada freimi peal peamised freimi,
ja meil oli muutujate et vahetuslepingu kasutades peal muutujate et peamine oli kasutades.
Siin meie crash juhtus meie strcmp funktsioon, millele kutsuti Meie peamine funktsioon,
ja tagasijälitust annab meile mitte ainult funktsioone, kus asjad ei õnnestunud,
aga see on ka ütleb meile kus kõik oli välja kutsutud.
Nii et kui ma leidke üle veidi rohkem paremale,
näeme, et jah, me olime line 254 see strcmp-sse4.s faili.
Aga kõne oli tehtud buggy1.c, rida 6.
See tähendab, me saame teha - on meil võimalik lihtsalt minge vaadake ja vaadake, mis toimub
kell buggy1.c, rida 6.
Jällegi on paar võimalust seda teha. Üks on väljuda GDB
või on teie kood avaneb teises aknas ja ristviidetega.
See, ja iseenesest on päris mugav, sest nüüd, kui sa oled tööaega
ja sul SEG süü ja oma TF inimest ei tea, kus kõik oli purustamine,
võid lihtsalt öelda: "Oh, rida 6. Ma ei tea, mis toimub,
kuid midagi rida 6 põhjustab minu programm murda. "
Teine viis seda teha on saate selle käsu nimeks nimekiri GDB.
Võite lühendada seda l.
Nii et kui me tabanud l, mis me saame siin?
Me saame terve hulk veidraid asju.
See on tegelik montaaž kood
mis on strcmp_sse4_2.
See näeb välja selline funky,
ja miks me hakkame seda sellepärast kohe,
GDB on meid raam 0.
>> Nii et millal me vaatame muutujad, igal ajal vaatame lähtekoodi,
me vaatame lähtekoodi, mis puudutab freimi me oleme praegu sisse
Nii et saada midagi sisukat, peame
liikuda freimi et mõttekam.
Sel juhul peamine freimi oleks veidi rohkem mõistust,
sest see oli tegelikult kood, mis on kirja pandud.
Ei strcmp kood.
Nii saate liikuda raamide vahel, antud juhul, sest meil on kaks,
meil on 0 ja 1,
Sa teed seda üles ja alla käske.
Kui ma liikuda ühe raami,
nüüd ma olen peamine freimi.
Ma ei liiguta alla minna tagasi sinna, kus ma olin,
tõusevad jälle, minna uuesti ja minge uuesti.
Kui te kunagi teha oma programmi GDB, saad crash, saad tagasijälituse
ja te näete, et see on mõne faili, et sa ei tea, mis toimub.
Sa püüad nimekirja, kood ei tundu sulle tuttav,
kui heita pilk oma raamid ja aru saada, kus sa oled.
Sa oled ilmselt vales freimi.
Või vähemalt sa oled freimi, mis ei ole üks, et saate tegelikult siluda.
Nüüd, kui me oleme asjakohane freimi, me oleme pea-,
nüüd saame kasutada nimekirja käsk välja mõelda, mida liin oli.
Ja te näete seda, see trükitud on meie jaoks siin.
Kuid me ei tabanud loetleda kõik sama, ja loetelu annab meile selle kena väljatrükk
tegeliku lähtekoodi, mis toimub siin.
>> Eelkõige saame vaadata rida 6.
Saame näha, mis siin toimub.
Ja tundub, et me teeme sõnede
vahel string "CS50 kivid" ja argv [1].
Midagi see oli krahh.
Nii Missy, kas teil on mõtteid, mida võiks siin toimub?
[Missy] Ma ei tea, miks see on krahh. >> Sa ei tea, miks see on krahh?
Jimmy, kõik mõtted?
[Jimmy] Ma pole päris kindel, aga viimane kord, kui me kasutada string võrrelda
või strcmp, meil oli nagu kolm erinevat juhtumit kohaselt.
Meil ei olnud ==, ma ei usu, õigus, et esimene rida.
Selle asemel oli jagatud kolme, ja üks oli == 0,
üks oli <0, ma arvan, ja üks oli> 0.
Nii et äkki midagi sellist? >> Jah. Nii et see küsimus
ja me teeme võrdluse õigesti?
Stella? Kõik mõtted?
[Stella] Ma pole kindel. >> Ei tea. Daniel? Mõtted? Okei.
Tuleb välja, mis toimub just siin on, kui me jooksime programmi
ja me saime SEG süü, kui sa jooksid programmi esmakordselt, Daniel,
sa anna see mingeid käsurea argumente?
[Daniel] No >> Ei Sel juhul, milline on väärtus argv [1]?
>> Ei ole väärtus. >> Õigus.
Noh, ei ole asjakohane stringi väärtus.
Aga seal on mingi väärtus. Mis on väärtus, mida saab ladustada seal?
>> Prügi väärtus? >> See on kas prügi väärtus või, sel juhul
aasta lõpuks argv array alati lõpetada null.
Mis siis tegelikult sai salvestatud on null.
Teine viis seda lahendada, mitte mõelda läbi,
on printige see välja.
See on koht, kus ma ütlesin, et kasutades GDB on suur,
sest saad välja printida kõik muutujad, kõik väärtused, mida soovite
kasutades seda mugav-dändi lk käsk.
Nii et kui ma tüüpi p ja siis ma tippige väärtus muutuja või nimi muutuja,
öelda, argc, ma näen, et argc 1.
Kui ma tahan välja printida argv [0], võin seda teha just niimoodi.
Ja nagu me nägime, argv [0] on alati oma programmi nime,
alati täitmisfaili nimi.
Siin näed see sai täis tee nime.
Võin ka välja printida argv [1] ja vaata, mis juhtub.
>> Siin saime selline müstiline väärtus.
Meil on see 0x0.
Mäleta alguses perspektiivis, kui me rääkisime kuuteistkümnendnumbriga?
Või et vähe küsimuse lõpus pset 0 kuidas esindavad 50 kuueteistkümnendsüsteemis?
Kuidas me kirjutame hex numbrid CS, lihtsalt ajage end
koos kümnendkraadides, on meil alati eesliide neid 0x.
Nii et see 0X alati tähendab lihtsalt tõlgendama järgmist numbrit kuueteistkümnendarvuna,
ei ole nii string, mitte kümnendmurruna, mitte binaarne number.
Kuna kohtade arv 5-0 on kehtiv number kuueteistkümnendsüsteemis.
Ja see number kümnendsüsteemis, 50.
Nii et see on lihtsalt kuidas me disambiguate.
Nii 0x0 tähendab kuueteistkümnendsüsteemi 0, mis on ka koma 0, binaarne 0.
See on lihtsalt väärtus 0.
Selgub, et see on see, mis null on, tegelikult mällu.
Null on lihtsalt 0.
Siin element hoida argv [1] on null.
Nii me üritame võrrelda meie "CS50 kivid" string null string.
Nii viite mahavõtmine null, üritavad pääseda asju null,
need on tavaliselt läheb põhjustada mingi killustatust süü või muude halbu asju juhtuda.
Ja selgub, et strcmp ei vaadata
kas olete sooritanud väärtus, mis on null.
Pigem on see lihtsalt läheb edasi, püüab teha oma asja,
ja kui see seg vigu, see seg vead, ja see on sinu probleem. Sa pead minema seda parandada.
Tõesti kiiresti, kuidas võiks meil probleemi lahendada? Charlotte?
[Charlotte] Saate vaadata kasutades kui.
Nii et kui argv [1] on null, == 0, siis return 1, või midagi [arusaamatu].
>> Jah. Nii et see on üks suurepärane võimalus seda teha, kui me saame vaadata,
väärtus me parasjagu lähevad strcmp, argv [1], on see tühjaks?
Kui see on null, siis võib öelda, okei, katkestan.
>> Rohkem levinum viis seda teha on kasutada argc väärtus.
Näete siin alguses peamine,
me jätta, et esimese katse, et me tavaliselt teeme, kui meil kasutada käsurea argumente,
mis on katsetada, kas meie argc väärtus on see, mida me ootame.
Sel juhul me ootame vähemalt kaks argumenti,
programmi nimi pluss mõni teine.
Sest me oleme umbes kasutada teist argumenti siin.
Nii et kellel mingi test eelnevalt, enne meie strcmp kõne
et testid kas argv on vähemalt 2, oleks ka teha sama asi.
Saame näha, kas see toimib töötab programm uuesti.
Võite alati taaskäivitada programmi raames GDB, mis on tõesti kena.
Võite käivitada, ja kui te kaotate argumenteerides oma programmi,
te kaotate neid kui helistate joosta, mitte siis, kui sa boot up GDB.
Nii saate hoida tuginedes oma programmi erinevate argumentide iga kord.
Nii joosta, või jälle, ma ei kirjuta r, ja vaatame, mis juhtub, kui me kirjutame "tere".
Ta on alati küsida, kas te soovite alustada seda algusest peale uuesti.
Tavaliselt sa ei taha alustada seda algusest peale uuesti.
Ja sel hetkel, see taaskäivitub uuesti, siis prindib välja
programm, mis meil töötab, buggy1, väitega, tere,
ja ta prindib selle standardi välja, see ütleb: "Sa saad D," kurb nägu.
Aga me ei seg süü. Ta ütles, et protsessi lahkus tavaliselt.
Nii et tundub päris hea.
Enam SEG süü, me tegime seda minevikus,
nii tundub see oligi SEG süü bug, et me ei saada.
Kahjuks see ütleb meile, et me saada D.
>> Me ei saa minna tagasi ja vaadata koodi ja vaata, mis siin toimub
aru saada, mis oli - miks ta rääkis meile, et me saime D.
Vaatame, siin oli see printf öeldes, et sul D.
Kui me kirjutame nimekirja, nagu te hoida kirjutades nimekiri, see hoiab itereerimise allapoole läbi oma programmi,
seega näitan sulle paar esimest rida oma programmi.
Siis näitan sulle paari rida ja järgmine patakas ja järgmise tüki.
Ja see üritame edasi minna.
Ja nüüd me jõuame "liin number 16 on väljaspool lubatud piire."
Sest see on ainult 15 rida.
Kui sa saad selle punkti ja teie ei tea, "Mida teha?" saate aidata käsk.
Kasutage aidata ja anda sellele nime käsk.
Ja näed GDB annab meile kõigile sedasorti kraam.
See ütleb: "Kellel ei ole argument, loetletakse kümme rida pärast või umbes eelmise noteerimist.
Nimekiri - loetleb kümme rida enne - "
Nii et proovime kasutades nimekiri miinus.
Ja mis loetleb 10 rida eelmine; saate mängida nimekiri natuke.
Võite teha nimekirja, nimekiri -, siis võib isegi anda loetleda, nagu nimekiri 8,
ja see saab nimekirja 10 rida umbes rida 8.
Ja näed, mis siin toimub on sul lihtne kui teine.
Kui kirjutad CS50 kaljud, see prindib välja "Sa saad A."
Muidu prindib välja "Sa saad D."
Jama linn. Hea küll. Jah?
>> [Daniel] Nii et kui ma proovinud teha CS50 kivid ilma jutumärkideta,
ta ütleb: "Sa saad D."
Mul oli vaja hinnapakkumisi saan seda teha, siis miks see nii on?
>> Jah. Selgub, et kui - see on üks lõbus vähe tidbit -
kui käivitate programmi, kui võtame seda ja me kirjuta CS50 kivid,
nagu Daniel ütles ta tegi, ja vajutad Enter,
see ikka ütleb, saame D.
Ja küsimus on, miks see nii on?
Ja selgub, et nii meie terminali ja GDB sõeluda need kahe eraldi argumendid.
Sest kui seal on ruumi, et vaikiv kui
Esimene argument lõppenud, järgmine väide on algamas.
Kuidas ühendada need kaheks või kahju, ühte argumenti,
on kasutada hinnapakkumisi.
Nii et nüüd, kui me pane see hinnapakkumisi ja käivitage see uuesti, saame A.
Nii lihtsalt sulgege, ilma jutumärkideta, CS50 ja kivimid sõeluda kahe eraldi argumendid.
Mis hinnapakkumisi, see on sõeluda ühe argumendina kokku.
>> Me näeme seda murdepunkti.
Siiani oleme käinud meie programm ja see on kestnud
kuni kas see seg vead või tabamust viga
või kuni ta lahkus ja kõik on täiesti korras.
See ei ole tingimata kõige kasulikum asi, sest mõnikord
teil viga oma programmi, kuid see ei põhjusta killustatust süü.
See ei põhjusta oma programmi lõpetada või midagi sellist.
Võimalus saada GDB peatada oma programmi kindla punkti
on määrata murdepunkti.
Võite seda teha, luues katkestuspunkti funktsiooni nimi
või saate määrata murdepunkti konkreetse rida koodi.
Mulle meeldib seada katkestuspunkte funktsioonide nimed, sest - lihtne meeles pidada,
ja kui te tegelikult minema ja muuta oma lähtekoodi kuni natuke,
siis oma murdepunkti tegelikult peatuda sama koht oma koodi.
Arvestades, kui te kasutate rida numbreid ja reanumbrite muuta
sest sa lisada või kustutada mingi kood, siis oma murdepunktid on kõik täiesti silmamunad.
Üks kõige tavalisemaid asju, mida ma tegema, on määrata murdepunkti kohta põhiülesanne.
Tihti ma käivitamisel GDB, ma Tüüp B peamine, Enter, ja et paned murdepunkti
aasta põhiülesandeks mis lihtsalt ütleb, "Paus programmi niipea kui hakatakse,"
ja nii, kui ma saan oma programmi, ütlevad, CS50 kivid nagu kaks argumenti
ja vajuta Enter, see jõuab põhiülesanne ja see peatub on kõige esimene rida,
Vahetult enne seda hindab strcmp funktsioon.
>> Kuna ma peatatud, nüüd saan hakata mucking ringi ja näeme, mis toimub
kõik eri muutujaid on läinud minu programm.
Siin võin välja printida argc ja vaata mis toimub.
Vaadake, et argc on 3, sest see on 3 erinevaid väärtusi ta.
See ju programmi nime, see sai esimene argument ja teine ​​argument.
Me ei saa printida need välja vaadates argv [0], argv [1] argv [2].
Nüüd saate ka aru, miks see strcmp kõne läheb pankrotti minna,
sest te näete, et ta ei lahku CS50 ja kivid kaheks eraldi argumendid.
Sel hetkel, kui olete tabanud murdepunkti, võite jätkata sammult läbi oma programmi
rida-realt, mitte alustada oma programmi uuesti.
Nii et kui te ei taha, et alustada oma programmi uuesti ja jätkake edasi siit,
saate jätkamisnupu käsu ja jätkuvalt kestab programm kuni lõpuni.
Just nagu ta tegi siin.
Samas, kui ma taaskäivitage programm, CS50 kaljud, see tabab mu murdepunkti uuesti,
ja seekord, kui ma ei taha lihtsalt minna kogu tee läbi ülejäänud programmi
Oskan kasutada järgmise käsu, mida ma ka lühendada n.
Ja see sammult läbi programmi rida-realt.
Nii saab vaadata, kui asjad teostada, kui muutujate muutused, nagu asjad ajakohastada.
Milline on päris kena.
Teine lahe asi on mitte korrata sama käsu üle ja ikka ja jälle,
kui sa just Enter - nii siin näete ma ei ole sisestatud midagi -
kui ma lihtsalt Enter, siis korrake eelnevaid käsk,
või eelmise GDB käsk, et ma lihtsalt panna sisse
Ma saan hoida Enterin ja see hoiab astutakse läbi minu koodi rida realt.
Ma kutsun teid poisid minna Tutvu teiste lollakas programmid samuti.
Meil ei ole aega, et saada läbi kõik need täna jaos.
Lähtekood on olemas, nii et saate sellist näha, mis toimub
kulisside taga kui sa tõesti ummikus,
kuid vähemalt, lihtsalt harjutada käivitamist kuni GDB,
töötab programm kuni see puruneb teile,
saada tagasijälituse figuring mida toimida crash oli,
Mis liin see oli, trüki välja mõned muutuja väärtused,
lihtsalt nii saad tunda seda, sest see tõesti aitab teil läheb edasi.
Sel hetkel, me ei kavatse loobuda välja GDB, mis te kasutate loobuda või lihtsalt q.
Kui teie programm on keset töötab ikka, ja see ei ole väljunud,
see alati küsida: "Oled sa kindel, et sa tõesti soovid väljuda?"
Sa võid tabanud jah.
>> Nüüd läheme vaatame järgmine probleem meil, mis on kass programmi.
Kui te vaatate lühike suunates ja torud, näete, et Tommy kasutab seda programmi
et põhimõtteliselt prindib kõik väljund faili ekraanil.
Nii et kui ma saan kassi, see on tegelikult sisseehitatud programmi aparaat,
ja kui sul on Mac, mida saate teha seda Mac liiga, kui te avada terminal.
Ja meil - Kass, oletame, cp.c ja vajuta Enter.
Mis see oli, kui me liikuge üles natuke ja vaadake, kus me jooksime liin,
või kui me jooksime kass käsu, siis sõna otseses mõttes lihtsalt välja printida sisu cp.c meie ekraanil.
Me võime kasutada seda uuesti ja saab panna mitu faili korraga.
Nii saate teha kass cp.c, ja siis saame ka concatenate cat.c faili
mis on programmi me parasjagu kirjutan,
ja see saab printida nii faile seljad meie ekraanil.
Nii et kui me liikuge üles natuke, näeme, et kui me jooksime sellele kassile cp.c, cat.c,
kõigepealt välja trükkida cp fail ja seejärel allapoole, see välja trükkida cat.c faili siinsamas.
Me ei kavatse kasutada seda lihtsalt saada meie jalad märjaks.
Mängida lihtne trükkimine terminali, kuidas see toimib.
Kui te avada koos gedit cat.c, Enter,
näete programm, mis me parasjagu kirjutad.
Lisasime seda kena boiler plaat, nii et me ei pea kulutama aega kirjutades kõik läbi.
Samuti kontrollida argumentide arv möödunud sisse
Trükime välja kena kasutamise õpetust.
>> See on selline asi, et jälle, nagu me oleme rääkinud,
see on peaaegu nagu lihaste mälu.
Pea meeles pidama teevad sama sorti kraami
ja alati printida mingi kasulik sõnum
et inimesed teaksid, kuidas käivitada oma programmi.
Mis kass, see on üsna lihtne, me lihtsalt läheb minema läbi kõik erinevad argumendid
et võeti vastu meie programmi, ja me lähme välja printida
nende sisu läbi ekraani ühe korraga.
Et printida faile välja ekraan, me teeme midagi väga sarnast
mida me tegime lõpus viktoriin.
Lõpus viktoriin, et palgata programmi, oli meil avada faili
ja siis me pidime printida.
Sel juhul me ei kavatse avada fail ja me ei kavatse lugeda tema asemel.
Siis me lähme välja printida, selle asemel et faili, me ei kavatse printida ekraanil.
Nii trükkimine ekraanile olete kõik teinud enne koos printf.
Nii et ei ole liiga hull.
Aga lugemine fail on kuidagi imelik.
Me läheme läbi, et natuke korraga.
Kui te minna tagasi, et viimane probleem oma viktoriin, probleem 33
Esimene rida, et me teeme siin, failide avamisega, on väga sarnane sellega, mida me seal tegime.
Nii Stella, mida see rida välja nägema, kui me avame faili?
[Stella] Capital FILE *, faili - >> Okei. >> - On võrdne fopen. >> Yup.
Milline on sel juhul? See on kommentaari.
>> See on kommentaar? argv [i] ja r?
>> Täpselt. Väga hea. Nii Stella on täiesti õigus.
See on see, mida joon välja näeb.
Me ei hakka faili oja muutuja, siis hoia teda FILE *, nii et kõik mütsid,
FAIL, *, ja nime see muutuja on fail.
Me võiksime seda nimetada mida iganes me tahame. Me võiksime seda nimetada first_file või file_i, mida me tahaksime.
Ja siis faili nimi oli möödunud aastal, kui anda käsureal antud programmi.
Nii et see on salvestatud argv [i,] ja siis me läheme, et avada see fail lugeda režiimis.
Nüüd, kui oleme avanud faili, mis on asi, mida me peame alati meeles pidama, mida teha
kui oleme avanud faili? Sule ta.
Nii Missy, kuidas me sulgeda fail?
[Missy] kirjutamisel (fail) >> kirjutamisel (fail). Täpselt.
Suur. Okei. Kui me vaatame seda tegema kommentaar siin,
ta ütleb, "Avatud argv [i] ja printida oma sisu standardväljundisse."
>> Standard läbi on imelik nimi. Stdout on lihtsalt meie viis öelda
tahame seda trükkida terminali; me tahame prindi see standard väljund vool.
Me ei saa tegelikult lahti saada see kommentaar siin.
Ma lähen kopeeri see ning kleebi see sest see on, mida me tegime.
Sel hetkel, nüüd on meil lugeda faili vähehaaval.
Me oleme arutanud paar võimalust lugeda faile.
Millised on Sinu lemmikud siiani?
Mis moel olete näinud või kas sa mäletad, lugeda faile?
[Daniel] fread? >> Fread? Nii fread on üks. Jimmy, kas sa tead mis tahes teised?
[Jimmy] No >> Okei. Nope. Charlotte? Alexander? Kõik teised? Okei.
Nii et teised on fgetc, on üks, mis me kasutame palju.
Seal on ka fscanf; te nägite skeemi?
Nad kõik algavad f. Midagi pistmist faili.
Seal on fread, fgetc, fscanf. Need on kõik lugemine ülesandeid.
Kirjutamiseks meil ümbernimetamisel nimega, meil on fputc asemel fgetc.
Meil on ka fprintf meeldib nägime viktoriini.
Kuna see on probleem, mis hõlmab lugemise failist
me ei kavatse kasutada ühte neist kolm funktsiooni.
Me ei kavatse kasutada neid funktsioone siia alla.
Need funktsioonid on kõik leitud standard I / O teek.
Nii et kui te vaatate üles selle programmi,
te näete, et me oleme juba päis faili standard I / O teek.
Kui me tahame aru saada, milline neist tahame kasutada,
saame alati avada mees lehekülge.
Nii saame tüüpi inimene stdio
ja lugeda kõike stdio sisend ja väljund funktsioonid C.
Ja me võime juba näha, oh, vaata. See viitavad fgetc, see viitavad fputc.
Nii saab puurida veidi allapoole ja vaadata, ütleme, fgetc
ja pilk oma meest lehel.
Te näete, et see läheb koos terve hunnik muid funktsioone:
fgetc, fgets, getc, getchar, saab, ungetc ja selle sisend tähemärki ja stringid.
Nii et see on see, kuidas me lugeda märke ja strings faile standardsete sisend,
mis on sisuliselt kasutaja.
Ja see, kuidas me teeme seda tegelikku C.
Nii et see ei kasuta getString ja getchar funktsioonid
et me kasutasime alates CS50 raamatukogu.
Me teeme seda probleemi paar võimalust
nii et näete kahte moodi seda teha.
Nii fread funktsiooni, et Daniel mainitud ja fgetc on hea, kuidas seda teha.
Ma arvan fgetc on veidi lihtsam, sest see on ainult, nagu näete,
üks argument, FILE *, et me üritame lugeda tegelasele,
ja selle tagastatav väärtus on int.
Ja see on natuke segane, eks?
>> Sest me saada iseloomuga, siis miks mitte seda edasi-tagasi char?
Te on mingeid ideid, miks see ei pruugi naasta char?
[Missy vastuseid, arusaamatult] >> Jah. Nii et Missy on täiesti õigus.
Kui see on ASCII, siis see täisarv võiks kaardistada tegelik char.
Võiks olla ASCII, ja see on õige.
See on täpselt, mis toimub.
Me kasutame int lihtsalt kuna see on rohkem bitte.
See on suurem kui char; meie char on ainult 8 bitti, et 1 bait meie 32-bit masinad.
Ja int on kõik 4 baiti väärtuses ruumi.
Ja selgub, et viis fgetc töötab,
kui me keri meie ülevaade sellest inimesest leht natuke,
liikuge kogu tee alla. Selgub, et nad kasutavad seda erilist väärtust nimetatakse EOF.
See on eriline püsiv tagastatav väärtus fgetc funktsioon
kui vajutad faili lõppu või kui teil viga.
Ja selgub, et teha neid võrdlusi EOF õigesti,
sa tahad olla, et pildi hulgal teavet, et teil on int
mitte kasutada char muutuja.
Kuigi fgetc on tegelikult saada tegelasele faili
sa tahad meeles pidada, et see on tagasi midagi, mis on tüüpi int teile.
See ütles, see on üsna lihtne kasutada.
See läheb meile iseloomu; nii et kõik me peame tegema, on hoida küsib faili
"Anna mulle järgmine sümbol ja mulle järgmise sümboli, anna mulle järgmine sümbol"
kuni jõuame faili lõppu.
Ja see tõmbab ühe märgi korraga meie faili
ja siis saame teha mida iganes me tahame seda.
Me võime seda säilitada, saame lisada see nöör, saame printida.
Kas midagi sellist.
>> Suurendamine tagasi välja ja läheb tagasi meie cat.c programmi
kui me ei kavatse kasutada fgetc,
kuidas võiks me läheneme sellele järgmine rida koodi?
Me ei kavatse kasutada - fread teeme midagi veidi teistsugune.
Ja seekord me lihtsalt kavatse kasutada fgetc saada üks täht korraga.
Töödelda kogu fail, mida võiks me peame tegema?
Mitu tegelased on seal fail?
Seal on palju. Nii et sa ilmselt tahad saada üks
ja siis saad teise ja saad teise ja saad teise.
Millist algoritmi sa arvad me võib-olla kasutama siin?
Mis tüüpi -? [Aleksandr] loop? >> Täpselt.
Mõned tüüpi silmus.
Jaoks silmus on tegelikult suur, käesoleval juhul.
Ja nagu sa ütlesid, et see kõlab nagu sa tahad silmus üle kogu faili
saada täht korraga.
Kõik ettepanekud, mida see tunduda?
[Alexander, arusaamatult]
>> Okei, ütle mulle inglise keeles, mida sa üritad teha? [Alexander, arusaamatult]
Nii et antud juhul see kõlab nagu me püüame lihtsalt silmus üle kogu toimikule.
[Aleksandr] Nii et ma > Suurus -?
Ma arvan, et faili suurus, eks? Suurus - we'll lihtsalt kirjutan selle niimoodi.
Suurus Faili praegu, i + +.
Nii tuleb välja, et kuidas sa seda kasutades fgetc, ja see on uus,
on see, et seal ei ole lihtne lihtsalt saada suuri faile
Selle "sizeof" tüüpi ehitada, et olete näinud.
Kui me kasutame, et fgetc funktsioon, me kehtestada mingi
uus, funky süntaksit seda juurutamisega, kui selle asemel just põhilised counter
minna tähemärgi haaval, me ei kavatse tõmmata üks märk korraga,
üks märk korraga, ja seda, kuidas me teame, et me oleme lõpus
ei ole, kui me oleme arvestatakse teatud arvu märke,
aga kui iseloomu me tõmmake see, et erilist faili lõppu iseloomu.
Nii saame seda teha - Ma nimetan seda ahels, ja me ei kavatse vorminda
meie esimene kõne, et saada esimene märk välja faili.
Nii et see osa siin, see ei hakka iseloomu välja fail
ja salvestada see muutuja ch.
Me läheme seda enam teha kuni jõuame faili lõppu,
mis me teeme, tehes katse iseloomu ei ole võrdne, et erilist EOF iseloomu.
Ja siis selle asemel teeme ahels + +, mis lihtsalt juurdekasvu väärtus,
nii et kui me loeme välja fail, kapital, ütleme,
ahels + + annaks meile b, ja siis me saame c ja siis d.
See on selgelt mitte seda, mida me tahame. Mida me tahame siin
Viimasel bit me tahame saada järgmise sümboli failist.
>> Niisiis, kuidas võiks me saada järgmise sümboli failist?
Kuidas me saame esimese märgi failist?
[Student] fgetfile? >> Fgetc, või, vabandust, sa olid täiesti õigus.
Ma kirjavigadega seda seal. Nii et jah.
Siin asemel teeb ahels + +,
me lihtsalt läheb helistada fgetc (faili) uuesti
ja salvesta tulemus meie samasse ahels muutuja.
[Student küsimus, arusaamatult]
>> See on koht, kus need FILE * mehed on eriline.
Kuidas nad töötavad, on nad - kui te esimest korda avada - kui te esimest korda teha, et fopen kõne
FILE * tõhusalt toimib kursor faili algusest.
Ja siis iga kord, kui helistada fgetc, ta liigub ühe märgi abil faili.
Nii et kui te nimetate seda, sa incrementing faili viitaja ühe märgi.
Ja kui sa fgetc jälle, et sa kolid see teine ​​märk
ja veel üks tegelane ja teise iseloomu ja teine ​​iseloomu.
[Student küsimus, arusaamatult] >> Ja see on - jah.
See on selline see maagiline kapoti alla.
Sa muudkui incrementing kaudu.
Sel hetkel, sa oled võimeline tegelikult töötavad iseloomu.
Niisiis, kuidas võiks meil prindi see välja ekraan, nüüd?
Me võime kasutada sama printf asi, mida me varem kasutanud.
Et oleme kasutanud kõiki poolaastal.
Saame kõne printf,
ja me edastame ka märk just niimoodi.
Teine viis seda teha on mitte kasutades printf ja võttes seda teha stringi,
me saame kasutada ka mõnda muud ülesannet.
Saame kasutada fputc, mis prindib märgi ekraan,
välja arvatud juhul, kui me vaatame fputc - las ma suumimiseks natuke.
Näeme, mis on tore, see võtab ka märk, et me lugeda kasutades fgetc,
kuid siis peame andma see oja printida.
Saame kasutada ka putchar funktsioon, mis seab otseselt standard välja.
Seega on terve hulk erinevaid võimalusi, mida saame kasutada printimiseks.
Nad on kõik standard I / O teek.
Kui te soovite printida - nii printf, vaikimisi trükib erilisele standard välja oja,
mis on selle standardväljundisse.
Nii saame lihtsalt nimetavad seda liiki see maagiline väärtus, stdout siin.
Oih. Pane semikooloniga väljaspool.
>> See on palju uusi, funky teabe siin.
Palju see on väga idiomaatiline, selles mõttes, et see on kood
, mis on kirjutatud nii lihtsalt sellepärast, et see on puhas lugeda, lihtne lugeda.
Seal on palju erinevaid viise, kuidas seda teha, palju erinevaid funktsioone saab kasutada,
kuid me kaldume järgige neid samu mustreid ikka ja jälle.
Nii et ärge imestage, kui näete koodi niimoodi tulevad ikka ja jälle.
Hea küll. Sel hetkel, me peame pausi päev.
Tänan, et tulid. Täname vaadates kui sa oled online. Ja me näeme järgmisel nädalal.
[CS50.TV]