SPEAKER: Toistaiseksi se on todennäköisesti että useimmat ohjelmat on ollut hieman lyhytaikaisia. Voit suorittaa ohjelman kuten Mario tai ahne. Se tekee jotain, se ehkä kysyy käyttäjän joitakin tietoja, tulostaa joitakin tulosteita, mutta sitten kun ohjelma on ohi, siellä oikeastaan ​​mitään todisteita siellä se oli koskaan ajaa ensiksi. Tarkoitan, varmasti, olet ehkä jäljellä se avautuu pääteikkunaa mutta jos tyhjentää näytön, siellä oikeastaan ​​mitään todisteita siitä, että se oli olemassa. Meillä ei ole tallentavat pysyviä tietoja, tiedot että olemassa jälkeen meidän Ohjelma on pysähtynyt, tai emme ole tähän asti. Onneksi kuitenkin, C ei meille mahdollisuuden tehdä tämän toteuttamalla jotain kutsutaan tiedosto, rakenne, joka periaatteessa edustaa tiedosto kaksinkertaistuisi klikkaa tietokoneeseen, jos olet käyttää graafinen ympäristö. Yleensä kun työ C, olemme todella tulevat työskentelemään kanssa viitteitä files-- tiedosto stars-- lukuun ottamatta hieman kun puhumme pari toimintoja, jotka työskennellä tiedosto viitteitä. Sinun ei tarvitse olla todella kaivettiin liian syvälle ymmärrys osoittimet itse. Siellä on pieni pikkuinen vähän jossa puhumme niistä, mutta yleensä tiedosto osoittimet ja osoittimet, kun taas toisiinsa, eivät ole täsmälleen sama asia. Nyt mitä tarkoitan kun Sanon pysyviä tietoja? Mikä on pysyviä tietoja? Miksi me välitä siitä? Sano esimerkiksi, että käytät ohjelma tai olet uusiksi ohjelma, joka on peli, ja haluat seurata kaikki käyttäjän liikkuu joten ehkä jos jokin menee pieleen, voit tarkistaa tiedoston pelin jälkeen. Sitähän me tarkoitamme, kun me puhua pysyviä tietoja. Aikana käynnissä ohjelma, tiedosto luodaan. Ja kun ohjelma on pysähtynyt, että tiedosto on edelleen olemassa järjestelmässä. Ja voimme katsoa sitä ja tutkia sitä. Ja jotta ohjelma olisi asetettu ovat luoneet pysyviä tietoja, tiedot ovat olemassa, kun ohjelma on päättynyt. Nyt kaikki nämä toiminnot, jotka toimivat luomisessa tiedostoja ja manipuloida niitä eri tavoin elävät vakio io.h, joka on header tiedosto, joka olet todennäköisesti ollut punnan myös yläosassa melko paljon kaikki ohjelmat koska se sisältää yhden eniten hyödyllisiä toimintoja meille, printf, että myös avulla asuu vakio io.h. Joten sinun ei tarvitse punta sisällyttää muita tiedostoja luultavasti voidakseen työskennellä tiedostojen viitteitä. Nyt jokainen tiedosto osoitin toiminto, tai joka ikinen tiedosto I / O, Input Output toiminto, hyväksyy yhtenä sen parametrit tai tuotantopanosten Tiedoston pointer-- paitsi yksi, fopen, joka on mitä käytät saada tiedosto osoitin ensiksi. Mutta kun olet avannut tiedosto ja saat tiedosto viitteitä, voit sitten siirtää niitä argumentteja eri toimintojen aiomme puhua tänään, samoin kuin monet muut jotta voit työskennellä tiedostoja. Joten on kuusi melko Yhteisten niistä että me aiomme puhua tänään. fopen ja sen seuralainen toiminto fclose, fgetc ja sen seuralainen toiminto fputc, ja fread ja sen seuralainen toiminto, fwrite. Joten saada oikeutta siihen. fopen-- mitä se tekee? No, se avaa tiedoston ja se antaa sinulle tiedoston osoitin sen, jotta voit käyttää tätä tiedoston osoitin argumenttina Minkä tahansa muiden tiedostojen I / O-toimintoja. Kaikkein tärkein asia muistaa kanssa fopen on, että kun olet avannut tiedostoon tai teki puhelun kuin yksi täällä, sinun täytyy varmista että osoitin että sait takaisin ei ole yhtä suuri null. Jos et ole katsellut video osoittimet, tämä ei välttämättä ole järkeä. Mutta jos yrität ja dereference nollaosoittimen muistaa, ohjelma todennäköisesti kärsimään segmentointi [kuultavissa]. Haluamme varmistaa, että meillä sai laillinen osoitin takaisin. Valtaosa ajasta me ovat saaneet oikeutettu osoitin takaisin ja se ei ole ongelma. Miten siis soittaa fopen? Se näyttää melko paljon kuin tämä. Tiedoston tähden ptr-- ptr on geneerinen nimetä tiedostojen pointer-- fopen ja ohitamme kaksi asiaa, tiedoston nimi ja toiminta haluamme toteuttaa. Joten saatamme olla puhelu, joka näyttää this-- tiedosto tähti PTR 1 vastaa fopen file1.txt. Ja toimenpide olen valinnut on r. Mitä luulet r on täällä? Mitkä ovat erilaisia ​​asioita ehkä tehdä tiedostoja? Joten r on toimintaa, että me valita, milloin haluamme lukea tiedostoa. Joten olisimme periaatteessa kun me soittaa näin saamaan itsemme tiedoston osoitin niin että voisimme sitten lukea tietoja alkaen file1.txt. Samoin, voisimme avata tiedoston 2.txt kirjoitus- ja jotta voimme välittää ptr2, tiedosto osoitin Olen luonut täällä, argumenttina jokin toiminto kirjoittaa tiedot tiedostoon. Ja samanlainen kirjallisesti, siellä myös mahdollisuus liittää,. Ero kirjallisesti ja liittämällä on, että kun kirjoitat tiedostoon, jos soittaa fopen kirjoittamiseen ja että tiedosto on jo olemassa, se on menossa korvata koko tiedoston. Se tulee aloittaa aivan alussa, poistaa kaikki tiedot joka on jo olemassa. Ottaa huomioon, että jos avaat sen liittämällä, se menee loppuun tiedoston jos on jo tekstiä se tai sen sisältämä tieto, ja se sitten alkaa kirjallisesti sieltä. Joten et menetä mitään tietoja, jotka olet tehnyt ennen. Haluatko kirjoittaa tai liittää tavallaan riippuu tilanteesta. Mutta luultavasti tietää mitä oikea toiminta on, kun sen aika tulee. Niin, että fopen. Entä fclose? No, ihan yksinkertaisesti, fclose vain hyväksyy tiedoston osoitin. Ja kuten arvata saattaa, se sulkee tiedoston. Ja kun olemme suljettu tiedoston, emme voi suorittaa enää tiedoston I / O-toimintojen, tai lukee, kyseisestä tiedostosta. Meidän täytyy avata uudelleen tiedoston toisen kerran, jotta jatkamaan työtä sitä käyttämällä I / O-toimintoja. Joten fclose avulla olemme tehneet työskennellä tämän tiedoston. Ja kaikki meidän täytyy kulkea on tiedoston nimi osoittimen. Joten pari liukuu sitten, me fopened tiedosto 1 piste tekstin lukemiseen ja me määritetty että tiedosto osoitin ptr1. Nyt olemme päättäneet olemme tehty lukemisen tiedoston. Emme tarvitse tehdä enää sen kanssa. Voimme vain fclose ptr1. Ja vastaavasti voisi me FSulje toisilla. Selvä. Jotta avaus ja sulkeminen. Ne ovat kaksi perus toiminnan aloittamista. Nyt haluamme todella tehdä joitakin mielenkiintoisia juttuja, ja ensimmäinen toiminto että me will nähdä, että tekee se on fgetc-- tiedosto saada merkin. Sitähän fgetc yleensä olisi kääntää. Sen tavoitteena elämässä on Lue seuraava merkki, tai jos tämä on hyvin Ensimmäinen puhelu fgetc tietyn tiedoston, ensimmäinen merkki. Mutta sitten sen jälkeen, saat seuraava, hyvin seuraavan merkin kyseisen tiedoston, ja tallentaa sen merkin muuttujaan. Kuten olemme tehneet täällä, char ch vastaa fgetc, pass nimissä tiedoston osoitin. Taaskin se on hyvin tärkeää täällä muistaa että jotta on tämä operaatio onnistuu, tiedosto osoitin itse varmaan avattu lukemista varten. Emme voi lukea merkin tiedostosta osoitin, että avasimme kirjoittamista varten. Joten se on yksi rajoitukset fopen, eikö? Meidän on rajoittaa itseämme vain suorittamista yksi kanssa yhden tiedoston osoitin. Jos halusimme lukea ja kirjoittaa samasta tiedostosta, meillä olisi auki kaksi erillistä tiedosto viitteitä samaan file-- yksi lukemiseen, yksi kirjoittamista varten. Joten jälleen, ainoa syy Tuon että nyt on koska jos aiomme soittaa sen fgetc, että tiedosto osoitin täytynyt avattu lukemista varten. Ja sitten melko yksinkertaisesti, kaikki meidän täytyy tehdä on kulkea tiedoston nimi osoittimen. Joten char ch vastaa fgetc ptr1. Että menee saada meidät seuraava character-- tai uudelleen, jos tämä on ensimmäinen kerta, kun olemme tehneet tämän puhelun, ensimmäinen character-- riippumatta tiedosto on osoitteen sivulle ptr1. Muista, että se oli tiedosto 1 piste tekstiä. Se saat ensimmäisen merkin, joka ja me tallentaa sen muuttujaan ch. Melko yksinkertainen. Joten olemme vain katseli kolme toiminnot ja jo me voi tehdä jotain ihan siisti. Joten jos otamme tämän mahdollisuuden saada merkki ja me silmukka it-- niin me edelleen saada merkkiä tiedostosta yli ja yli ja over-- nyt voi lukea jokaisen luonnetta tiedoston. Ja jos me tulostaa jokaisen merkin heti kun lukea sitä, olemme nyt luetaan tiedostosta ja painettu sen sisällön näytön. Olemme tehokkaasti ketjutettujen että tiedosto ruudulla. Ja sitähän Linux komento kissa tekee. Jos kirjoitat kissa tiedoston nimi, se tulostaa koko sisältö tiedoston oman pääteikkunassa. Ja niin tämä pieni silmukka täällä, vain kolme riviä koodia, mutta sitä tehokkaasti päällekkäinen Linux komento kissa. Joten tämä syntaksi pitää näyttää hieman outo, mutta tässä mitä täällä tapahtuu. Vaikka ch vastaa fgetc, PTR ei ole sama EOF-- se on koko suupala, mutta katsotaan murtaa se alas vain joten se selväksi syntaksin. Olen konsolidoitu sen vuoksi tilaa, vaikka se on vähän syntaktisesti hankala. Joten tämä osa vihreä oikeassa nyt, mitä se tekee? No, se on vain meidän fgetc soittaa, eikö? Olemme nähneet, että ennen. Se saadakseen yhtä hahmo tiedosto. Sitten vertaamme että merkki vastaan ​​EOF. EOF on erityinen arvo, joka on määritelty standardissa io.h, joka on tiedoston loppuun luonnetta. Joten periaatteessa mitä tulee tapahtumaan on tämä silmukka lukee hahmo, vertaa sitä EOF, tiedoston loppuun luonnetta. Jos ne eivät täsmää, joten meillä ei lopussa tiedoston, me tulostaa että hahmosi ulos. Sitten menemme takaisin alussa silmukan uudelleen. Saamme merkin, tarkista vastaan ​​EOF, tulostaa sen, ja niin edelleen ja niin edelleen ja niin edelleen, looping kautta tällä tavalla kunnes olemme saavuttaneet tiedoston loppuun. Ja sitten siihen mennessä, olemme painettu ulos koko tiedoston sisältö. Joten jälleen olemme vain nähneet fopen, fclose, ja fgetc ja jo voimme monistaa Linux terminaaliin komento. Kuten sanoin alussa, meillä oli fgetc ja fputc, ja fputc oli seuralainen funktio fgetc. Ja niin, kuin voisi kuvitella, se on kirjallisesti vastaava. Se antaa meille mahdollisuuden kirjoittaa yhden merkin tiedostoon. Jälleen varoitus on, vain kuin se oli kanssa fgetc, tiedosto että me kirjallisesti täytynyt olla avataan kirjoittamista tai liittämällä. Jos yritämme käyttää fputc tiedostoa että olemme avataan lukemista, aiomme kärsiä hieman virhe. Mutta puhelu on melko yksinkertainen. fputc pääoman ptr2, kaikki joka tulee tehdä, on se menossa kirjoittaa kirjettä osaksi tiedostoon 2 dot teksti, joka oli nimi aineistosta ilmenee, että avasimme ja osoitetaan osoitin ptr2. Joten aiomme kirjoittaa pääoma tiedostoon 2 pisteen tekstiä. Ja me kirjoittaa huudahdus kohta tiedostoon 3 piste teksti, joka on osoitteen sivulle ptr3. Joten jälleen, melko suoraviivaista täällä. Mutta nyt voimme tehdä toinen asia. Meillä on tässä esimerkissä olimme juuri menossa yli olemisesta pysty jäljittelemään kissa Linux komento, joka tulostaa näyttöön. No, nyt, että meillä on mahdollisuus lukemaan merkkejä tiedostoista ja kirjoittaa merkkiä tiedostoja, miksi emme vain korvata, että soittaa printf kanssa puhelun fputc. Ja nyt olemme monistaa cp, hyvin yksinkertainen linux komento että puhuimme miten pitkän sitten Linux komennot video. Olemme tehokkaasti kahdennettu että täällä. Me luet merkki ja sitten olemme kirjallisesti, että merkin toiseen tiedostoon. Lukeminen tiedostosta, kirjoittaminen toiseen, yli ja yli ja uudestaan, kunnes me osuma EOF. Meillä loppuun tiedosto yritämme kopioida. Ja että me kirjoittanut kaikki merkkien meidän tiedosto että me kirjallisesti. Joten tämä on cp, Linux kopiointikomentoa. Vuoden alusta Tämän videon, minulla oli varoitus että juttelimme vähän tietoa viitteitä. Tässä on nimenomaan missä olemme aio puhua viitteitä lisäksi tiedostoon viitteitä. Joten tämä toiminto näyttää pelottavalta. Se sai useita parametreja. Siellä on paljon täällä. Siellä on paljon erilaisia värejä ja tekstejä. Mutta oikeasti, se on vain geneeristä fgetc jonka avulla voimme saada mitään määrä tietoa. Se voi olla hieman tehotonta, jos olemme saada merkit yksi kerrallaan, iteroimalla läpi tiedosto yksi merkki kerrallaan. Eikö olisi mukavampaa saada 100 kerrallaan tai 500 kerrallaan? No, fread ja sen seuralainen toiminto fwrite, joka me puhumme toisessa, jotta voisimme tehdä juuri niin. Voimme lukea mielivaltaisen määrän Tietojen tiedostosta ja me tallentaa sen jonnekin tilapäisesti. Sen sijaan, että voimme vain asenna se yhden muuttujan, saatamme tarvita tallenna se jono. Ja niin, välitämme neljässä argumentteja fread-- osoitin paikkaan, johon olemme menossa tallentaa tietoa, kuinka suuri kukin tiedon yksikkö on, kuinka monta yksikköä tietoa haluamme hankkia, ja joka tiedosto haluamme saada ne. Kuvaa ehkä parhaiten esimerkin tästä. Joten sanotaan, että julistamme joukko 10 kokonaislukuja. Olemme juuri ilmoitettu pino mielivaltaisesti int sov 10. Niin se on melko yksinkertainen. Nyt mitä teemme kuitenkin on frecall on me luet koko int kertaa 10 tavua informaatiota. Koko int olennon four-- se koko kokonaisluku C. Joten mitä teemme on meidän luet 40 tavua arvoinen tiedot tiedostosta osoitteen sivulle PTR. Ja me tallentamiseen ne 40 tavua jonnekin jossa olemme varautuneet 40 tavua arvoinen muistia. Onneksi olemme jo tehneet, että julistamisesta sov, että array oikeassa. Joka pystyy tilan 10 neljän tavun yksikköä. Joten yhteensä, se mahtuu 40 tavua arvoinen tietoja. Ja nyt käsittelyssä 40 tavua Tietojen tiedostosta, ja olemme tallentamalla sen sov. Muistamme video viitteitä, että nimi array, kuten sov, on oikeastaan ​​vain osoitin sen ensimmäinen elementti. Joten kun me kulkea sov siellä, me ovat itse asiassa ohimennen osoitin. Samoin voimme tehdä this-- emme välttämättä täytyy pelastaa puskuri pinoon. Voisimme myös dynaamisesti varata puskuri näin, käyttäen malloc. Muista, kun dynaamisesti varata muistia, säästämme sen kasaan, ei pino. Mutta se on silti puskuri. Se vielä, tässä tapauksessa on tilalla 640 tavua tietoja koska kaksinkertainen vie kahdeksan tavua. Ja pyydämme 80 niistä. Haluamme olla tilaa pitää 80 nelinpelin. Joten 80 kertaa 8 on 640 tavua tietoa. Ja että kutsu fread on keräämällä 640 tavua tietoa tiedostosta osoitteen sivulle ptr ja varastoimalla se nyt arr2. Nyt voimme myös hoitaa fread aivan kuten puhelun fgetc. Tässä tapauksessa, me vain yrittää saat yhden merkin tiedostosta. Ja meidän ei tarvitse array pitää merkin. Voimme vain tallentaa sen merkki muuttuja. Saalis on kuitenkin se, että kun meillä vain on muuttuva, meidän täytyy kulkea osoite muuttujan koska muistaa, että ensimmäinen argumentti fread on kohdistin ja muisti jossa haluamme tallentaa tiedot. Jälleen nimi array on osoitin. Joten meidän ei tarvitse tehdä ampersand array. Mutta C-merkki C täällä, ei ole array. Se on vain muuttuja. Ja niin meidän täytyy kulkea Ampersand C osoittamaan että se on osoite, johon haluamme tallentaa tämän yhden tavun tietoja, tämä yksi merkki, joka olemme kerätä päässä PTR. Fwrite-- Käyn läpi tämä hieman enemmän quickly-- on melko paljon tarkka vastaa fread paitsi se on kirjoitus- lukemisen sijaan, vain kuten other-- meillä on ollut auki ja lähellä, saada merkin, kirjoittaa merkin. Nyt on saada mielivaltainen määrä tietoa, oikea mielivaltainen määrä tietoa. Joten aivan kuten ennen, voimme on joukko 10 kokonaislukuja jossa meillä on jo tallennetut tiedot, ehkä. Se oli todennäköisesti joitakin riviä koodia että pitäisi mennä näiden kahden jossa olen täyttää sov kanssa jotain merkityksellistä. Olen täytä se 10 eri kokonaislukuja. Ja sen sijaan, mitä olen tekemässä kirjallisesti sov ja keräämällä tietoja sov. Ja otan että tiedot ja laittoi pallon tyhjään tiedostoon. Joten sen sijaan, että on peräisin tiedosto puskuriin, olemme nyt menee puskuri tiedostoon. Joten se on juuri päinvastaiset. Joten jälleen, kuten ennen, voimme myös kasaan kimpale muisti että olemme dynaamisesti jaetaan ja lukea, että ja kirjoittaa, että tiedosto. Ja meillä on myös yhden muuttujan pystyttävä pitämään yhden tavun koskevien tietojen, kuten merkin. Mutta jälleen kerran, meidän täytyy kulkea osoitteen muuttujan kun haluamme lukea siitä. Joten voimme kirjoittaa tiedot löydämme tähän osoitteeseen tiedoston osoitin PTR. On paljon muita Tiedoston I / O-toiminnot jotka tekevät eri asioita lisäksi niistä olemme puhuneet tänään. Pari niistä saatat löytää hyödyllistä ovat fgets ja fputs, jotka ovat yhtä sekä fgetc ja fputc mutta lukemiseen yksittäinen merkkijono tiedostosta. Sen sijaan yhden merkin, se lukee koko merkkijono. fprintf, joka pohjimmiltaan avulla voit käyttää printf kirjoittaa tiedostoon. Joten aivan kuten voit tehdä muuttuja korvaaminen käyttäen paikkamerkit prosenttia i ja prosenttia d, ja niin edelleen, printf voit samalla ottaa printf merkkijono ja tulostaa jotain kuin että tiedostoon. fseek-- jos sinulla on DVD-soitin on analogisesti Käytän yleensä here-- on tavallaan kuin käytät pikakelaavat painikkeita liikkua elokuva. Samoin voit liikkua tiedosto. Yksi asioita sisällä että tiedosto rakenne että C luo sinulle on indikaattori missä olet tiedoston. Oletko aivan alkaa, tavun nolla? Oletteko tavu 100, tavu 1000, ja niin edelleen? Voit käyttää fseek mielivaltaisesti siirtää että indikaattori eteen- tai taaksepäin. Ja ftell, jälleen samanlainen DVD-soitin, on kuin pieni kello, joka kertoo kuinka monta minuuttia ja sekuntia sinua ovat osaksi tietyn elokuvan. Samoin ftell kertoo, kuinka monta tavua olet osaksi tiedoston. feof on erilainen versio havaita onko olet lopussa tiedoston. Ja ferror on funktio että voit käyttää havaita onko jotain on mennyt pieleen Työskentely tiedosto. Tämäkin on vain esimakua. On vielä paljon enemmän tiedosto I / O- toiminnot standardin io.h. Mutta tämä luultavasti sinut aloitti työt tiedosto viitteitä. Olen Doug Lloyd. Tämä on CS50.