1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> SPEAKER: Tot nu toe, is het waarschijnlijk dat de meeste van uw programma's 3 00:00:07,870 --> 00:00:10,170 hebben een beetje vluchtig geweest. 4 00:00:10,170 --> 00:00:13,310 U voert een programma als Mario of Greedy. 5 00:00:13,310 --> 00:00:17,350 Het doet iets, het misschien gevraagd de gebruiker voor wat informatie, 6 00:00:17,350 --> 00:00:20,400 afdrukken enkele output naar het scherm, maar dan als je programma is voorbij, 7 00:00:20,400 --> 00:00:23,252 er is echt geen bewijs is er Het werd steeds uitgevoerd in de eerste plaats. 8 00:00:23,252 --> 00:00:25,960 Ik bedoel, zeker, je zou hebben verlaten het te openen in het terminal-venster, 9 00:00:25,960 --> 00:00:29,770 maar als u uw scherm te wissen, is er echt geen bewijs dat het bestond. 10 00:00:29,770 --> 00:00:33,720 We hebben niet een middel van het opslaan van hebben persistent, informatie 11 00:00:33,720 --> 00:00:36,890 dat bestaat na onze programma is gestopt, 12 00:00:36,890 --> 00:00:39,241 of moeten we niet tot op dit punt. 13 00:00:39,241 --> 00:00:41,490 Gelukkig maar, c doet geven ons de mogelijkheid 14 00:00:41,490 --> 00:00:44,220 om dit te doen door de uitvoering iets genaamd 15 00:00:44,220 --> 00:00:48,330 een bestand, een structuur die in wezen vertegenwoordigt een bestand dat u zou verdubbelen 16 00:00:48,330 --> 00:00:53,826 Klik op uw computer, als je gebruikt om een ​​grafische gebruikersomgeving. 17 00:00:53,826 --> 00:00:55,700 Over het algemeen bij het werken met c, we zijn eigenlijk 18 00:00:55,700 --> 00:00:59,965 gaat werken met pointers bestand files-- stars-- 19 00:00:59,965 --> 00:01:02,090 behalve voor een beetje als we praten over een paar 20 00:01:02,090 --> 00:01:04,560 van de functies die werken met file pointers. 21 00:01:04,560 --> 00:01:08,990 U hoeft niet echt te hebben gegraven te diep in kennis pointers 22 00:01:08,990 --> 00:01:09,730 zelf. 23 00:01:09,730 --> 00:01:12,870 Er is een klein piepklein beetje waar we zullen praten over hen, 24 00:01:12,870 --> 00:01:18,090 maar over het algemeen bestand pointers en pointers, terwijl met elkaar verbonden, 25 00:01:18,090 --> 00:01:20,290 zijn niet precies hetzelfde. 26 00:01:20,290 --> 00:01:22,440 >> Nu, wat ik bedoel als Ik zeg persistente data? 27 00:01:22,440 --> 00:01:23,650 Wat is persistente data? 28 00:01:23,650 --> 00:01:25,232 Waarom hebben we de zorg over het? 29 00:01:25,232 --> 00:01:27,190 Zeg, bijvoorbeeld, dat je draait een programma 30 00:01:27,190 --> 00:01:29,850 of je hebt een herschreven programma dat is een spel, 31 00:01:29,850 --> 00:01:32,960 en u wilt bijhouden van alle bewegingen van de gebruiker 32 00:01:32,960 --> 00:01:36,620 dus dat misschien als er iets misgaat, kunt u het bestand na de wedstrijd te bekijken. 33 00:01:36,620 --> 00:01:39,970 Dat is wat we bedoelen als we praten over persistente data. 34 00:01:39,970 --> 00:01:43,930 >> In de loop van het runnen van uw programma, wordt een bestand gemaakt. 35 00:01:43,930 --> 00:01:45,680 En wanneer je programma heeft gestopt, 36 00:01:45,680 --> 00:01:48,689 dat bestand bestaat nog steeds op uw systeem. 37 00:01:48,689 --> 00:01:50,230 En we kunnen kijken en onderzoeken. 38 00:01:50,230 --> 00:01:53,670 En dat programma worden ingesteld hebben een aantal hardnekkige data gecreëerd, 39 00:01:53,670 --> 00:01:57,390 gegevens bestaan ​​nadat het programma is voltooid loopt. 40 00:01:57,390 --> 00:02:02,320 >> Nu al deze functies werken met het maken van bestanden en manipuleren 41 00:02:02,320 --> 00:02:04,940 ze op verschillende manieren wonen in standaard io.h, 42 00:02:04,940 --> 00:02:08,210 dat is een header bestand dat u waarschijnlijk geweest pond 43 00:02:08,210 --> 00:02:10,910 waaronder bovenaan mooie veel van al uw programma's 44 00:02:10,910 --> 00:02:14,130 omdat het een van de bevat meest nuttige functies voor ons, 45 00:02:14,130 --> 00:02:16,130 printf, die ook laat woont in standaard io.h. 46 00:02:16,130 --> 00:02:20,400 Dus je hoeft niet te pond omvatten extra bestanden waarschijnlijk 47 00:02:20,400 --> 00:02:23,540 om te werken met file pointers. 48 00:02:23,540 --> 00:02:29,980 >> Nu elk bestand pointer functie, of elk bestand I / O, input output 49 00:02:29,980 --> 00:02:33,310 functie accepteert als een van de parameters of inputs 50 00:02:33,310 --> 00:02:35,822 een bestand pointer-- behalve één, fopen die 51 00:02:35,822 --> 00:02:38,280 is wat u gebruikt om het bestand te krijgen aanwijzer in de eerste plaats. 52 00:02:38,280 --> 00:02:41,010 Maar nadat je hebt opende de bestand en je krijgt file pointers, 53 00:02:41,010 --> 00:02:43,510 je kunt ze vervolgens doorgeven als argumenten om de verschillende functies 54 00:02:43,510 --> 00:02:46,720 We gaan om te praten over Vandaag, evenals vele anderen 55 00:02:46,720 --> 00:02:48,520 zodat u kunt werken met bestanden. 56 00:02:48,520 --> 00:02:50,980 >> Zo zijn er zes vrij gemeenschappelijke basismaatregelen 57 00:02:50,980 --> 00:02:52,870 dat we gaan om te praten over vandaag. 58 00:02:52,870 --> 00:02:57,160 fopen en zijn metgezel functie fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 en zijn metgezel functie fputc, en fread en zijn metgezel functie, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Dus laten we recht in het. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- wat doet het? 63 00:03:07,050 --> 00:03:10,050 Nou, het opent een bestand en het geeft u een bestand pointer naar het, 64 00:03:10,050 --> 00:03:14,000 zodat u vervolgens kunt gebruiken file pointer als argument 65 00:03:14,000 --> 00:03:16,730 voor één van de andere file I / O-functies. 66 00:03:16,730 --> 00:03:19,100 Het allerbelangrijkste om te onthouden met fopen 67 00:03:19,100 --> 00:03:24,222 is dat nadat je hebt opende de bestand of een oproep zoals hier, 68 00:03:24,222 --> 00:03:26,930 je nodig hebt om te controleren om ervoor te zorgen dat de pointer die je terug kreeg 69 00:03:26,930 --> 00:03:28,320 niet gelijk is aan nul. 70 00:03:28,320 --> 00:03:31,320 Als je de video op niet hebben bekeken pointers, dit misschien niet zinvol. 71 00:03:31,320 --> 00:03:35,639 Maar als je probeert en dereferentie een null pointer recall, 72 00:03:35,639 --> 00:03:38,180 Uw programma zal waarschijnlijk lijden een segmentering [onverstaanbaar]. 73 00:03:38,180 --> 00:03:40,540 Wij willen ervoor zorgen dat we kreeg een legitieme pointer terug. 74 00:03:40,540 --> 00:03:43,665 De overgrote meerderheid van de tijd zullen we hebben een legitieme pointer terug gekregen 75 00:03:43,665 --> 00:03:45,280 en het zal geen probleem zijn. 76 00:03:45,280 --> 00:03:46,760 >> Dus hoe maken we een oproep om fopen? 77 00:03:46,760 --> 00:03:48,051 Het ziet er vrij veel als dit. 78 00:03:48,051 --> 00:03:52,690 File ster ptr-- ptr als een generieke naam voor file pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 en passeren we in twee dingen, een bestandsnaam en een operatie willen we ondernemen. 80 00:03:57,300 --> 00:04:01,690 Zo kunnen we een telefoontje dat eruit ziet bestand ster ptr dit-- 1 gelijk fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 En de operatie ik heb gekozen is r. 83 00:04:07,020 --> 00:04:08,639 >> Dus wat denk je r is hier? 84 00:04:08,639 --> 00:04:11,180 Wat zijn de dingen die we zou kunnen doen om bestanden? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Dus r de operatie die we kiezen wanneer we willen een bestand te lezen. 87 00:04:17,500 --> 00:04:20,260 Dus we zouden eigenlijk bij maken we een oproep als deze 88 00:04:20,260 --> 00:04:25,440 krijgen ons een bestands pointer zodanig dat we dan konden lezen informatie 89 00:04:25,440 --> 00:04:27,770 van file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> Ook konden we bestand 2.txt openen voor het schrijven en dus kunnen we passeren ptr2, 91 00:04:34,190 --> 00:04:38,210 de file pointer die ik heb hier gemaakt, als argument voor een functie die 92 00:04:38,210 --> 00:04:40,080 schrijft informatie naar een bestand. 93 00:04:40,080 --> 00:04:43,767 En vergelijkbaar met het schrijven, is er ook de optie om te voegen, een. 94 00:04:43,767 --> 00:04:45,600 Het verschil tussen schrijven en voegen 95 00:04:45,600 --> 00:04:50,920 is dat als je schrijft naar een bestand, als u een oproep om fopen voor het schrijven te maken 96 00:04:50,920 --> 00:04:54,761 en dat het bestand al bestaat, het is gaat om het hele bestand te overschrijven. 97 00:04:54,761 --> 00:04:56,510 Het gaat om te beginnen aan het begin, 98 00:04:56,510 --> 00:04:58,820 alle gegevens wissen dat er al is. 99 00:04:58,820 --> 00:05:02,210 >> Terwijl als je het voor het toevoegen te openen, zal naar het einde van het bestand 100 00:05:02,210 --> 00:05:04,340 Als er al tekst in het of gegevens in, 101 00:05:04,340 --> 00:05:06,040 en het zal dan beginnen het schrijven van daar. 102 00:05:06,040 --> 00:05:08,570 Dus zal je niet een van de verliezen informatie die je eerder hebt gedaan. 103 00:05:08,570 --> 00:05:12,110 Of u nu wilt schrijven of toevoegen soort afhankelijk van de situatie. 104 00:05:12,110 --> 00:05:16,840 Maar u zult waarschijnlijk weten wat de juiste werking is wanneer de tijd komt. 105 00:05:16,840 --> 00:05:18,020 Dus dat is fopen. 106 00:05:18,020 --> 00:05:18,930 >> Hoe zit het met fclose? 107 00:05:18,930 --> 00:05:21,600 Nou, vrij eenvoudig, fclose gewoon aanvaardt de file pointer. 108 00:05:21,600 --> 00:05:24,000 En zoals je zou verwachten, sluit dat bestand. 109 00:05:24,000 --> 00:05:29,270 En als we eenmaal een bestand hebt gesloten, kunnen we niet voeren meer file I / O-functies, 110 00:05:29,270 --> 00:05:31,420 lezen of schrijven, op dat bestand. 111 00:05:31,420 --> 00:05:36,444 We moeten opnieuw openen bestand een andere tijd in orde 112 00:05:36,444 --> 00:05:38,610 om te blijven werken met met behulp van de I / O-functies. 113 00:05:38,610 --> 00:05:41,520 Dus fclose middelen we klaar het werken met dit bestand. 114 00:05:41,520 --> 00:05:44,690 En alles wat we nodig hebben om in voorbij is de naam van een bestand pointer. 115 00:05:44,690 --> 00:05:50,010 Dus over een paar slides geleden, we fopened bestand 1 dot tekst voor te lezen 116 00:05:50,010 --> 00:05:52,854 en wij toegewezen file pointer naar ptr1. 117 00:05:52,854 --> 00:05:55,020 Nu hebben we besloten dat we gedaan lezen van dat bestand. 118 00:05:55,020 --> 00:05:56,561 We hoeven niet meer doen. 119 00:05:56,561 --> 00:05:58,890 We kunnen gewoon fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 En evenzo, kunnen we FSluit de andere. 121 00:06:01,950 --> 00:06:02,450 Prima. 122 00:06:02,450 --> 00:06:03,700 Dus dat is het openen en sluiten. 123 00:06:03,700 --> 00:06:05,780 Dit zijn de twee fundamentele beginnen operaties. 124 00:06:05,780 --> 00:06:08,050 >> Nu willen we eigenlijk doe wat interessante dingen, 125 00:06:08,050 --> 00:06:11,940 en de eerste functie die we zullen dat zal doen, dat is fgetc-- 126 00:06:11,940 --> 00:06:14,110 bestand krijgen een personage. 127 00:06:14,110 --> 00:06:17,350 Dat is wat fgetc algemeen zou vertalen naar. 128 00:06:17,350 --> 00:06:20,190 Het doel in het leven is het volgende teken te lezen, 129 00:06:20,190 --> 00:06:22,079 of als dit je zeer eerste oproep om fgetc 130 00:06:22,079 --> 00:06:23,870 voor een bepaald bestand, het eerste teken. 131 00:06:23,870 --> 00:06:26,210 Maar dan na dat, u het volgende te krijgen, 132 00:06:26,210 --> 00:06:31,500 de volgende karakter van dat bestand, en opgeslagen in een variabele aard. 133 00:06:31,500 --> 00:06:34,490 Zoals we hier hebben gedaan, char ch gelijk fgetc, 134 00:06:34,490 --> 00:06:36,389 pas in de naam van een bestand pointer. 135 00:06:36,389 --> 00:06:38,180 Nogmaals, het is heel hier belangrijk om te onthouden 136 00:06:38,180 --> 00:06:41,430 dat om zijn deze operatie slaagt, 137 00:06:41,430 --> 00:06:45,690 het bestand pointer zelf moest hebben geopend voor lezen. 138 00:06:45,690 --> 00:06:50,589 We kunnen een personage niet lezen uit een bestand pointer die wij voor schrijven geopend. 139 00:06:50,589 --> 00:06:52,630 Dus dat is een van de beperkingen van fopen, toch? 140 00:06:52,630 --> 00:06:55,470 We moeten beperken onszelf alleen uitvoeren 141 00:06:55,470 --> 00:06:57,710 een bedrijf met een bestand pointer. 142 00:06:57,710 --> 00:07:00,220 Als we wilden te lezen en schrijven vanuit hetzelfde bestand, 143 00:07:00,220 --> 00:07:03,840 we zouden openen twee afzonderlijke hebben bestand verwijzingen naar dezelfde file-- 144 00:07:03,840 --> 00:07:05,670 één voor het lezen, voor schrijven. 145 00:07:05,670 --> 00:07:08,400 >> Dus nogmaals, de enige reden Ik breng dat tot nu 146 00:07:08,400 --> 00:07:11,920 want als we gaan om te bellen om fgetc, dat bestand pointer was vast 147 00:07:11,920 --> 00:07:14,172 geopend voor lezen. 148 00:07:14,172 --> 00:07:15,880 En dan vrij eenvoudig, alles wat we moeten doen 149 00:07:15,880 --> 00:07:17,546 is pas in de naam van het bestand pointer. 150 00:07:17,546 --> 00:07:21,060 Dus char ch gelijk fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> Dat gaat ons de volgende character-- 152 00:07:23,200 --> 00:07:25,575 of ook, indien dit de eerste keer dat we deze oproep, 153 00:07:25,575 --> 00:07:29,750 de eerste character-- ongeacht bestand wordt gewezen door ptr1. 154 00:07:29,750 --> 00:07:32,210 Bedenk dat dat was bestand 1 dot tekst. 155 00:07:32,210 --> 00:07:36,490 Het zal het eerste teken van die krijgen en we zullen het op te slaan in de variabele l. 156 00:07:36,490 --> 00:07:37,941 Vrij eenvoudig. 157 00:07:37,941 --> 00:07:40,190 Dus we hebben alleen gekeken naar drie functies en al we 158 00:07:40,190 --> 00:07:43,070 kan iets behoorlijk netjes te doen. 159 00:07:43,070 --> 00:07:46,320 >> Dus als we dit vermogen het krijgen van een karakter 160 00:07:46,320 --> 00:07:48,943 en we lus het-- dus we blijven personages 161 00:07:48,943 --> 00:07:51,390 uit een bestand over en nu voorbij en we over-- 162 00:07:51,390 --> 00:07:54,500 kan lezen elke karakter van een bestand. 163 00:07:54,500 --> 00:07:58,670 En als we elk karakter afdrukken onmiddellijk nadat we het lezen, 164 00:07:58,670 --> 00:08:01,960 hebben we nu lezen uit een bestand en gedrukte de inhoud naar het scherm. 165 00:08:01,960 --> 00:08:05,610 We hebben effectief samengevoegd dat bestand op het scherm. 166 00:08:05,610 --> 00:08:09,670 En dat is wat de Linux commando cat doet. 167 00:08:09,670 --> 00:08:13,250 >> Als je kat typt in de bestandsnaam, maar zal de gehele inhoud uitprinten 168 00:08:13,250 --> 00:08:15,160 van het bestand in het terminal-venster. 169 00:08:15,160 --> 00:08:19,010 En dus deze kleine lus hier slechts drie regels code, 170 00:08:19,010 --> 00:08:23,270 maar het effectief dupliceert de Linux commando cat. 171 00:08:23,270 --> 00:08:25,210 Dus dit zou syntaxis ziet er een beetje raar, 172 00:08:25,210 --> 00:08:26,670 maar hier is wat er hier gebeurt. 173 00:08:26,670 --> 00:08:31,460 Terwijl ch gelijk fgetc, ptr niet gelijk aan EOF-- het is een hele mondvol, 174 00:08:31,460 --> 00:08:34,669 maar laten we breken het gewoon neer dus het is duidelijk over de syntaxis. 175 00:08:34,669 --> 00:08:37,169 Ik heb het geconsolideerd omwille van de ruimte, 176 00:08:37,169 --> 00:08:39,049 hoewel het een beetje syntactisch lastig. 177 00:08:39,049 --> 00:08:41,194 >> Dus dit deel in het groen rechts Nu, wat doet het? 178 00:08:41,194 --> 00:08:42,860 Nou, dat is gewoon onze fgetc oproep, toch? 179 00:08:42,860 --> 00:08:44,530 We hebben gezien dat vóór. 180 00:08:44,530 --> 00:08:49,500 Het verkrijgen van een personage uit het bestand. 181 00:08:49,500 --> 00:08:53,220 Vervolgens vergelijken we dat karakter tegen EOF. 182 00:08:53,220 --> 00:08:57,470 EOF is een bijzondere waarde die gedefinieerd in standaard io.h, die 183 00:08:57,470 --> 00:08:59,390 is het einde van het bestand karakter. 184 00:08:59,390 --> 00:09:03,450 Dus eigenlijk wat er gaat gebeuren wordt deze lus zal een teken te lezen, 185 00:09:03,450 --> 00:09:07,445 vergelijk het met EOF, de einde van het bestand karakter. 186 00:09:07,445 --> 00:09:10,070 Als ze niet overeenkomen, dus we hebben niet aan het einde van het bestand 187 00:09:10,070 --> 00:09:11,490 zullen we dat karakter uit te printen. 188 00:09:11,490 --> 00:09:13,740 Dan zullen we terug naar de begin van de lus weer. 189 00:09:13,740 --> 00:09:18,310 We zullen een karakter te krijgen, check tegen EOF, print het uit, en ga zo maar door 190 00:09:18,310 --> 00:09:21,094 enzovoort, enzovoort, doorlussen op die manier 191 00:09:21,094 --> 00:09:22,760 we tot het einde van het bestand heeft bereikt. 192 00:09:22,760 --> 00:09:24,593 En dan door dat punt, we zullen hebben gedrukt 193 00:09:24,593 --> 00:09:26,210 de volledige inhoud van het bestand. 194 00:09:26,210 --> 00:09:29,450 Dus nogmaals, we hebben alleen gezien fopen, fclose en fgetc 195 00:09:29,450 --> 00:09:34,950 en nu al kunnen we dupliceren een Linux terminal commando. 196 00:09:34,950 --> 00:09:38,850 >> Zoals ik al zei aan het begin, we hadden fgetc en fputc, 197 00:09:38,850 --> 00:09:41,860 en fputc was de metgezel functie van fgetc. 198 00:09:41,860 --> 00:09:44,880 En dus, als je zou denken, is het schrijven equivalent. 199 00:09:44,880 --> 00:09:49,440 Het stelt ons in staat om te schrijven enkel teken naar een bestand. 200 00:09:49,440 --> 00:09:53,290 >> Nogmaals, het voorbehoud dat, net zoals het was met fgetc, het bestand 201 00:09:53,290 --> 00:09:56,660 dat we schrijven naar moet heb geopend voor het schrijven of het toevoegen. 202 00:09:56,660 --> 00:10:00,820 Als we proberen en gebruik fputc op een bestand dat we voor het lezen hebt geopend, 203 00:10:00,820 --> 00:10:02,760 we gaan lijden een beetje een vergissing. 204 00:10:02,760 --> 00:10:04,440 Maar het nummer is vrij eenvoudig. 205 00:10:04,440 --> 00:10:08,000 fputc hoofdletter A ptr2, alle dat gaat doen, is het 206 00:10:08,000 --> 00:10:12,040 naar de brief te schrijven in A in bestand 2 dot 207 00:10:12,040 --> 00:10:14,760 tekst, die de naam van de was bestand dat we geopend en toegewezen 208 00:10:14,760 --> 00:10:17,280 de aanwijzer naar ptr2. 209 00:10:17,280 --> 00:10:20,430 Dus we gaan naar een schrijven hoofdletter A tot en met 2 dot tekstbestand. 210 00:10:20,430 --> 00:10:24,592 En we zullen een uitroepteken schrijven wijzen op 3 dot bestand 211 00:10:24,592 --> 00:10:27,330 tekst, die werd aangewezen door ptr3. 212 00:10:27,330 --> 00:10:29,730 Dus nogmaals, hier vrij eenvoudig. 213 00:10:29,730 --> 00:10:32,727 >> Maar nu kunnen we nog iets doen. 214 00:10:32,727 --> 00:10:34,560 We hebben dit voorbeeld we waren gewoon gaan over 215 00:10:34,560 --> 00:10:38,950 over de mogelijkheid om de kat te repliceren Linux commando, degene die wordt afgedrukt 216 00:10:38,950 --> 00:10:40,500 naar het scherm. 217 00:10:40,500 --> 00:10:43,510 Nou, nu dat we de mogelijkheid hebben tekens uit bestanden gelezen 218 00:10:43,510 --> 00:10:46,590 en schrijf personages om bestanden, waarom doen we niet in de plaats alleen dat 219 00:10:46,590 --> 00:10:50,720 bellen om printf met een oproep tot fputc. 220 00:10:50,720 --> 00:10:54,090 >> En nu hebben we gedupliceerd cp, een zeer fundamentele Linux command 221 00:10:54,090 --> 00:10:59,100 dat hebben we gesproken over de lange weg geleden in de Linux-commando's video. 222 00:10:59,100 --> 00:11:01,070 We hebben effectief gedupliceerd dat hier. 223 00:11:01,070 --> 00:11:04,790 We lezen van een karakter en dan zijn we schrijft dat karakter naar een ander bestand. 224 00:11:04,790 --> 00:11:07,660 Lezen van een bestand, het schrijven een andere, telkens 225 00:11:07,660 --> 00:11:11,350 en weer totdat we raken EOF. 226 00:11:11,350 --> 00:11:14,250 We hebben tot het einde van het file we proberen te kopiëren. 227 00:11:14,250 --> 00:11:18,500 En dat we allemaal hebben geschreven van de personages die we nodig hebben om het bestand 228 00:11:18,500 --> 00:11:19,500 dat we schrijven naar. 229 00:11:19,500 --> 00:11:24,270 Dus dit is cp, de Linux kopie commando. 230 00:11:24,270 --> 00:11:26,550 >> Aan het begin van Deze video, had ik de waarschuwing 231 00:11:26,550 --> 00:11:29,840 dat we zouden praten beetje over pointers. 232 00:11:29,840 --> 00:11:32,480 Hier is met name waar we zijn gaan praten over pointers 233 00:11:32,480 --> 00:11:34,800 Naast bestand pointers. 234 00:11:34,800 --> 00:11:37,870 Dus deze functie ziet er een beetje eng. 235 00:11:37,870 --> 00:11:39,120 Het heeft een aantal parameters. 236 00:11:39,120 --> 00:11:40,430 Er is veel aan de hand. 237 00:11:40,430 --> 00:11:42,760 Er is een heleboel verschillende kleuren en teksten. 238 00:11:42,760 --> 00:11:47,100 Maar echt, het is gewoon de generieke versie van fgetc 239 00:11:47,100 --> 00:11:50,110 dat ons toelaat om elke krijgen hoeveelheid informatie. 240 00:11:50,110 --> 00:11:53,560 Het kan een beetje inefficiënt als we krijgen tekens één voor één, 241 00:11:53,560 --> 00:11:55,770 itereren door het bestand één karakter per keer. 242 00:11:55,770 --> 00:12:00,230 Zou het niet leuker om te krijgen 100 tegelijk of 500 tegelijk? 243 00:12:00,230 --> 00:12:03,250 >> Nou, fread en zijn metgezel functie fwrite, die we praten over 244 00:12:03,250 --> 00:12:05,490 in een tweede, laat ons om dat te doen. 245 00:12:05,490 --> 00:12:08,480 We kunnen een willekeurige hoeveelheid gelezen van informatie uit een bestand 246 00:12:08,480 --> 00:12:10,290 en slaan we het ergens tijdelijk. 247 00:12:10,290 --> 00:12:12,980 In plaats van te kunnen gewoon past het in een enkele variabele, 248 00:12:12,980 --> 00:12:15,790 we nodig zou kunnen hebben om het op te slaan in een array. 249 00:12:15,790 --> 00:12:19,980 En ja, we passeren in vier argumenten om een ​​pointer fread-- 250 00:12:19,980 --> 00:12:23,940 naar de locatie waar we zijn naar informatie op te slaan, 251 00:12:23,940 --> 00:12:29,180 hoe groot elke informatie-eenheid zal zijn, hoeveel eenheden van informatie 252 00:12:29,180 --> 00:12:35,192 we willen verwerven, en uit welk bestand we willen hen te krijgen. 253 00:12:35,192 --> 00:12:37,150 Waarschijnlijk best geïllustreerd een voorbeeld hiervan. 254 00:12:37,150 --> 00:12:41,640 Dus laten we zeggen dat we verklaren een array van 10 integers. 255 00:12:41,640 --> 00:12:45,080 We hebben net verklaard op de stack willekeurig int arr 10. 256 00:12:45,080 --> 00:12:46,970 Dus dat is vrij eenvoudig. 257 00:12:46,970 --> 00:12:51,970 Nu wat we wel doen is de frecall is dat we lezen grootte van int 258 00:12:51,970 --> 00:12:54,180 tijden 10 bytes van gegevens. 259 00:12:54,180 --> 00:12:59,040 Grootte van int wezen four-- dat is de grootte van een integer in c. 260 00:12:59,040 --> 00:13:02,790 >> Dus wat we doen is dat we lezen 40 bytes waarde van informatie 261 00:13:02,790 --> 00:13:05,850 uit het bestand naar wijst ptr. 262 00:13:05,850 --> 00:13:08,600 En we zijn het opslaan van die 40 bytes ergens 263 00:13:08,600 --> 00:13:12,080 waar we vernietiging 40 bytes waarde van het geheugen. 264 00:13:12,080 --> 00:13:15,970 Gelukkig hebben we al gedaan door verklaren arr, die array daar. 265 00:13:15,970 --> 00:13:19,770 Dat kan voor 10 vier-byte-eenheden. 266 00:13:19,770 --> 00:13:22,860 Dus in totaal, kan het te houden 40 bytes waarde van informatie. 267 00:13:22,860 --> 00:13:26,540 En we zijn nu leest 40 bytes van informatie uit het dossier, 268 00:13:26,540 --> 00:13:30,330 en we deze opslaan in arr. 269 00:13:30,330 --> 00:13:35,470 >> Herinneren van de video op aanwijzingen die de naam van een array, zoals arr, 270 00:13:35,470 --> 00:13:38,370 is eigenlijk gewoon een pointer zijn eerste element. 271 00:13:38,370 --> 00:13:43,680 Dus als we passeren arr daar, we in feite, passeren in een pointer. 272 00:13:43,680 --> 00:13:46,120 >> Op dezelfde manier kunnen we dit-- doen we doen niet per se 273 00:13:46,120 --> 00:13:51,200 moeten onze buffer op te slaan op de stapel. 274 00:13:51,200 --> 00:13:54,990 We konden ook dynamisch toewijzen een buffer als deze, met behulp van malloc. 275 00:13:54,990 --> 00:13:57,340 Vergeet niet, als we dynamisch geheugen toewijzen, 276 00:13:57,340 --> 00:14:00,550 we slaan op de heap, niet de stapel. 277 00:14:00,550 --> 00:14:02,110 Maar het is nog steeds een buffer. 278 00:14:02,110 --> 00:14:06,810 >> Nog steeds, in dit geval is met 640 bytes aan informatie 279 00:14:06,810 --> 00:14:09,230 omdat een dubbel neemt acht bytes. 280 00:14:09,230 --> 00:14:11,570 En we vragen voor 80 van hen. 281 00:14:11,570 --> 00:14:13,770 Wij willen ruimte 80 tweepersoonskamers houden. 282 00:14:13,770 --> 00:14:17,210 Dus 80 maal 8 is 640 bytes informatie. 283 00:14:17,210 --> 00:14:21,880 En dat de oproep tot fread is het verzamelen van 640 bytes informatie 284 00:14:21,880 --> 00:14:27,770 uit het bestand waarnaar wordt verwezen door ptr en slaan nu in arr2. 285 00:14:27,770 --> 00:14:32,770 >> Nu kunnen we ook fread behandelen net als een oproep tot fgetc. 286 00:14:32,770 --> 00:14:37,140 In dit geval zijn we gewoon proberen te krijgen een personage uit het bestand. 287 00:14:37,140 --> 00:14:40,070 En we hebben geen behoefte array om een ​​personage te houden. 288 00:14:40,070 --> 00:14:43,170 We kunnen gewoon opslaan in een teken variabele. 289 00:14:43,170 --> 00:14:46,390 >> De vangst is echter dat als we gewoon een variabele, 290 00:14:46,390 --> 00:14:50,290 moeten we pas in de adres van die variabele 291 00:14:50,290 --> 00:14:52,550 omdat herinneren dat de eerste argument om fread 292 00:14:52,550 --> 00:14:59,210 is een aanwijzer naar de locatie en het geheugen waar we willen de informatie op te slaan. 293 00:14:59,210 --> 00:15:01,550 Nogmaals, de naam van een array is een pointer. 294 00:15:01,550 --> 00:15:04,200 Dus we hoeven niet te ampersand serie te doen. 295 00:15:04,200 --> 00:15:07,270 Maar c, het karakter c Hier is geen matrix. 296 00:15:07,270 --> 00:15:08,390 Het is gewoon een variabele. 297 00:15:08,390 --> 00:15:11,840 En dus moeten we een pas c teken aangeven 298 00:15:11,840 --> 00:15:15,350 dat is het adres waar we willen dit ene byte informatie op te slaan, 299 00:15:15,350 --> 00:15:20,479 dit een teken dat we verzamelen van ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Ik zal gaan door dit een beetje meer 301 00:15:22,270 --> 00:15:25,440 quickly-- is vrijwel exacte equivalent van fread 302 00:15:25,440 --> 00:15:27,720 behalve dat het voor het schrijven in plaats van het lezen, net 303 00:15:27,720 --> 00:15:31,610 zoals de other-- we geopend hebben gehad en in de buurt, krijgen een karakter, 304 00:15:31,610 --> 00:15:32,530 brief karakter. 305 00:15:32,530 --> 00:15:35,040 Nu is het te arbitrair hoeveelheid informatie, 306 00:15:35,040 --> 00:15:37,170 recht arbitraire hoeveelheid informatie. 307 00:15:37,170 --> 00:15:39,790 Dus net als voorheen, we can een reeks van 10 getallen 308 00:15:39,790 --> 00:15:43,210 waar we al opgeslagen, misschien. 309 00:15:43,210 --> 00:15:46,580 >> Het was waarschijnlijk een aantal regels code die moet gaan tussen deze twee 310 00:15:46,580 --> 00:15:49,990 waar ik vullen arr met iets zinvols. 311 00:15:49,990 --> 00:15:51,880 Ik vul het met 10 verschillende getallen. 312 00:15:51,880 --> 00:15:54,920 En in plaats daarvan, wat ik ben doen is het schrijven van arr 313 00:15:54,920 --> 00:15:58,600 en het verzamelen van de informatie van arr. 314 00:15:58,600 --> 00:16:02,390 En ik ben het nemen van die informatie en schoot het bestand. 315 00:16:02,390 --> 00:16:05,410 >> Dus in plaats van dat het uit het bestand naar de buffer, 316 00:16:05,410 --> 00:16:08,790 we gaan nu uit de buffer naar het bestand. 317 00:16:08,790 --> 00:16:10,580 Dus het is gewoon het omgekeerde. 318 00:16:10,580 --> 00:16:16,680 Dus nogmaals, net als voorheen, we can hebben ook een hoop brok van geheugen 319 00:16:16,680 --> 00:16:19,600 dat we hebben dynamisch toegewezen en gelezen van die 320 00:16:19,600 --> 00:16:21,570 en schrijf dat voor het bestand. 321 00:16:21,570 --> 00:16:24,900 >> En we hebben ook een enkele variabele staat die één byte 322 00:16:24,900 --> 00:16:27,200 informatie, zoals een karakter. 323 00:16:27,200 --> 00:16:29,830 Maar nogmaals, we moeten in passeren het adres van die variabele 324 00:16:29,830 --> 00:16:31,840 wanneer we willen lezen van het. 325 00:16:31,840 --> 00:16:35,280 Dus we kunnen het schrijven vinden we op dat adres 326 00:16:35,280 --> 00:16:39,050 om het bestand pointer, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Er zijn tal van andere grote file I / O-functies 328 00:16:41,630 --> 00:16:44,650 dat doen verschillende dingen naast degenen die we hebben gesproken over vandaag. 329 00:16:44,650 --> 00:16:46,450 Enkele degenen u misschien nuttig vindt 330 00:16:46,450 --> 00:16:50,840 zijn fgets en fputs, die het equivalent 331 00:16:50,840 --> 00:16:56,190 van fgetc en fputc maar voor het lezen een snaar van een bestand. 332 00:16:56,190 --> 00:16:59,020 In plaats van een enkel teken, het zal een hele reeks lezen. 333 00:16:59,020 --> 00:17:02,940 fprintf, die in principe mogelijk maakt u printf gebruiken om te schrijven naar bestand. 334 00:17:02,940 --> 00:17:05,619 Dus net zoals je het kunt doen variabele substitutie met behulp 335 00:17:05,619 --> 00:17:09,900 de placeholders procent i en procent d, enzovoort, met printf 336 00:17:09,900 --> 00:17:14,690 U kunt op dezelfde manier neemt u de printf string en druk iets 337 00:17:14,690 --> 00:17:16,800 als dat een bestand. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- als u een dvd-speler is de analogie gebruik ik meestal hier-- 339 00:17:20,720 --> 00:17:23,109 is een beetje als het gebruik van uw terugspoelen en vooruitspoelen 340 00:17:23,109 --> 00:17:25,819 knoppen om te bewegen rond de film. 341 00:17:25,819 --> 00:17:28,369 Ook kunt u bewegen het bestand. 342 00:17:28,369 --> 00:17:30,250 Een van de dingen binnen dat bestandsstructuur 343 00:17:30,250 --> 00:17:34,270 dat c creëert voor u is een indicator van waar je bent in het bestand. 344 00:17:34,270 --> 00:17:36,420 Bent u aan het beginnend bij byte nul? 345 00:17:36,420 --> 00:17:39,290 Bent u op byte 100, byte 1000, enzovoorts? 346 00:17:39,290 --> 00:17:44,340 U kunt fseek gebruiken om willekeurig te bewegen dat indicator vooruit of achteruit. 347 00:17:44,340 --> 00:17:46,744 >> En ftell, opnieuw vergelijkbaar met een DVD-speler, 348 00:17:46,744 --> 00:17:49,660 is als een kleine klok die vertelt je hoeveel minuten en seconden u 349 00:17:49,660 --> 00:17:52,480 zijn in een bepaalde film. 350 00:17:52,480 --> 00:17:56,990 Ook ftell vertelt u hoe vele bytes u in het bestand. 351 00:17:56,990 --> 00:18:00,210 feof is een andere versie detecteren of je hebt 352 00:18:00,210 --> 00:18:01,700 aan het einde van het bestand. 353 00:18:01,700 --> 00:18:03,600 En ferror is een functie die u kunt gebruiken 354 00:18:03,600 --> 00:18:06,959 om te detecteren of er iets misgegaan werken met een bestand. 355 00:18:06,959 --> 00:18:08,750 Nogmaals, dit is gewoon krassen op het oppervlak. 356 00:18:08,750 --> 00:18:12,730 Er is nog veel meer file I / O functies in de standaard io.h. 357 00:18:12,730 --> 00:18:16,620 Maar dit zal u waarschijnlijk begon te werken met file pointers. 358 00:18:16,620 --> 00:18:17,640 Ik ben Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Dit is CS50. 360 00:18:19,750 --> 00:18:21,669