1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Tiedosto I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Harvardin yliopisto] 3 00:00:04,000 --> 00:00:07,000 [Tämä on CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kun ajattelemme tiedoston, mitä tulee mieleen on Microsoft Word-asiakirjan, 5 00:00:11,000 --> 00:00:14,000 JPEG-kuvan tai MP3 song, 6 00:00:14,000 --> 00:00:17,000 ja me vuorovaikutuksessa kukin näistä tyyppisiä tiedostoja eri tavoin. 7 00:00:17,000 --> 00:00:20,000 Esimerkiksi Word-asiakirjassa lisätä tekstiä 8 00:00:20,000 --> 00:00:24,000 mutta joiden JPEG-kuvan voisimme rajata reunoja tai korjailla värejä. 9 00:00:24,000 --> 00:00:28,000 Silti konepellin alle kaikki tiedostot meidän tietokone ei ole muuta 10 00:00:28,000 --> 00:00:31,000 kuin pitkä sarja nollia ja ykkösiä. 11 00:00:31,000 --> 00:00:33,000 Se on jopa erityinen sovellus vuorovaikutuksessa tiedosto 12 00:00:33,000 --> 00:00:38,000 päättää, miten käsitellä tätä pitkää järjestyksessä ja esittää sen käyttäjälle. 13 00:00:38,000 --> 00:00:41,000 Toisaalta, asiakirja, jossa voi tarkastella vain yhden tavun, 14 00:00:41,000 --> 00:00:45,000 tai 8 nollia ja ykkösiä, ja näyttää ASCII-merkin näytöllä. 15 00:00:45,000 --> 00:00:48,000 Toisaalta, bittikarttakuvana voi tarkastella 3 tavua, 16 00:00:48,000 --> 00:00:50,000 tai 24 nollia ja ykkösiä, 17 00:00:50,000 --> 00:00:53,000 ja tulkita niitä 3 heksadesimaaliluvut 18 00:00:53,000 --> 00:00:56,000 , jotka edustavat arvot punainen, vihreä ja sininen 19 00:00:56,000 --> 00:00:58,000 yhden pikselin kuvan. 20 00:00:58,000 --> 00:01:01,000 Mitä he voivat näyttää ruudulla, ytimessä, 21 00:01:01,000 --> 00:01:05,000 tiedostot ovat vain sarja nollia ja ykkösiä. 22 00:01:05,000 --> 00:01:08,000 Joten sukeltaa ja katsoa miten todella manipuloida näitä nollia ja ykkösiä 23 00:01:08,000 --> 00:01:12,000 kun se tulee kirjallisesti ja lukee tiedoston. 24 00:01:12,000 --> 00:01:15,000 >> Aloitan rikkomalla se alas yksinkertainen 3-osa prosessia. 25 00:01:15,000 --> 00:01:19,000 Seuraavaksi minä sukeltaa kahteen koodi esimerkkejä, jotka osoittavat nämä kolme osaa. 26 00:01:19,000 --> 00:01:23,000 Lopuksi, minä tarkastella prosessia ja joitakin sen tärkeimpiä yksityiskohtia. 27 00:01:23,000 --> 00:01:25,000 Kuten minkä tahansa tiedoston, joka istuu työpöydällä, 28 00:01:25,000 --> 00:01:28,000 ensimmäinen asia tehdä on avata se. 29 00:01:28,000 --> 00:01:31,000 C teemme tätä julistamalla osoitin ennalta struct 30 00:01:31,000 --> 00:01:33,000 joka edustaa tiedoston levylle. 31 00:01:33,000 --> 00:01:38,460 Tässä toiminto soittaa, me myös päättää haluamme kirjoittaa tai lukea tiedostosta. 32 00:01:38,460 --> 00:01:41,660 Seuraavaksi teemme varsinaisen lukemisen ja kirjoittamisen. 33 00:01:41,660 --> 00:01:44,800 On olemassa useita erikoistuneita toimintoja voimme käyttää tässä osassa, 34 00:01:44,800 --> 00:01:48,790 ja lähes kaikki heistä alkavat kirjaimella F, mikä tarkoittaa tiedostoa. 35 00:01:48,790 --> 00:01:53,560 Viimeinen, muistuttaa pieni punainen X yläkulmassa tiedostoja auki tietokoneessa, 36 00:01:53,560 --> 00:01:56,680 suljemme tiedoston lopullinen funktiokutsuna. 37 00:01:56,680 --> 00:01:59,540 Nyt meillä on yleinen käsitys siitä, mitä aiomme tehdä, 38 00:01:59,540 --> 00:02:02,000 Katsotaanpa sukeltaa koodi. 39 00:02:02,000 --> 00:02:06,100 >> Tässä hakemistossa, meillä on kaksi C-tiedostoja ja niitä vastaavat ohjelmatiedostoja. 40 00:02:06,100 --> 00:02:09,710 Kirjoituskone Ohjelma kestää yhden komentorivin argumentti, 41 00:02:09,710 --> 00:02:12,060 dokumentin nimi haluamme luoda. 42 00:02:12,060 --> 00:02:16,160 Tässä tapauksessa me kutsumme sitä doc.txt. 43 00:02:16,160 --> 00:02:19,080 Katsotaanpa suorita ohjelma ja anna pari riviä. 44 00:02:19,080 --> 00:02:23,660 Hei. Nimeni on Jason. 45 00:02:23,660 --> 00:02:26,710 Lopuksi, me kirjoita "lopeta". 46 00:02:26,710 --> 00:02:29,720 Jos me nyt luetella kaikki tiedostot tässä hakemistossa, 47 00:02:29,720 --> 00:02:33,770 näemme, että uusi asiakirja on olemassa nimeltään doc.txt. 48 00:02:34,190 --> 00:02:36,110 Tuo tiedosto ohjelman juuri luotu. 49 00:02:36,110 --> 00:02:40,520 Ja tietenkin, sekin on vain pitkä sarja nollia ja ykkösiä. 50 00:02:41,100 --> 00:02:43,260 Jos avaamme uuden tiedoston, 51 00:02:43,260 --> 00:02:45,870 näemme 3 riviä koodia solmimme ohjelmaamme - 52 00:02:46,060 --> 00:02:49,060 Hei. Toukokuu nimi on Jason. 53 00:02:49,580 --> 00:02:52,090 Mutta mitä todella tapahtuu kun typewriter.c toimii? 54 00:02:52,810 --> 00:02:55,520 Ensimmäinen rivi kiinnostaa meitä on linjan 24. 55 00:02:55,560 --> 00:02:58,490 Tätä linjaa, me tunnustamme tiedoston osoitin. 56 00:02:59,080 --> 00:03:03,140 Funktio, joka palauttaa tämä osoitin, fopen, ottaa kaksi argumenttia. 57 00:03:03,140 --> 00:03:07,440 Ensimmäinen on tiedoston nimi mukaan lukien tiedostotunniste tarvittaessa. 58 00:03:07,440 --> 00:03:10,980 Muistuttaa, että tiedostopääte ei vaikuta tiedostoa alimmillaan. 59 00:03:10,980 --> 00:03:14,640 Olemme aina tekemisissä pitkä sarja nollia ja ykkösiä. 60 00:03:14,640 --> 00:03:19,630 Mutta se vaikuttaa siihen, miten tiedostoja tulkitaan ja mitä sovelluksia käytetään avata niitä. 61 00:03:19,630 --> 00:03:22,290 Toinen argumentti fopen on yhden kirjaimen 62 00:03:22,290 --> 00:03:25,300 että tarkoittaa mitä aiomme tehdä, kun avaamme tiedoston. 63 00:03:25,300 --> 00:03:30,630 On kolme vaihtoehtoa tämän väitteen - W, R, ja A. 64 00:03:30,630 --> 00:03:34,900 Olemme valinneet w tässä tapauksessa, koska haluamme kirjoittaa tiedostoon. 65 00:03:34,900 --> 00:03:38,820 R, kuten arvata saattaa, on lukea tiedostoon. 66 00:03:38,820 --> 00:03:41,760 Ja on liittämässä tiedoston. 67 00:03:41,760 --> 00:03:44,960 Vaikka sekä w ja voidaan käyttää kirjallisesti tiedostoja, 68 00:03:44,960 --> 00:03:47,460 w alkaa kirjallisesti tiedoston alusta 69 00:03:47,460 --> 00:03:50,810 ja mahdollisesti korvaavat kaikki tiedot, jotka on aiemmin tallennettu. 70 00:03:50,810 --> 00:03:54,070 Oletuksena tiedosto avaamme, jos se ei vielä ole, 71 00:03:54,070 --> 00:03:57,180 luodaan nykyistä työhakemistossa. 72 00:03:57,180 --> 00:04:00,540 Kuitenkin, jos haluamme käyttää tai luoda tiedoston eri sijaintiin, 73 00:04:00,540 --> 00:04:02,650 on ensimmäinen perustelu fopen, 74 00:04:02,650 --> 00:04:05,840 voimme määrittää tiedoston polku lisäksi tiedoston nimen. 75 00:04:05,840 --> 00:04:09,490 Kun taas ensimmäinen osa tässä prosessissa on vain yksi rivi koodia pitkä, 76 00:04:09,490 --> 00:04:12,350 se on aina hyvä sisällyttää toinen joukko viivoja 77 00:04:12,350 --> 00:04:15,930 että tarkista että tiedosto on onnistuneesti avattu tai luotu. 78 00:04:15,930 --> 00:04:20,300 Jos fopen palauttaa null, emme halua edetä meidän ohjelmaan, 79 00:04:20,300 --> 00:04:23,270 ja tämä voi tapahtua, jos käyttöjärjestelmä on loppunut muisti 80 00:04:23,270 --> 00:04:27,940 tai jos yritämme avata tiedoston hakemistoon josta meillä ei ole oikeuksia. 81 00:04:27,940 --> 00:04:31,780 >> Osa kaksi prosessia tapahtuu kirjoituskoneella n kun silmukka. 82 00:04:31,780 --> 00:04:35,000 Käytämme CS50 kirjaston funktion saada panos käyttäjän 83 00:04:35,000 --> 00:04:37,190 ja olettaen, että ne eivät halua lopettaa ohjelman 84 00:04:37,190 --> 00:04:41,940 käytämme toimintoa fputs ottaa merkkijonon ja kirjoittaa se tiedostoon. 85 00:04:41,940 --> 00:04:46,700 fputs on vain yksi monista toiminnoista voisimme käyttää kirjoittaa tiedostoon. 86 00:04:46,700 --> 00:04:51,920 Toiset ovat fwrite, fputc, ja jopa fprintf. 87 00:04:51,920 --> 00:04:54,840 Riippumatta siitä nimenomaisesta funktion päädymme käyttäen, vaikka, 88 00:04:54,840 --> 00:04:57,480 ne kaikki täytyy tietää, kautta heidän perustelunsa, 89 00:04:57,480 --> 00:04:59,670 ainakin kaksi asiaa - 90 00:04:59,670 --> 00:05:03,140 mitä on kirjoitettu ja missä se on kirjoitettu. 91 00:05:03,140 --> 00:05:07,240 Tässä tapauksessa, tulo on merkkijono, joka on kirjoitettu 92 00:05:07,240 --> 00:05:11,290 ja FP on osoitin, joka ohjaa meitä, jos olemme kirjallisesti. 93 00:05:11,290 --> 00:05:15,330 Tässä ohjelmassa toinen osa prosessia on melko suoraviivainen. 94 00:05:15,330 --> 00:05:17,360 Olemme yksinkertaisesti ottaa merkkijonon käyttäjä 95 00:05:17,360 --> 00:05:22,120 ja lisäämällä se suoraan meidän tiedoston pikku-to-no input validointi tai turvatarkastuksia. 96 00:05:22,120 --> 00:05:26,160 Usein kuitenkin toinen osa vie pääosan koodisi. 97 00:05:26,160 --> 00:05:30,580 Kolmannessa osassa on linjalla 58, jossa suljemme tiedoston. 98 00:05:30,580 --> 00:05:34,860 Täällä me kutsumme FSulje ja siirtää se meidän alkuperäisen tiedoston osoitin. 99 00:05:34,860 --> 00:05:39,500 Myöhemmässä linjaa, palaamme nolla, signalointi loppuun ohjelmamme. 100 00:05:39,500 --> 00:05:42,630 Ja kyllä, osa kolme on niin yksinkertaista. 101 00:05:42,630 --> 00:05:45,260 >> Siirrytään lukemista tiedostoista. 102 00:05:45,260 --> 00:05:48,220 Takaisin meidän hakemistoon meillä tiedosto nimeltä printer.c. 103 00:05:48,220 --> 00:05:50,910 Katsotaanpa ajaa sen tiedoston me juuri luotu - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Tämä ohjelma, kuten nimestä voi päätellä, yksinkertaisesti tulostaa tiedoston sisältö siirretään sille. 106 00:05:58,150 --> 00:06:00,230 Ja meillä on. 107 00:06:00,230 --> 00:06:03,780 Koodiriviä olimme kirjoitit aiemmin ja tallennettu doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hei. Nimeni on Jason. 109 00:06:06,980 --> 00:06:09,120 Jos me sukeltaa printer.c, 110 00:06:09,120 --> 00:06:13,570 näemme, että monet koodi näyttää samanlaiselta kuin mitä vain käveli läpi typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Itse linja 22, jossa avasimme tiedosto, 112 00:06:16,720 --> 00:06:19,220 ja linja 39, jossa suljetaan tiedosto, 113 00:06:19,220 --> 00:06:23,890 ovat lähes identtiset typewriter.c, paitsi fopen toinen argumentti. 114 00:06:23,890 --> 00:06:26,510 Tällä kertaa olemme lukee tiedostosta, 115 00:06:26,510 --> 00:06:29,040 joten olemme valinneet r sijaan w. 116 00:06:29,040 --> 00:06:31,950 Näin ollen, nyt keskittyä toinen osa prosessia. 117 00:06:31,950 --> 00:06:36,060 Linjassa 35, koska toinen ehto meidän 4 silmukan, 118 00:06:36,060 --> 00:06:38,590 me soittaa fgets, 119 00:06:38,590 --> 00:06:42,190 seuralainen toiminto fputs alkaen ennen. 120 00:06:42,190 --> 00:06:44,660 Tällä kertaa meillä on kolme argumenttia. 121 00:06:44,660 --> 00:06:48,810 Ensimmäinen on osoitin joukko merkkejä, jos merkkijono tallennetaan. 122 00:06:48,810 --> 00:06:52,670 Toinen on merkkien maksimimäärä voidaan lukea. 123 00:06:52,670 --> 00:06:56,010 Ja kolmas on osoitin tiedoston jonka pyrimme. 124 00:06:56,010 --> 00:07:00,780 Huomaat, että for-silmukka päättyy fgets palauttaa null. 125 00:07:00,780 --> 00:07:02,940 On kaksi syytä, että tämä on tapahtunut. 126 00:07:02,940 --> 00:07:05,380 Ensinnäkin, virhe on voinut tapahtua. 127 00:07:05,380 --> 00:07:10,740 Toiseksi, ja todennäköisesti, tiedoston loppuun päästiin, ja enää merkkejä luettiin. 128 00:07:10,740 --> 00:07:14,040 Vuonna Jos mietit, kaksi toimintoa ei ole, että voimme nyt kertoa 129 00:07:14,040 --> 00:07:17,160 minkä vuoksi on syynä tähän nimenomaiseen nollaosoittimen. 130 00:07:17,160 --> 00:07:21,090 Ja ei ole yllättävää, koska ne täytyy tehdä työtä tiedostoja, 131 00:07:21,090 --> 00:07:26,940 Sekä fError toiminto ja feof toiminta alkavat kirjaimella f. 132 00:07:26,940 --> 00:07:32,130 >> Lopuksi, ennen kuin päätellä, yksi nopea huomautus tiedoston loppuun toiminto, 133 00:07:32,130 --> 00:07:36,690 joka, kuten juuri mainitsin, on kirjoitettu feof. 134 00:07:36,690 --> 00:07:41,550 Usein löydät itsesi käyttäen aikaa ja silmukoita asteittain lukea läpi tiedostoja. 135 00:07:41,550 --> 00:07:45,790 Näin sinun tapa lopettaa nämä silmukat kun päähän näistä tiedostoista. 136 00:07:45,790 --> 00:07:50,510 Soittaminen feof teidän tiedoston osoitin ja tarkistaa, onko se totta 137 00:07:50,510 --> 00:07:52,310 tekisi juuri niin. 138 00:07:52,310 --> 00:07:59,820 Siten, kun silmukka on kunnossa (! Feof (fp)) saattaa tuntua täysin sopiva ratkaisu. 139 00:07:59,820 --> 00:08:03,770 Kuitenkin sanoa meillä on yksi rivi jää meidän tekstitiedosto. 140 00:08:03,770 --> 00:08:07,130 Me anna meidän taas silmukka ja kaikki toimii suunnitellusti. 141 00:08:07,130 --> 00:08:12,750 Seuraavalla kierroksella kautta, meidän ohjelma tarkistaa, onko feof FP on totta, 142 00:08:12,750 --> 00:08:15,430 mutta - ja tämä on ratkaisevaa ymmärtää täällä - 143 00:08:15,430 --> 00:08:17,770 se ei ole totta ihan vielä. 144 00:08:17,770 --> 00:08:21,110 Tämä johtuu tarkoituksena feof ei tarkistaa 145 00:08:21,110 --> 00:08:24,400 jos seuraava puhelu lukea toiminto osuu tiedoston loppuun, 146 00:08:24,400 --> 00:08:28,190 vaan tarkistaa, onko vai ei tiedoston loppuun on jo saavutettu. 147 00:08:28,190 --> 00:08:30,140 Tapauksessa tässä esimerkissä, 148 00:08:30,140 --> 00:08:32,780 lukemista viimeisellä rivillä meidän tiedosto menee täydellisesti sujuvasti, 149 00:08:32,780 --> 00:08:36,210 mutta ohjelma ei vielä tiedä, että olemme osuma loppuun meidän tiedoston. 150 00:08:36,210 --> 00:08:40,549 Se vasta se yksi ylimääräinen lukenut, että se laskurit tiedoston loppuun. 151 00:08:40,549 --> 00:08:43,210 Siten oikea ehto olisi seuraava: 152 00:08:43,210 --> 00:08:49,330 fgets ja sen kolme argumenttia - ulostulo, koko tuotannon, ja FP - 153 00:08:49,330 --> 00:08:52,570 ja kaikki, jotka eivät vastaa null. 154 00:08:52,570 --> 00:08:55,260 Tämä on lähestymistapa teimme printer.c, 155 00:08:55,260 --> 00:08:57,890 ja tässä tapauksessa, kun silmukka poistuu, 156 00:08:57,890 --> 00:09:04,290 voit soittaa feof tai fError ilmoittaa käyttäjälle erityiseen perusteluja poistutaan tämän silmukan. 157 00:09:04,290 --> 00:09:08,100 >> Kirjoittaminen ja lukeminen tiedostosta on, sen alkeellisinta, 158 00:09:08,100 --> 00:09:10,150 yksinkertainen 3-osa prosessia. 159 00:09:10,150 --> 00:09:12,530 Ensin avaamme tiedoston. 160 00:09:12,530 --> 00:09:16,740 Toiseksi, me laittaa asiat osaksi tiedoston tai viedä joitakin asioita pois. 161 00:09:16,740 --> 00:09:19,200 Kolmanneksi, suljemme tiedoston. 162 00:09:19,200 --> 00:09:21,170 Ensimmäinen ja viimeinen osa on helppoa. 163 00:09:21,170 --> 00:09:23,920 Keskiosa on silloin hankalaa kamaa piilee. 164 00:09:23,920 --> 00:09:27,760 Ja vaikka alla huppu olemme aina tekemisissä pitkä sarja nollia ja ykkösiä, 165 00:09:27,760 --> 00:09:30,710 se auttaa kun koodaus lisätä kerros abstraktio 166 00:09:30,710 --> 00:09:35,350 joka muuttaa sekvenssin jotain muistuttaa enemmän mitä olemme tottuneet näkemään. 167 00:09:35,350 --> 00:09:39,570 Esimerkiksi, jos olemme kanssa 24-bittinen bittikartta, 168 00:09:39,570 --> 00:09:43,290 me todennäköisesti tai lukee kolme tavua kerrallaan. 169 00:09:43,290 --> 00:09:46,450 Jolloin se olisi järkevää määritellä ja asianmukaisesti nimeä 170 00:09:46,450 --> 00:09:48,980 struct, joka on 3 tavua suuri. 171 00:09:48,980 --> 00:09:51,410 >> Vaikka työskentely tiedostoja voi tuntua monimutkaiselta, 172 00:09:51,410 --> 00:09:54,530 niitä hyödyntävät antaa meille mahdollisuuden tehdä jotain todella merkittävää. 173 00:09:54,530 --> 00:09:58,880 Voimme muuttaa maailman tilasta ulkopuolella ohjelman 174 00:09:58,880 --> 00:10:01,730 Voimme luoda jotain, joka elää yli elämää ohjelman 175 00:10:01,730 --> 00:10:07,190 tai voimme jopa vaihtaa jotain, joka luotiin ennen meidän käynnistyi käynnissä. 176 00:10:07,190 --> 00:10:11,210 Vuorovaikutus tiedostoja on todella voimakas osa ohjelmointia C 177 00:10:11,210 --> 00:10:15,300 ja olen innoissani, mitä aiot luoda sen kanssa koodin tulemaan. 178 00:10:15,300 --> 00:10:19,770 Nimeni on Jason Hirschhorn. Tämä on CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Naurua] 181 00:10:25,940 --> 00:10:29,330 Okei. Yksi kestää. Täällä mennään. 182 00:10:49,000 --> 00:10:52,140 Kun ajattelemme tiedoston - >> Ai, odota. Anteeksi. 183 00:10:52,140 --> 00:10:56,800 [Naurua] Okei. 184 00:11:06,620 --> 00:11:09,970 Hei siellä. 185 00:11:13,670 --> 00:11:16,310 Kun ajattelemme tiedosto - 186 00:11:17,610 --> 00:11:20,710 Kun ajattelet tiedosto - Okei. Kerro minulle, kun olet valmis. 187 00:11:20,710 --> 00:11:22,520 Hienoa. 188 00:11:22,520 --> 00:11:26,180 Vaikka lukeminen teleprompter voi tuntua - no. My bad.