[Powered by Google Translate] [OSA 5: vähemmän mukavaksi]
[Nate Hardison, Harvardin yliopisto]
[Tämä on CS50.] [CS50.TV]
Joten tervetuloa takaisin, pojat.
Tervetuloa 5 §.
Tässä vaiheessa, kun se valmistui tietokilpailu 0 ja nähtyäni miten olet tehnyt,
toivottavasti tuntuu todella hyvältä, koska olen ollut hyvin vaikuttunut tulokset tässä osiossa.
Meidän verkossa katsojille, meillä on ollut pari kysymystä
noin kaksi viimeistä ongelmia Harjoitus - tai tietokilpailu, melko.
Joten aiomme mennä yli nämä todella nopeasti, niin että kaikki näkevät mitä tapahtui
ja miten mennä läpi todellisen liuoksen sijasta vain katsella ratkaisun itse.
Aiomme mennä parin viime ongelmat todella nopeasti, 32 ja 33.
Just, taas, joten verkossa katsojat näkevät tämän.
>> Jos käännät ongelmaasi 32, joka on sivulla 13,
13 out of 16, ongelmana 32 on kyse swapit.
Se kaikki oli vaihtokauppa kahden kokonaisluvun.
Se on ongelma, että olimme menneet yli pari kertaa luento.
Ja täällä, mitä pyysivät sinua tekemään lyhyesti muistijälki.
Täyttää muuttujien arvoja, koska ne ovat pinossa
kun koodinumero kulkee tämän swap-toiminto.
Erityisesti mitä me tarkastelemme - Menen laittaa tähän iPad alas -
Erityisesti mitä me tarkastelemme on tämän linjan numeroitu 6 täällä.
Ja se on numeroitu 6 vain lähekkäin edelliseen ongelmaan.
Mitä me haluamme tehdä, on näyttää tai merkitä tilan muistin
koska se on silloin, kun me toteuttaa tämän linjan numero 6,
joka on käytännössä paluuta meidän swap toiminto täällä.
Jos me selaa täällä, näimme, että osoitteet kaiken muistiin annettiin meille.
Tämä on hyvin keskeinen, Palaamme siihen vain hetken.
Ja sitten täällä alaosassa, meillä oli vähän muistia kaavio että aiomme puhua.
Olen itse tehnyt tämän ulos minun iPad.
Joten aion vuorotellen edestakaisin iPad ja tämän koodin vain viitteellisiä.
>> Aloitetaan. Ensimmäinen, nyt keskittyä pari ensimmäistä riviä tärkeimpien täällä.
Voit aloittaa, aiomme alustaa X 1 ja Y 2.
Joten meillä on kaksi kokonaisluku muuttujan, he molemmat menossa sijoitetaan pinoon.
Aiomme laittaa 1 ja 2 niihin.
Joten jos heitän yli minun iPad, toivottavasti, katsotaanpa -
Apple TV peilaus, ja siellä mennään. Okei.
Joten jos heitän yli minun iPad,
Haluan alustaa X 1 ja Y 2.
Teemme sen yksinkertaisesti kirjoittamalla 1 laatikosta x
ja 2 laatikosta y. Melko yksinkertaista.
Joten nyt mennään takaisin laptop, mitä tapahtuu seuraavaksi.
Joten tämä seuraava rivi on jotain vielä hankalaa.
Ohitamme osoite x ja osoite y parametrit a ja b swap-toiminto.
Osoite x ja osoite y ovat asioita, joita emme voi laskea
ilman viittausta näihin bullet pistettä alas tänne.
Ja onneksi kaksi ensimmäistä bullet pistettä kertomaan meille, mitä vastaukset ovat.
Osoite x muistissa on 10, ja osoite y muistissa on 14.
Joten ne ovat arvoja, jotka saavat kulunut niin ja b ylös meidän swap-toiminto.
Joten jälleen, siirtyminen takaisin meidän kaavio, voin kirjoittaa 10
ja 14 b.
Nyt tämä kohta on, jos jatkamme swap.
Joten flipping takaisin laptop uudelleen,
näemme, että tie swap toimii on ensimmäisen kerran dereference ja myymälä tulos tmp.
Joten dereference operaattori sanoo, "Hei. Kohtele sisällön muuttujan kuten osoitteen.
Siirry mitä tallennetaan kyseiseen osoitteeseen, ja lataa se. "
Mitä lataat ulos muuttujan aiotaan varastoida meidän tmp muuttuja.
Flipping takaisin iPad.
Jos menemme Osoite 10, me tiedämme, että osoite 10 on varible x
koska me kerrottiin meidän luetelmakohtaa että osoite x muistissa on 10.
Joten voimme mennä sinne, saat sen arvoa, joka on 1, koska näemme meidän iPad,
ja ladata sen osaksi tmp.
Jälleen kerran, tämä ei ole lopullinen sisältö.
Aiomme käydä läpi ja saamme meidän lopulliseen tilaan ohjelman päätyttyä.
Mutta nyt meillä on arvo 1 tallennettu tmp.
>> Ja siellä nopea kysymys tänne.
[Alexander] Onko dereference operaattori - se on vain tähti edessä muuttujan?
>> Kyllä. Joten dereference toimija, kuten me käännä takaisin meidän laptop jälleen
tämä tähti edessä.
Siinä mielessä se on - te vastakkain sen kanssa kertolaskun
joka edellyttää kahta asiaa, dereference operaattori on unaarinen operaattori.
Vain soveltaa yhtä arvoa toisin kuin binääristä operaattoria,
jossa sovelletaan kahta eri arvoja.
Niin, että mitä tapahtuu tätä linjaa.
Me ladattu arvon 1 ja tallentaa sen määräaikaista kokonaisluku muuttuja.
Seuraavalle riville Tallennamme sisältö b osaksi -
tai pikemminkin me tallentaa sisällön että b on osoittaa siihen paikkaan, jossa on osoittaa.
Jos analysoimme tätä oikealta vasemmalle, aiomme dereference b,
aiomme käsitellä 14, aiomme napata kokonaisluku, joka on olemassa,
ja sitten aiomme mennä osoitteeseen 10,
ja aiomme heittää seurausta meidän dereference B tuohon tilaan.
Flipping takaisin meidän iPad, jossa voimme tehdä tästä hieman konkreettisempaa,
Se voisi auttaa, jos kirjoitan numerot kaikki osoitteet täältä.
Joten me tiedämme, että y, olemme osoitteesta 14, x on osoitteessa 10.
Kun aloitamme B, me dereference b, aiomme napata arvo 2.
Aiomme tarttua tähän arvoon, koska se on arvo, joka asuu osoitteessa 14.
Ja me aiomme laittaa se muuttuja, joka asuu osoitteessa 10,
joka on oikeassa, vastaten meidän muuttuja x.
Joten voimme tehdä hieman korvaamatta täällä
jossa pääsemme eroon meidän 1 ja sen sijaan me kirjoitamme 2.
Joten kaikki on hyvin ja hyvää maailmassa, vaikka olemme korvataan x nyt.
Olemme tallennetut x: n vanha arvo meidän TMP muuttuja.
Joten voimme täydentää swap kanssa seuraavalle riville.
Flipping takaisin meidän laptop.
Nyt kaikki jää on ottaa sisällön pois meidän tilapäisen kokonaisluku muuttuja
ja tallentaa ne muuttujaan, joka asuu osoitteessa, että b on tilalla.
Joten aiomme tehokkaasti dereference b päästä käsiksi muuttujan
, joka on osoite, joka b pitää siinä,
ja aiomme tavaraa arvo tmp pitelee siihen.
Flipping takaisin iPad kerran.
Voin poistaa tämän arvon täällä, 2,
vaan me kopioidaan 1 suoraan siihen.
Sitten seuraava rivi, joka suorittaa, tietenkin -
jos me käännä takaisin laptop - tämä 6 kohta,
joka on piste, jossa halusimme olla meidän kaavion kokonaan täytetty.
Joten flipping takaisin iPad kerran, niin voit nähdä valmis kaavio,
voit nähdä, että meillä on 10, 14 b, 1 TMP, 2 x, ja 1 y.
Onko kysyttävää?
Onko tämä järkevämpää, kun se käveli sen kautta?
Tee vähemmän järkeä? Toivottavasti ei. Okei.
>> Osoittimet ovat hyvin hankala aihe.
Yksi kaverit kanssa teemme on hyvin yleinen sanonta:
"Ymmärtää viitteitä, sinun täytyy ensin ymmärtää viitteitä."
Joka on mielestäni hyvin paikkansa. Se vie aikaa tottua siihen.
Piirustus paljon kuvia, arvonnalla muistia kaavioita kuten tämä on erittäin hyödyllistä,
ja kun kävelee esimerkin toisensa jälkeen jälkeen esimerkiksi
se tulee alkaa tehdä hieman enemmän järkeä ja hieman järkeä ja hieman järkeä.
Lopuksi yksi päivä, sinulla on kaikki täysin oppinut.
Kaikki kysymykset ennen kuin siirrymme seuraavaan ongelmaan? Selvä.
Joten käännä takaisin kannettavaan.
Seuraava ongelma meillä on ongelma numero 33, tiedoston I / O.
Lähennä tässä hieman.
Ongelma 33 - Niin?
>> [Daniel] Minulla oli nopea kysymys. Tämä tähti tai tähti,
sitä kutsutaan dereferencing kun käytät tähdellä ennen.
Mikä sen nimi on kun käytät et-merkki ennen?
>> Et-ennen on osoite-toimijan.
Joten vierittää takaisin ylös.
Oho. Olen zoom-tilassa, joten en todellakaan siirry.
Jos me tarkastelemme tätä koodia todella nopeasti täällä,
uudelleen, sama asia tapahtuu.
Jos me tarkastelemme tätä koodia täällä, tällä linjalla, jossa teemme puhelun vaihtaa,
Et-on vain sanonta "saada osoitteensa muuttuja x elämäänsä."
Kun kääntäjä kokoaa koodisi,
se on todella fyysisesti merkitä paikka muistiin kaikki muuttujat elää.
Ja niin mitä kääntäjä voi sitten tehdä kun se on koottu kaikki,
se tietää, "Oh, laitoin x osoitteessa 10. Laitoin y osoitteessa 14."
Se voi sitten täyttää nämä arvot sinulle.
Joten voit - se voi sitten siirtää ja Pass & Y samoin.
Nämä kaverit saavat osoitteen, mutta myös, kun ohitat ne swap-toiminto,
Tämän tyyppinen tieto, tämä int * täällä, kertoo kääntäjä,
"Okei, me tullaan tulkittaessa osoite osoitteen kokonaisluku muuttuja."
Kuten osoitteen int, joka on erilainen osoite merkin muuttuvan
koska int vie, on 32-bittinen kone, vie 4 tavua tilaa,
taas merkki vain vie 1 tavun tilaa.
Joten on tärkeää tietää myös, mitä on - mitä elää, minkälainen arvo
asuu osoitteessa, joka sai läpäissyt sisään
Tai osoite, että olet tekemisissä.
Näin tiedät kuinka monta tavua todella ladata ulos RAM.
Ja sitten, kyllä, tämä dereference operaattori, kuten te pyysitte,
menee ja sisäänkäyntien tiedot tiettyyn osoitteeseen.
Niin se sanoo, tämä muuttuja tässä hoitoon sisältö osoitteena,
mennä kyseiseen osoitteeseen, ja vedä, ladataan prosessorin kuormitus tulee rekisteriin
todelliset arvot tai sisältöä, jotka elävät kyseisessä osoitteessa.
Vielä kysymyksiä? Nämä ovat hyviä kysymyksiä.
Se on paljon uutta terminologiaa liikaa.
Se on myös eräänlainen funky, nähdä ja ja * eri paikoissa.
>> Selvä.
Joten takaisin ongelmaan 33, tiedostoon I / O.
Tämä oli yksi niistä ongelmista, jotka mielestäni pari asiaa tapahtui.
Yksi, se on melko uusi aihe.
Se esitettiin melko pian ennen tietokilpailu,
ja sitten mielestäni se oli sellainen kuin yksi niistä sanan ongelmien matematiikka
jos ne antavat sinulle paljon tietoa, mutta itse eivät päätyä käyttämään ton se.
Ensimmäinen osa tätä ongelmaa kuvailee mitä CSV tiedosto on.
Nyt, CSV, mukaan kuvauksen, on pilkulla erotetut arvot tiedosto.
Syy Nämä ovat kaikki kiinnostavia, ja syy koskaan käyttää niitä,
on, koska kuinka moni teistä on joskus käyttänyt tavaraa kuten Excel?
Kuva useimmat teistä, luultavasti, tai käyttää jossain vaiheessa elämääsi.
Käytät jotain Excelin.
Saadaksesi tietoja ulos Excel-laskentataulukon tai tee minkäänlaista käsittelyä sen kanssa,
jos halusi kirjoittaa C-ohjelma tai Python ohjelma, Java-ohjelma,
käsitellä tallennetut tiedot siellä,
yksi yleisimmistä tavoista saada se ulos on CSV-tiedosto.
Ja voit avata Excelin ja kun menet "Save As" dialogi,
voit saada pois varsinaisen CSV-tiedoston.
>> Handy tietää, miten käsitellä näitä asioita.
Miten se toimii on, että se on samanlainen - Tarkoitan, se on lähinnä matkii taulukkolaskenta,
missä, kuten näemme täällä, aivan äärimmäisenä vasemmalla pala,
olemme kaikki sukunimiä.
Joten meillä on Malan, sitten Hardison, ja sitten Bowden, MacWilliam, ja sitten Chan.
Kaikki sukunimiä. Ja sitten pilkku erottaa viimeinen nimet etunimet.
David, Nate, Rob, Tommy ja Zamyla.
Olen aina sekoittaa Robby ja Tom.
Ja sitten lopuksi, kolmannessa sarakkeessa on sähköpostiosoitteet.
Kun ymmärrät, että muu ohjelma on melko yksinkertainen toteuttaa.
Mitä olemme tehneet, jotta jäljitellä tätä samaa rakennetta meidän C-ohjelma
on olemme käyttäneet rakennetta.
Aloitamme leikkii näillä hieman samoin.
Näimme heidät ensimmäisen hieman vuonna Harjoitus 3, kun olimme tekemisissä sanakirjoja.
Mutta tämä henkilökunta struct tallentaa sukunimi, etunimi, ja sähköposti.
Aivan kuten CSV tiedoston tallentamiseen.
Joten tämä on vain muuntaa muodosta toiseen.
Meidän täytyy muuntaa, tässä tapauksessa henkilöstön struct osaksi linja,
pilkulla erotettuna line, aivan kuten se.
Onko siinä järkeä? Olette kaikki ottaneet tietokilpailu,
joten oletan sinulla on ainakin ollut aikaa miettiä tätä.
>> Vuonna vuokraus toiminnon ongelma pyytää meitä ottamaan sisään - we'll zoomata tässä hieman -
toteuttaa henkilöstön rakenne, henkilöstö struct kanssa nimellä s,
ja liittää sen sisältö meidän staff.csv tiedosto.
On käynyt ilmi, että tämä on melko yksinkertainen käyttää.
Me tavallaan leikkiä näiden toimintojen hieman tänään.
Mutta tässä tapauksessa, fprintf toiminto on todella avain.
Joten fprintf, voimme tulostaa, aivan kuten te käyttänyt printf tätä koko ajan.
Voit printf rivin tiedostoon.
Joten sen sijaan vain tehdä tavallista printf puhelun missä annat sen muotomerkkijonoa
ja sitten korvata kaikki muuttujat seuraavat argumentit,
kanssa fprintf, aivan ensimmäinen argumentti on sen sijaan tiedosto, jonka haluat kirjoittaa.
Jos me tarkastelemme tätä laitetta, esim. mies fprintf,
Voimme nähdä eroa printf ja fprintf.
Minä zoomata tässä hieman.
Joten printf, annamme sen muotomerkkijonoa, ja sitten myöhemmin väitteitä
ovat kaikki muuttujat korvaaminen tai korvaamisesta meidän muotomerkkijonoa.
Kun taas fprintf, ensimmäinen argumentti on todellakin tämä tiedosto * kutsutaan stream.
>> Muutto takaisin tänne meidän vuokra,
olemme jo saimme tiedosto * stream meille avataan.
Juuri tämä ensimmäinen rivi ei, se avaa staff.csv tiedoston,
se avaa sen append-tilassa, ja kaikki mitä on jäljellä voimme tehdä on
kirjoita henkilöstön rakenteen tiedostoon.
Ja katsotaanpa, en halua käyttää iPad?
Minä käytän iPad. Meillä on void - Pannaan tämä pöydälle, jotta voin kirjoittaa hieman paremmin -
mitätöidä vuokraus ja kestää yhden väitteen, henkilöstön rakennetta kutsutaan s.
Saimme housunkannattimet, meillä meidän tiedosto * nimeltään tiedosto,
meillä fopen linja antanut meille,
ja minä vain kirjoitan sen pisteinä, koska se on jo pedia.
Ja sitten meidän seuraavalle riville, aiomme soittaa fprintf
ja aiomme kulkea tiedosto, jonka haluat tulostaa,
ja sitten meidän muotomerkkijonon, joka -
Annan te kertoa minulle, miltä se näyttää.
Entä sinä, Stella? Tiedätkö, mitä ensimmäinen osa muotomerkkijonoa näyttää?
[Stella] En ole varma. >> Vapaasti kysyä Jimmy.
Tiedätkö, Jimmy?
[Jimmy] Olisiko vain olla viimeinen? En tiedä. En ole täysin varma.
>> Okei. Entä, ei kukaan saat tämän korrekti tentti?
No Selvä.
On käynyt ilmi, että täällä kaikki meidän tarvitsee vain haluamme jokainen osa henkilöstön rakenteen
voidaan tulostaa ulos string meidän tiedostoon.
Me vain käyttää merkkijonon korvaaminen merkin kolme eri kertaa, koska meillä on sukunimi
seurasi pilkku, sitten etunimi seurasi pilkku,
ja sitten lopulta sähköpostiosoite, jota seuraa - joka ei ole
sovittamalla minun näytöllä - mutta se seuraa rivinvaihtomerkki.
Joten aion kirjoittaa se vain sinne.
Ja sitten seuraavat meidän muotomerkkijonoa,
meillä on vain substituutiot, jota käyttää pilkku merkintää
että näimme Harjoitus 3.
Voimme käyttää s.last, s.first, ja s.email
korvata näiden kolmen arvoja meidän muotomerkkijonoa.
Joten miten se meni? Järkeä?
Kyllä? Ei? Mahdollisesti? Okei.
>> Viimeinen asia, mitä teemme kun olemme painettu ja sen jälkeen olemme avasimme file:
aina kun olet avannut tiedoston, meidän on aina muistettava sulkea sitä.
Koska muuten päädyt vuotaa muistia,
käyttämällä ylös tiedosto kuvaajat.
Joten sulkea sitä, mikä funktio käytämme? Daniel?
[Daniel] fclose? >> Fclose, tarkalleen.
Niin, että viimeinen osa tätä ongelmaa oli oikein lopettaa, käyttämällä fclose toimintoa,
joka vain näyttää, että.
Ei liian hullu.
Cool.
Niin, että ongelma 33 tietovisa.
Saamme varmasti enemmän tiedoston I / O tulossa.
Teemme hieman enemmän luento tänään tai osassa tänään,
koska se mitä tulee muodostamaan suurimman osan tämän tulevan PSET.
Siirrytään siitä tietovisa tässä vaiheessa. Kyllä?
>> [Charlotte]] Miksi fclose (tiedosto) sijaan fclose (staff.csv)?
>> Ah. Koska näyttää siltä, ​​että - niin kysymys, mikä on hieno,
Siksi, kun kirjoitamme fclose, olemme kirjallisesti fclose (tiedosto) tähti muuttuja
toisin kuin tiedostonimen, staff.csv? Onko se oikein? Joo.
Joten katsomaan. Jos minun siirtyä takaisin minun laptop,
ja katsokaamme fclose toimintoa.
Joten fclose toiminto sulkee virta ja se vie osoitin stream että haluamme sulkea,
toisin kuin varsinaisen tiedostonimen haluamme sulkea.
Ja tämä johtuu siitä, kulissien takana, kun soittaa fopen,
Kun avaat tiedoston, olet todella jakaa muistia tietoja tiedostosta.
Joten sinulla on tiedoston osoitin, että on tietoa tiedoston,
kuten se on auki, sen kokoa, missä kulloinkin olet tiedoston,
jotta voit tehdä lukemisen ja kirjoittamisen puhelut että tiettyyn paikkaan tiedoston sisällä.
Päädyt suljetaan osoitin sulkemisen sijasta tiedoston nimi.
>> Kyllä? [Daniel] Joten jotta käyttää vuokraus, sanoisitteko - miten se saa käyttäjä syöttää?
Onko fprintf toimivat kuten GetString siinä mielessä, että se vain odottaa käyttäjän syötettä
ja pyytää sinua kirjoittamaan tähän - tai odota voit kirjoittaa nämä kolme asiaa?
Vai joudut käyttämään jotain toteuttaa vuokra?
>> Joo. Joten emme - kysymys, miten saamme käyttäjäsyötteen
toteuttaakseen vuokraus? Ja mitä meillä täällä on soittajan vuokra,
kulunut tämän henkilöstön struct kaikkien tallennettujen struct jo.
Joten fprintf pystyy vain kirjoittaa, että tiedot suoraan tiedostoon.
Ei ole odottaa käyttäjän syötettä.
Käyttäjä on jo antanut panoksen asianmukaisesti laittamalla sen tässä henkilöstön struct.
Ja asioita, tietenkin, rikkoisi jos näitä osoittimia olivat null,
joten vierittää takaisin ylös tänne ja katsomme meidän struct.
Meillä on merkkijono viimeinen merkkijono ensin merkkijono sähköpostin.
Tiedämme nyt, että kaikki nämä todella, konepellin alle, ovat char * muuttujia.
Tämä voidaan tai ei voida osoittaa null.
Ne voidaan osoittaa muistiin kasaan,
ehkä muistiin pinoon.
Emme oikeastaan ​​tiedä, mutta jos jokin näistä osoittimia ovat nolla tai virheellinen,
että taatusti kaatua meidän vuokra-toiminto.
Se oli jotain, joka oli eräänlainen kuulu tentti.
Emme murehtia siitä.
Suuri. Okei. Joten siirtymässä tietovisa.
>> Katsotaanpa sulkea tämän kaveri, ja aiomme katsoa PSET 4.
Joten jos te tarkastellaan PSET spec, kun voit käyttää sitä, cs50.net/quizzes,
aiomme käydä läpi muutamia osan ongelmista tänään.
Olen vierittämällä - osa kysymyksistä alkaa kolmannella sivulla PSET spec.
Ja ensimmäinen osa pyytää sinua menemään ja katsomaan lyhyt suuntaamaan ja putket.
Joka oli eräänlainen viileä lyhyt, näyttää uusia, hienoja komentorivin temppuja, joita voit käyttää.
Ja sitten meillä muutamia kysymyksiä sinulle samoin.
Tämä ensimmäinen kysymys puroihin, joihin printf kirjoittaa oletusarvoisesti,
me tavallaan sivuttiin vain vähän aikaa sitten.
Tämä fprintf että olimme juuri keskustelleet vie tiedostoon * virta sen väitteen.
fclose vie tiedostoon * stream samoin,
ja palauttaa arvon fopen saat tiedoston * stream samoin.
Syy emme ole nähneet niitä ennen kun olemme hoitaneet printf
johtuu printf on oletuksena stream.
Ja oletuksena virta, johon se kirjoittaa
voit tietää lyhyellä.
Joten ehdottomasti vilkaista sitä.
>> Nykypäivän osiossa, aiomme puhua hieman siitä GDB,
koska tutumpi olette, sitä enemmän käytäntö saat sen kanssa,
paremmin voit itse metsästämään bugeja oman koodin.
Tämä nopeuttaa prosessia virheenkorjaus valtavasti.
Joten käyttämällä printf, joka kerta tehdä, että sinun täytyy kääntää koodin,
sinun täytyy ajaa uudelleen, joskus täytyy siirtää printf puhelun ympärillä,
kommentti, koodi, se vain vie aikaa.
Tavoitteenamme on yrittää vakuuttaa teille, että GDB, voit pohjimmiltaan
printf mitään missään vaiheessa koodi ja sinun ei tarvitse kääntää sitä.
Sinun ei koskaan tarvitse aloittaa ja pitää arvailla mistä printf seuraavaksi.
Ensimmäinen asia tehdä, on kopioida tämä rivi ja saada osan koodi pois www.
Olen kopioiminen koodirivin joka sanoo, "wget ​​http://cdn.cs50.net".
Aion kopioida sitä.
Aion mennä yli minun laite, loitontaa niin näet mitä olen tekemässä,
liittämällä sen sinne, ja kun osuin Anna, tämä wget komento kirjaimellisesti on web saada.
Se tulee kaatamaan tämän tiedoston pois Internet,
ja se tulee tallentaa sen nykyiseen hakemistoon.
Nyt jos voin lisätä nykyisestä hakemistosta voit nähdä, että minulla on tämä section5.zip tiedoston suoraan sinne.
Tapa käsitellä että kaveri on purkaa se,
jonka voit tehdä komentoriviltä, ​​aivan kuten tämä.
Section5.zip.
Että saat pura se, luo kansio minulle,
puhaltaa kaikki sisällöt, laita ne sinne.
Joten nyt voin mennä minun 5 § hakemistoon cd-komennolla.
Tyhjentää näytön avulla selvä. Joten tyhjentää näytön.
Nyt minulla mukava puhdas terminaali käsitellä.
>> Nyt jos listata kaikki tiedostot näen tässä hakemistossa,
näet, että olen saanut neljä tiedostoa: buggy1, buggy2, buggy3 ja buggy4.
Minulla on myös niiden vastaavat. C-tiedostoja.
Emme aio katsoa. ​​C-tiedostoja nyt.
Sen sijaan aiomme käyttää niitä, kun avaamme GDB.
Olemme pitäneet heidät ympäri niin, että meillä on pääsy varsinaisen lähdekoodin kun käytämme GDB,
mutta tavoitteena osan osa on korjailla ympäriinsä GDB
ja miten voimme käyttää sitä selvittää mitä vikaa kussakin näistä neljästä buginen ohjelmia.
Eli olemme juuri menossa ympäri huonetta todella nopeasti,
ja aion pyytää jotakuta ajaa yhtä buginen ohjelmien
ja sitten menemme ryhmänä kautta GDB, ja näemme, mitä voimme tehdä korjata näitä ohjelmia,
tai ainakin tunnistaa mitä vikaa niissä kaikissa.
Aloitetaan tänne Daniel. Aiotteko ajaa buggy1? Katsotaan mitä tapahtuu.
[Daniel] Se sanoo, että sovelluksen vika. >> Joo. Aivan.
Joten jos juoksen buggy1, saan seg vika.
Tässä vaiheessa voisin mennä ja avata buggy1.c,
yrittää selvittää, mitä pielessä,
mutta yksi vastenmielinen asioita tämän väestönosan vika virhe
on, että se ei kerro mitä rivillä ohjelman asiat todella meni pieleen ja rikkoi.
Sinulla sellainen täytyy katsoa koodi
ja selvittää käyttämällä arvaus ja tarkista tai printf nähdä mitä vialla.
Yksi hienoimmista asioista noin GDB on, että se on todella, todella helppoa
selvittää linjaa, jossa ohjelma kaatuu.
Se on täysin sen arvoista käyttää sitä, vaikka juuri tätä.
Joten käynnistyä GDB, kirjoitan GDB, ja sitten annan sen polku suoritettavan että haluan ajaa.
Täällä olen kirjoittamalla GDB ./buggy1.
Enter. Antaa minulle kaiken tämän tekijänoikeustiedot,
ja täällä näet tämän linjan, joka sanoo, "Reading symboleja / home /
jharvard/section5/buggy1. "
Ja jos kaikki menee hyvin, näet sen tulostaa viestin, joka näyttää tältä.
Se tulee lukea symboleja, se tulee sanoa "Luen symbolit teidän suoritettavan tiedoston,"
ja sitten se on tämä "valmis" viestin tänne.
Jos näet jonkin muun vaihtelua tämän, tai näet se ei löytänyt symbolit
tai jotain, mitä se tarkoittaa, että et vain ole kääntänyt suoritettavia kunnolla.
Kun kääntää ohjelmia käytettäväksi GDB, meidän on käytettävä että erikois-g lippu,
ja se on tehty oletuksena Jos käännät ohjelmia, vain kirjoittamalla tehdä
tai tehdä buginen tai tehdä takaisin, mitään näistä.
Mutta jos olet koota manuaalisesti clang, niin sinun täytyy mennä ja sisällytetäänkö-g lippu.
>> Tässä vaiheessa, nyt meillä on GDB nopeasti,
se on melko helppo käyttää ohjelmaa.
Voimme joko kirjoittaa aikavälillä, tai voimme vain kirjoittaa r.
Useimmat GDB komennot voidaan lyhentää.
Yleensä vain yksi tai pari kirjainta, mikä on ihan kiva.
Joten Saad, jos kirjoitat r ja paina Enter, mitä tapahtuu?
[Saad] Minulla SIGSEGV, segmentointi vika, ja sitten kaikki tämä siansaksaa.
>> Joo.
Kuten näemme ruudulla juuri nyt, ja kuten Saad sanoi,
kun kirjoitat ajaa tai r ja paina Enter, emme silti saman seg vika.
Joten käyttäen GDB ei ratkaise ongelmaa.
Mutta se antaa meille joitakin siansaksaa, ja käy ilmi, että tämä kapulakieli
oikeastaan ​​kertoo meille, missä se tapahtuu.
Jäsentää tätä vähän, tämä ensimmäinen bitti on toiminto, jossa kaikki menee pieleen.
On tämä __ strcmp_sse4_2, ja se kertoo meille, että se tapahtuu tämän tiedoston
kutsutaan sysdeps/i386, kaikki tämä taas eräänlainen sotku - mutta linja 254.
Se on eräänlainen vaikea jäsentää. Yleensä kun näet juttuja kuten tämä,
tämä tarkoittaa, että se on segmentti Virhesovellus yhdessä järjestelmän kirjastoista.
Joten jotain tekemistä strcmp. Olette nähneet strcmp ennen.
Ei liian hullu, mutta tarkoittaako tämä, että strcmp on rikki tai että siellä on ongelma strcmp?
Mitä luulet, Alexander?
[Alexander] Onko tuo - on 254 linja? Ja - ei binary, mutta se ei ole heidän katot,
ja sitten on toinen kieli kullekin toiminnolle. Onko se 254 tähän toimintaan, tai -?
>> On line 254. Se näyttää tältä. S tiedosto, joten se assembly luultavasti.
>> Mutta kai entistä kiireellisempi asia on, koska olemme saaneet SEG vika,
ja se näyttää että se tulee strcmp toiminto,
tämä tarkoita, että silloin strcmp on rikki?
Sen ei pitäisi, toivottavasti. Joten koska sinulla on segmentointi vika
yhdessä järjestelmän toimintoja, tyypillisesti se tarkoittaa, että et vain ole kutsuneet sitä oikein.
Nopein tapa selvittää, mitä todella tapahtuu
kun näet jotain hullua, kuten tämä, kun näet SEG vika,
varsinkin jos sinulla on ohjelma, joka on käytössä enemmän kuin vain tärkeimmät,
on käyttää backtrace.
I lyhenteenä backtrace kirjoittamalla bt, toisin kuin täyden backtrace sana.
Mutta Charlotte, mitä tapahtuu, kun kirjoitat bt ja paina Enter?
[Charlotte] Se näyttää minulle kaksi riviä, rivi 0 ja linja 1.
>> Joo. Joten rivi 0 ja linja 1.
Nämä ovat todellisia pino kehyksiä, jotka olivat tällä hetkellä pelata, kun ohjelma kaatui.
Alkaen ylimmän kehyksen, kehys 0, ja menee alimmaisen, joka on runko 1.
Meidän päällimmäinen kehys on strcmp kehys.
Voit ajatella tätä samanlainen ongelma olimme juuri tekemässä tietokilpailu osoittimet,
jossa meillä oli vaihtaa pinokehys päälle tärkeimmistä pinokehys,
ja meillä oli muuttujat swap käytti päälle muuttujien tärkein käytti.
Täällä meidän Crash tapahtui meidän strcmp toiminto, jota kutsuttiin meidän päätehtävä,
ja backtrace antaa meille vain toimintoihin, joissa asioita epäonnistui,
mutta se on myös kertoo meille, missä kaikki oli soitti.
Joten jos vieritä hieman oikealle,
Voimme nähdä, että joo, olimme line 254 Tämän strcmp-sse4.s tiedosto.
Mutta puhelu tehtiin buggy1.c, rivi 6.
Joten se tarkoittaa voimme tehdä - on, voimme vain mennä tarkistaa ja nähdä, mitä oli tekeillä
klo buggy1.c, rivi 6.
Jälleen on olemassa pari tapaa tehdä tätä. Yksi on poistuaksesi GDB
tai pyydä koodia avoinna toisessa ikkunassa ja ristiviittaus.
Tämä, ja sinänsä, on aika kätevä, sillä nyt jos olet aukioloajat
ja sinulla seg vika ja sinun TF on ihmetellyt, mihin kaikki oli murtaa,
voit vain sanoa, "Voi, rivi 6. En tiedä mitä tapahtuu,
mutta jotain linjaa 6 aiheuttaa minun ohjelma murtaa. "
Toinen tapa tehdä se on, voit käyttää tätä komentoa kutsutaan luettelon GDB.
Voit myös lyhentää sitä l..
Joten jos me osuma l, mitä me saamme täällä?
Saamme koko joukko outoja juttuja.
Tämä on todellinen kokoonpano koodi
joka on strcmp_sse4_2.
Tämä näyttää ikään funky,
ja syy Saamme tämä johtuu juuri nyt,
GDB on meille kehyksen 0.
>> Niin milloin katsomme muuttujia, tahansa katsomme lähdekoodia,
me tarkastelemme lähdekoodin, joka on tekemisissä pinokehys emme tällä hetkellä tuumaa
Joten saadakseen jotain mielekästä, meidän on
siirtyä pinokehys että järkevämpää.
Tässä tapauksessa pääasiallinen pinokehys tekisi hieman mielessä
koska se oli todella koodin että me kirjoitti.
Ei strcmp koodin.
Näin voit siirtyä kehysten välillä, tässä tapauksessa, koska meillä on kaksi,
meillä on 0 ja 1,
teet että ylös ja alas-komentoja.
Jos minä siirtyä yhden ruudun,
nyt olen pääasiassa pinokehys.
Voin siirtyä alas mennä takaisin missä olin,
nousevat taas, mene alas, ja mene ylös.
Jos joskus tee ohjelma GDB, saat kaatua, saat backtrace,
ja huomaat, että se on joissakin tiedoston et tiedä mitä on tekeillä.
Yrität luettelosta koodi ei näytä tutulta,
katsomaan teidän kehyksiä ja selvittää, missä olet.
Olet luultavasti väärässä pinokehys.
Tai ainakin olet pinokehys joka ei ole yksi, että voit todella debug.
Nyt olemme sopiva pinokehys, olemme pääasiassa,
Nyt voimme käyttää luetteloa komennolla selvittää mikä linja oli.
Ja voit nähdä sen, se tulostetaan se meille täällä.
Mutta voimme lyödä listata kaikki samat, ja luettelo antaa meille tämän mukava tuloste
varsinaisen lähdekoodin, joka on meneillään täällä.
>> Erityisesti voimme tarkastella rivillä 6.
Voimme nähdä, mitä täällä tapahtuu.
Ja näyttää siltä Teemme merkkijono vertailu
välinen merkkijono "CS50 kiviä" ja argv [1].
Jotain tästä oli kaatuu.
Joten Missy, onko teillä ajatuksia siitä, mitä voisi olla tekeillä?
[Missy] En tiedä miksi se kaatuu. >> Et tiedä miksi se kaatuu?
Jimmy, mitään ajatuksia?
[Jimmy] En ole aivan varma, mutta viimeinen kerta käytimme merkkijono vertailla,
tai strcmp, meillä oli jotain kolme erilaista tapausta sen alle.
Meillä ei ollut ==, en usko, oikeassa että ensimmäisellä rivillä.
Sen sijaan se oli jaettu kolmeen, ja yksi oli == 0,
yksi oli <0, luulen, ja yksi oli> 0.
Joten ehkä jotain? >> Joo. Eli siellä on asiaa
ja teemme vertailua oikein?
Stella? Mitään ajatuksia?
[Stella] En ole varma. >> Etkö ole varma. Daniel? Ajatuksia? Okei.
On käynyt ilmi, mitä tapahtuu täällä on, kun meillä oli ohjelmassa
ja saimme segmenteille vika, kun juoksi ohjelman ensimmäistä kertaa, Daniel,
annoit sen mitään komentoriviargumentteja?
[Daniel] No >> Nro Tässä tapauksessa, mikä on arvo argv [1]?
>> Ei arvoa. >> Oikea.
No, ei ole sopiva merkkijono arvoa.
Mutta on jotain arvoa. Mikä on arvo, joka saa säilyttää siellä?
>> Roskat arvo? >> Se on joko roskat arvoa tai, tässä tapauksessa,
loppuun argv matriisi on aina päättyy null.
Joten mitä todella todella tallennetaan on nolla.
Toinen tapa ratkaista tämä, sen sijaan ajatella sitä kautta,
on kokeilla tulostaa sitä.
Tämä on, jos olin sanomassa, että käyttämällä GDB on suuri,
koska voit tulostaa kaikki muuttujat, kaikki arvot, jotka haluat
Käyttämällä tätä kätevä-dandy p komento.
Joten jos kirjoitat p ja sitten kirjoita muuttujan tai nimen muuttujan,
sanovat, argc, näen että argc on 1.
Jos haluan tulostaa argv [0], voin tehdä sen vain.
Ja kuten näimme, argv [0] on aina nimi ohjelman
aina nimi suoritettavan.
Täällä näet se sai koko polku.
Voin myös tulostaa argv [1] ja katso mitä tapahtuu.
>> Täällä saimme tällaista mystistä arvoa.
Saimme tätä 0x0.
Muista alussa aikavälillä, kun puhuimme heksadesimaaliluvut?
Tai että pieni kysymys lopussa PSET 0 miten edustaa 50 hex?
Tapamme kirjoittaa hex numerot CS, vain ei pidä sekoittaa itse
kanssa desimaalilukuja, on aina etuliite niitä 0x.
Joten tämä 0x etuliite aina vain sitä tulkitsevat seuraavat numeron heksadesimaaliluvuksi,
eikä merkkijono, ei desimaalilukuna, ei binäärilukuna.
Koska numero 5-0 on kelvollinen numero heksadesimaalimuodossa.
Ja se on numeron desimaali, 50.
Joten tämä on, miten me disambiguate.
Joten 0x0 tarkoittaa heksadesimaali 0, joka on myös desimaalin 0, binääri 0.
Se on vain arvo 0.
On käynyt ilmi, että tämä on mitä null on oikeastaan ​​muistiin.
Null on vain 0.
Tässä elementti säilytettiin argv [1] on nolla.
Joten yritämme verrata meidän "CS50 rocks" merkkijonon null merkkijono.
Joten dereferencing null, yrittäen päästä asioita null,
nämä ovat yleensä menossa aiheuttaa jonkinlaista segmentoitumisen vika tai muita pahoja asioita tapahtuu.
Ja näyttää siltä, ​​että strcmp ei tarkasta
onko olet hyväksyttiin arvo on null.
Pikemminkin se vain menee eteenpäin, yrittää tehdä sen asian,
ja jos se segmentti vikoja, se segmentti vikoja, ja se on sinun ongelmasi. Sinun täytyy korjata se.
Todella nopeasti, miten voi voimme korjata tämän ongelman? Charlotte?
[Charlotte] Voit tarkistaa käytössä jos.
Joten jos argv [1] on nolla, == 0, palauta 1, tai jotain [käsittämätön].
>> Joo. Niin, että yksi hyvä tapa tehdä se, koska voimme tarkistaa,
arvo aiomme kulkeutua strcmp, argv [1], on se null?
Jos se on tyhjä, niin voimme sanoa okei, keskeytä.
>> Yleisempää tapa tehdä tämä on käyttää argc arvoa.
Voit nähdä täällä alussa tärkein,
me pois, että ensimmäinen testi että me yleensä teemme, kun käytämme komentoriviargumentteja,
joka on testata onko meidän argc arvoa odotamme.
Tässä tapauksessa me odotamme vähintään kaksi argumenttia,
ohjelman nimi plus yksi muista.
Koska aiomme käyttää toisen väitteen täällä.
Niin ottaa jonkinlainen testi etukäteen, ennen meidän strcmp puhelua
että testit onko argv on vähintään 2, voisi myös tehdä samaa sellainen asia.
Voimme nähdä, jos se toimii suorittamalla ohjelma uudelleen.
Voit aina käynnistää ohjelman puitteissa GDB, mikä on todella mukavaa.
Voit juosta, ja kun kulkea argumentteja oman ohjelman,
ohitat ne kun soitat ajaa, ei kun käynnistät GDB.
Näin voit pitää vetoamalla ohjelman eri argumentteja kerta.
Joten juosta, tai uudelleen, voin kirjoittaa R, ja katsotaan mitä tapahtuu, jos me kirjoita "Hello".
Se aina kysyy haluatko käynnistää sen uudelleen alusta.
Yleensä et halua aloittaa sitä alusta uudelleen.
Ja tässä vaiheessa, se käynnistyy uudelleen uudelleen, se tulostuu
ohjelma, jota käynnissä, buggy1, jossa väite Hei,
ja se tulostaa tämän standardin ulos, se sanoo, "Saat D" surulliset kasvot.
Mutta emme segmentti vika. Se sanoi, että prosessi lähtenyt normaalisti.
Niin että näyttää aika hyvältä.
Ei enää SEG vikaa, teimme sen ohi,
niin se näyttää, että oli todellakin seg vika vika että olimme tulossa.
Valitettavasti se kertoo meille, että saamme D
>> Voimme mennä takaisin ja katsoa koodi ja nähdä mitä siellä tapahtuu
selvittää, mitä oli - miksi se oli kertomassa meille, että saimme D.
Katsotaanpa, tässä on tämä printf sanoa, että sinulla D.
Jos me luettelosta kuin jatkat kirjoittamista luetteloon, se pitää iteroimalla alas läpi ohjelman
joten se näyttää muutaman ensimmäisen rivin ohjelman.
Sitten se näytämme seuraavassa muutama rivi, ja seuraavaksi murikka ja seuraavan palan.
Ja se tulee pitää yrittää mennä alas.
Ja nyt me saamme "rivinumero 16 on alueen ulkopuolella."
Koska se on vain 15 riviä.
Jos saat tähän pisteeseen ja mietit, "Mitä voin tehdä?" Voit käyttää apuna komentoa.
Käytä apua ja sitten antaa sen nimen komennon.
Ja näet GDB antaa meille kaikille tällaista kamaa.
Se sanoo: "Ilman väitettä, luettelee kymmenen enemmän rivejä jälkeen tai sen edellisen listalle.
List - luetellaan kymmenen riviä ennen - "
Joten kokeile luettelossa miinus.
Ja että luetellaan 10 riviä edellisen, voit leikkiä luettelon hieman.
Voit tehdä listan, lista - voit jopa antaa luetella useita, kuten luettelon 8,
ja se tulee luettelo 10 riviä noin linjan 8.
Ja voit nähdä mitä täällä tapahtuu on sinulla yksinkertainen, jos muu.
Jos kirjoitat CS50 kiviä, se tulostaa "Saat A."
Muuten se tulostaa "Saat D."
Bummer kaupunki. Selvä. Kyllä?
>> [Daniel] Joten kun olen yrittänyt tehdä CS50 kiviä ilman lainausmerkkejä,
se sanoo "Saat D."
Tarvitsin lainausmerkkejä saada sitä toimimaan, miksi näin on?
>> Joo. On käynyt ilmi, että kun - tämä on toinen hauska pieni makupala -
kun suoritat ohjelman, jos käyttää sitä ja me kirjoita CS50 kiviä,
aivan kuten Daniel sanoi hän, ja sinä Enter,
se vielä sanoo saamme D
Ja kysymys on, miksi tämä on?
Ja näyttää siltä, ​​että sekä pääte-ja GDB jäsentää näitä kahtena erillisenä argumentteja.
Koska kun siellä tilaa, että implisiittisen kuin
Ensimmäinen väite päättyi, seuraava argumentti on alkamassa.
Tapa yhdistää nämä kahteen tai anteeksi, tulee yksi argumentti,
on käyttää lainausmerkkejä.
Joten nyt, jos me laita se lainausmerkkeihin ja ajaa se uudelleen, saamme A.
Joten kertaus, ilman lainausmerkkejä, CS50 ja kiviä jäsennetään kaksi erillistä väitettä.
Lainausmerkkeihin, se jäsentää, koska yhden argumentin kokonaan.
>> Voimme nähdä tätä keskeytyskohta.
Toistaiseksi olemme ohjanneet ohjelmaa, ja se on ollut käynnissä
kunnes joko se segmentti vikoja tai osumia virhe
tai kunnes se on lähtenyt, ja kaikki on ollut täysin kunnossa.
Tämä ei ole välttämättä kaikkein hyödyllinen asia, sillä joskus
sinulla on virhe ohjelmassa, mutta se ei aiheuta segmentointi vika.
Se ei ole aiheuttaa ohjelman lopettamaan tai mitään sellaista.
Tapa saada GDB keskeyttää ohjelman tietyssä vaiheessa
on asettaa murtuessa.
Voit joko tehdä tämän asettamalla keskeytyskohta on funktion nimi
tai voit asettaa keskeytyskohdan tietyn koodirivin.
Haluan asettaa raja-arvot on funktioiden nimiä, koska - helppo muistaa,
ja jos todella mennä ja muuttaa lähdekoodia jopa hieman,
Sitten sinun murtuessa todella yöpyä samassa paikassa omassa koodiin.
Taas jos käytät rivinumerot, ja rivinumerot muuttua
koska lisäät tai poista koodia, niin sinun keskeytyskohtia kaikki täysin sekaisin.
Yksi yleisimpiä asioita teen on asetettu keskeytyskohta on päätehtävä.
Usein minä käynnistyä GDB, minä tyyppi b tärkein Enter, ja että tulee asettaa keskeytyskohta
on tärkein ominaisuus, joka vain sanoo "keskeyttää ohjelman heti kun alkaa kulua"
ja näin, kun minä ajaa minun ohjelma, vaikkapa CS50 kiviä kaksi argumenttia
ja paina Enter, se pääsee päätehtävä ja se pysähtyy heti ensimmäinen rivi,
juuri ennen sen arvioi strcmp toimintoa.
>> Koska olen keskeytetty, nyt voin aloittaa mucking ympäri ja nähdä mitä tapahtuu
kaikki eri muuttujia, joita johdetaan oman ohjelman.
Täällä voin tulostaa argc ja katso mitä tapahtuu.
Nähdä, että argc on 3, koska se sai 3 eri arvoja sen.
Se sai ohjelman nimi, se sai ensimmäisen väitteen ja toinen argumentti.
Voimme tulostaa ne ulos katsomalla argv [0], argv [1], ja argv [2].
Nyt voit myös nähdä, miksi tämä strcmp puhelu menossa epäonnistua,
koska näet että se hajosi CS50 ja kiviä kahteen erilliseen argumentteja.
Tässä vaiheessa, kun olet osuma keskeytyskohdan, voit jatkaa vaiheeseen kautta ohjelma
rivi riviltä, ​​eikä aloittaa ohjelma uudelleen.
Joten jos et halua aloittaa ohjelma uudelleen ja jatka lukeminen tässä,
voit Jatka-komennon ja jatkaa ajaa ohjelman loppuun.
Aivan kuten se teki täällä.
Kuitenkin, jos käynnistä ohjelma, CS50 kiviä, se iskee minun keskeytyskohdan jälleen
ja tällä kertaa, jos en halua vain mennä kaikki läpi muun ohjelman
Voin käyttää seuraavaa komentoa, joka olen myös lyhenteenä n.
Ja tämä selata ohjelman rivi.
Joten voit katsella asioita suorittaa, koska muuttujia muutos, kun asiat saada päivitetään.
Mikä on ihan kiva.
Muut viileä asia on pikemminkin kuin toistaa samaa komentoa uudestaan ​​ja uudestaan ​​ja uudestaan,
jos vain enteriä - joten tässä näette en ole kirjoittanut mitään -
jos olen vain Enter, se toistaa edellisen komennon,
tai edellinen GDB komento minä vain laittaa sisään
Voin pitää lyödä Anna ja se tulee säilyttää tehostamalla läpi minun koodin rivi riviltä.
Kehotan teitä menemään tarkistaa muiden buginen ohjelmista.
Meillä ei ole aikaa saada läpi ne kaikki tänään osiossa.
Lähdekoodi on siellä, joten voit eräänlainen nähdä mitä tapahtuu
kulissien takana, jos saat todella jumissa,
mutta ainakin juuri harjoitella käynnistämistä GDB,
käynnissä ohjelma kunnes se hajoaa sinua,
saada backtrace, kuvauksen, mitä toimia romahdus oli,
mitä linjaa se oli, tulostaa joitakin muuttujan arvot,
vain niin saat tuntuman siitä, koska se todella auttaa sinua eteenpäin.
Tässä vaiheessa aiomme lopettaa ulos GDB, johon et käytät lopettaa tai vain q.
Jos ohjelma on keskellä käynnissä edelleen, ja se ei ole poistunut,
se kysyy aina, "Oletko varma, haluatko todella lopettaa?"
Voit painaa kyllä.
>> Nyt olemme menossa katsomaan seuraava ongelma meillä on, mikä on kissa ohjelma.
Jos katsot lyhyt suuntaamaan ja putket, näet, että Tommy käyttää tätä ohjelmaa
että periaatteessa tulostaa kaikki tuotos tiedoston näytölle.
Joten jos juoksen kissa, tämä on oikeastaan ​​sisäänrakennettu ohjelma laitteen
ja jos sinulla on Mac, voit tehdä tämän Macin myös, jos avaat päätteen.
Ja me - kissa, sanokaamme, cp.c, ja paina Enter.
Mitä tämä teki, jos me siirry ylös hieman ja nähdä, missä me juoksi linja,
tai jos me juoksi kissa komennon, se kirjaimellisesti vain tulostaa sisältöä cp.c meidän näyttöön.
Voimme käyttää sitä uudelleen ja voit laittaa useita tiedostoja yhteen.
Joten voit tehdä kissan cp.c, ja voimme myös liität cat.c tiedosto,
mikä on ohjelma aiomme kirjoittaa,
ja se tulee tulostaa sekä tiedostoja takaisin takaisin meidän näyttöön.
Joten jos vierittää ylös hieman, näemme, että kun me juoksi tämän kissan cp.c, cat.c,
ensin se tulostaa cp tiedosto, ja sitten sen alla, se tulostetaan cat.c tiedosto alas tänne.
Me aiomme käyttää tätä vain saada meidän jalat märkä.
Leikkiä yksinkertainen tulostus terminaaliin, miten se toimii.
Jos kaverit avata kanssa gedit cat.c Enter,
voit nähdä ohjelman aiomme kirjoittaa.
Olemme mukana tässä mukava kattila levy, joten meidän ei tarvitse käyttää aikaa kirjoittamalla kaikki ulos.
Olemme myös tarkistaa määrää argumenttien sisään
Me tulostaa kiva käyttöohje.
>> Tämä on sellainen asia, että taas, kuten olemme puhuneet,
se on melkein kuin lihas muisti.
Vain muistaa pitää tehdä samanlaista kamaa
ja aina tulostaa jonkinlainen hyödyllisiä viestin
niin että ihmiset osaavat ajaa ohjelmaa.
Kissa, se on melko yksinkertainen, olemme juuri menossa läpi kaikki eri argumentteja
jotka siirrettiin meidän ohjelmaan, ja aiomme tulostaa
niiden sisältö ulos näytön yksi kerrallaan.
Jotta tulostaa tiedostoja ulos näytön, aiomme tehdä jotain hyvin samanlaista
mitä teimme lopussa tietokilpailu.
Lopussa tietokilpailu, että vuokraus-ohjelma, meidän oli avata tiedoston,
ja sitten meillä oli tulostaa sen.
Tässä tapauksessa aiomme avata tiedoston, ja me aiomme lukea sen sijaan.
Sitten menemme tulostaa, sijasta tiedoston, aiomme tulostaa näyttöön.
Joten tulostaa näytölle olet kaikki tehnyt ennen kanssa printf.
Joten se ei ole liian hullu.
Mutta lukeminen tiedosto on eräänlainen outo.
Menemme läpi vähän kerrallaan.
Jos te mennä takaisin, että viime ongelma tietokilpailun, ongelma 33,
ensimmäinen rivi, että aiomme tehdä täällä, avaa tiedosto, on hyvin samanlainen kuin mitä teimme siellä.
Joten Stella, mitä se viiva näyttää, kun avaamme tiedoston?
[Stella] Capital FILE *, tiedosto - >> Okei. >> - On yhtä suuri kuin fopen. >> Jep.
Joka tässä tapauksessa on? Se on kommentti.
>> Se on kommentoida? argv [i] ja r?
>> Aivan. Aivan. Joten Stella on täysin oikeassa.
Tämä on mitä rivi näyttää.
Aiomme saada tiedoston stream muuttuja, säilytä se FILE *, joten kaikki lippikset,
FILE *, ja nimi Tämä muuttuja tiedostoon.
Voisimme kutsua sitä mitä haluamme. Voisimme kutsua sitä first_file tai file_i, mitä haluaisimme.
Ja sitten tiedoston nimi hyväksyttiin komentorivillä tähän ohjelmaan.
Joten se on tallennettuna argv [i,] ja sitten aiomme avata tämän tiedoston lukutilassa.
Nyt kun olemme avannut tiedoston, mitä asia, että meillä on aina muistaa tehdä
kun olemme avanneet tiedoston? Sulje se.
Joten Missy, miten suljemme tiedoston?
[Missy] fclose (tiedosto) >> fclose (tiedosto). Aivan.
Suuri. Okei. Jos tarkastelemme tätä tehdä kommentin täällä,
se sanoo, "Open argv [i] ja tulosta sen sisällön stdout."
>> Standard ulos on outo nimi. Stdout on vain meidän tapamme
haluamme tulostaa sen terminaalin, haluamme tulostaa sen vakiotulosteeseen stream.
Voimme todella päästä eroon tästä kommentti täällä.
Aion kopioida ja liittää sen jälkeen niinhän me teimme.
Tässä vaiheessa, nyt joudumme lukemaan tiedostoa vähän kerrallaan.
Olemme keskustelleet pari tapaa lukea tiedostoja.
Mitkä ovat suosikkejasi toistaiseksi?
Millä tavoin olet nähnyt tai muistatko, lukea tiedostoja?
[Daniel] fread? >> Fread? Joten fread on yksi. Jimmy, tiedätkö mitään muita?
[Jimmy] No >> Okei. Nope. Charlotte? Alexander? Kaikki muut? Okei.
Eli toisilla on fgetc, on joka käytämme paljon.
Mukana on myös fscanf; te nähdä kuvion täällä?
Ne kaikki alkavat f. Mitään tekemistä tiedoston.
On fread, fgetc, fscanf. Nämä ovat kaikki lukemisen toimintoja.
Kirjoittamista varten meillä on fwrite, meillä on fputc sijasta fgetc.
Olemme myös fprintf kuten näimme tietovisa.
Koska tämä on ongelma, joka liittyy lukemisen tiedostosta,
aiomme käyttää yhtä näistä kolmesta toiminnoista.
Emme aio käyttää näitä toimintoja tänne.
Nämä toiminnot löytyvät kaikki vakio I / O-kirjasto.
Joten jos tarkastellaan yläosassa ohjelman
voit nähdä, että olemme jo header tiedosto vakio I / O-kirjasto.
Jos haluamme selvittää kumpi haluamme käyttää,
Voimme aina avata man sivua.
Joten voimme kirjoittaa mies vakiotulosteesi
ja lue kaikki vakiotulosteesi tulon ja lähdön toiminnot C.
Ja voimme jo nähdä Kappas. Se on viittaavat fgetc, se viittaavat fputc.
Joten voit porata alas hieman ja katsoa vaikkapa fgetc
ja tarkastella sen man-sivulta.
Voit nähdä, että se menee yhdessä koko joukko muita toimintoja:
fgetc, fgets, getc, getchar, saa, ungetc, ja sen panos merkkien ja merkkijonojen.
Joten tämä on, miten luemme merkkejä ja merkkijonoja tiedostoista vakiosyötteestä,
joka on olennaisesti käyttäjältä.
Ja näin me teemme sen itse C.
Joten tämä ei käytä GetString ja GetChar toimintoja
että käytetty CS50 kirjastosta.
Me aiomme tehdä tämän ongelman pari tapaa
jotta voit nähdä kaksi eri tapaa tehdä se.
Sekä fread toiminto Daniel mainitut ja fgetc ovat hyviä tapoja tehdä se.
Mielestäni fgetc on hieman helpompaa, koska se on vain, kuten näette,
yhden argumentin, FILE * että yritämme lukea merkki,
ja sen paluuarvo on int.
Ja tämä on hieman sekava, eikö?
>> Koska saamme merkin, joten miksi ei tätä paluuta char?
Teillä mitään ideoita miksi tämä ei välttämättä palauta char?
[Missy vastauksia, käsittämätön] >> Joo. Joten Missy on täysin oikeassa.
Jos se on ASCII, niin tämä kokonaisluku voidaan kuvata todellista merkkiä.
Voisiko olla ASCII, ja se on oikein.
Juuri mitä tapahtuu.
Käytämme int yksinkertaisesti koska se on enemmän bittejä.
Se on suurempi kuin char; meidän char on vain 8 bittiä, että 1 tavu meidän 32-bit koneita.
Ja int on kaikki 4 tavua edestä tilaa.
Ja näyttää siltä, ​​että niin fgetc toimii,
jos me vierittää meidän synopsis tämän miehen sivun vähän,
selaa kaikki alas. On käynyt ilmi, että he käyttävät tätä erityistä arvoa nimeltään EOF.
Se on erityinen vakiona paluuarvon fgetc funktion
kun osut tiedoston loppuun tai jos saat virheilmoituksen.
Ja näyttää siltä, ​​että tekemistä näiden vertailuja EOF oikein,
Haluatko olla, että ylimääräinen määrä tietoa, että sinulla on int
vastakohtana käyttäen char muuttuja.
Vaikka fgetc tehokkaasti saada merkin tiedostosta,
haluat muistaa että se on palaamassa jotain, joka on tyyppiä int sinulle.
Se sanoi, se on melko helppo käyttää.
Se antaa meille merkin, joten meidän täytyy tehdä, on pitää pyytää tiedostoa,
"Anna minulle seuraavan merkin, anna minulle seuraavan merkin, anna minulle seuraavan merkin"
kunnes saamme tiedoston loppuun.
Ja se vetää yksi merkki kerrallaan meidän tiedoston,
ja sitten voimme tehdä mitä haluamme sen kanssa.
Voimme tallentaa sen, voimme lisätä sen merkkijono, voimme tulostaa sen.
Tehdä mitään siitä.
>> Zoomaus takaisin ulos ja menee takaisin meidän cat.c ohjelmaan
Jos aiomme käyttää fgetc,
miten voi lähestymme tätä seuraava rivi koodia?
Aiomme käyttää - fread tekee jotain hieman erilaista.
Ja tällä kertaa olemme juuri menossa käyttää fgetc saada yhden merkin kerrallaan.
Käsitellä koko tiedoston, mitä voisi meidän täytyy tehdä?
Kuinka monta merkkiä siellä tiedoston?
On olemassa paljon. Joten todennäköisesti haluat saada yksi
ja sitten saat toisen ja saada toinen ja saada toinen.
Millaisia ​​algoritmin luulet saatamme joutua käyttämään täällä?
Millaisia ​​-? [Alexander] for silmukka? >> Aivan.
Tietyntyyppinen silmukan.
For silmukka on todella suuri, tässä tapauksessa.
Ja kuten sanoit, se kuulostaa haluat silmukan koko tiedoston,
saada merkki kerrallaan.
Kaikki ehdotukset siitä, mitä se voisi näyttää?
[Alexander, käsittämättömällä]
>> Okei, kerro minulle Englanti mitä yrität tehdä? [Alexander, käsittämättömällä]
Joten tässä tapauksessa se kuulostaa me vain yritämme silmukan koko tiedoston.
[Alexander] Joten i > Koko -?
Oletan tiedoston kokoa, eikö? Koko - we'll vain kirjoittaa sen näin.
Tiedoston koko toistaiseksi, i + +.
Joten näyttää siltä, ​​että niin teet tämän käyttämällä fgetc, ja tämä on uutta,
on, että ei ole helppo tapa vain saada koko tiedoston
Tämän "sizeof" tyyppinen rakentaa että olet nähnyt ennen.
Kun käytämme että fgetc toimintoa, otamme käyttöön jonkinlainen
uusi, funky syntaksia tätä silmukka, jossa sijasta vain perus laskuri
mennä merkki merkiltä, ​​me aiomme vetää yhden merkin kerrallaan,
yksi merkki kerrallaan, ja miten me tiedämme, että olemme lopussa
ei kun olemme lasketa tiettyjä merkkejä,
mutta kun hahmo me vedä että erityinen tiedoston loppu luonnetta.
Joten voimme tehdä tämän - Kutsun tätä kjs, ja aiomme sen alustamiseen
meidän ensimmäinen puhelu saada ensimmäinen merkki pois tiedoston.
Joten tämä osa täällä, tämä on menossa merkin pois tiedoston
ja tallenna se muuttujaan ch.
Aiomme pitää tätä kunnes saamme loppuun tiedoston,
jonka teemme testaamalla merkin ei ole sama kuin että erityistä EOF luonnetta.
Ja sitten sen sijaan tehdä ch + +, mikä olisi vain n arvoa,
joten jos luemme ulos tiedoston, pääoma, sanovat,
ch + + antaisi meille b, ja sitten saisin c ja sitten d.
Se ei selvästikään ole mitä haluamme. Mitä me haluamme täällä
Tässä viimeinen bitti haluamme saada seuraavan merkin tiedostosta.
>> Joten miten voisi saamme seuraavan merkin tiedostosta?
Miten saamme ensimmäisen merkin tiedoston?
[Student] fgetfile? >> Fgetc, tai anteeksi, olit täysin oikeassa.
Minä kirjoitusvirhe se oikeassa. Niin joo.
Täällä sen sijaan tehdä ch + +,
olemme juuri menossa soittaa fgetc (tiedosto) uudelleen
ja tuloksen tallentaminen meidän samaan kjs muuttuja.
[Student kysymys, käsittämättömällä]
>> Tässä on nämä FILE * kaverit ovat erityisiä.
Miten he työskentelevät he - kun avaat - kun ensin tehdä se fopen puhelun
FILE * tehokkaasti toimii osoittimen tiedoston alusta.
Ja sitten aina kutsua fgetc, se liikkuu yhden merkin kautta tiedosto.
Joten jos soittaa tämän, olet kasvattamalla tiedoston osoitin yhden merkin.
Ja kun fgetc taas, olet muuttamassa sen toisen hahmon
ja toinen merkki ja toinen merkki ja toinen merkki.
[Student kysymys, käsittämätön] >> ja that's - joo.
Se on tavallaan tämä taika konepellin alle.
Sinä vain pitää lisäävä kautta.
Tässä vaiheessa et voi todella työskennellä merkki.
Joten miten voisi voimme tulostaa tämän ulos näytön, nyt?
Voimme käyttää samaa printf asia, että me käytetään ennen.
Että olemme käyttäneet kaikki lukukauden.
Voimme soittaa printf,
ja voimme kulkea luonteeltaan vain.
Toinen tapa tehdä se on pikemminkin kuin käyttämällä printf ja ottaa tähän muotomerkkijonoa,
Voimme myös käyttää yhtä muita toimintoja.
Voimme käyttää fputc, joka tulostaa merkin näytölle,
paitsi jos katsomme fputc - haluan loitontaa vähän.
Näemme mitä mukavaa se vie merkin, että luemme käyttäen fgetc,
mutta sitten meidän täytyy antaa se virta tulostaa.
Voimme käyttää myös putchar toiminto, joka laittaa suoraan tavallisen ulos.
Joten on olemassa koko joukko erilaisia ​​vaihtoehtoja, joita voimme käyttää tulostukseen.
He kaikki vakio I / O-kirjasto.
Kun haluat tulostaa - niin printf, oletuksena tulostaa erityisiin standardin ulos stream,
joka on, että stdout.
Joten voimme vain viitata se sellaista tämä taika arvoa, stdout täällä.
Oho. Laita puolipiste ulkopuolella.
>> Tämä on paljon uutta, funky tietoa täältä.
Paljon tämä on hyvin idiomaattinen, siinä mielessä, että tämä on koodi
että on kirjoitettu tällä tavalla vain koska se on puhdas lukea, helppo lukea.
On olemassa monia erilaisia ​​tapoja tehdä sitä, monia eri toimintoja voi käyttää,
mutta meillä on tapana vain noudattaa näitä samoja kuvioita uudestaan ​​ja uudestaan.
Joten älä ihmettele, jos näet koodia näin tulossa uudestaan ​​ja uudestaan.
Selvä. Tässä vaiheessa meidän on pakko rikkoa päivän.
Kiitos, että tulit. Kiitos katsomassa jos olet verkossa. Ja näemme ensi viikolla.
[CS50.TV]