1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> Spreker: So ver, is dit waarskynlik dat die meeste van jou programme 3 00:00:07,870 --> 00:00:10,170 het 'n bietjie efemere nie. 4 00:00:10,170 --> 00:00:13,310 Jy hardloop 'n program soos Mario of Greedy. 5 00:00:13,310 --> 00:00:17,350 Dit doen iets, dit dalk vra die gebruiker vir 'n paar inligting, 6 00:00:17,350 --> 00:00:20,400 druk sommige uitset na die skerm, maar dan wanneer jou program verby is, 7 00:00:20,400 --> 00:00:23,252 daar is regtig geen bewyse is daar dit ooit loop in die eerste plek. 8 00:00:23,252 --> 00:00:25,960 Ek bedoel, seker, jy kan verlaat dit oop in die terminale venster, 9 00:00:25,960 --> 00:00:29,770 maar as jy jou skerm skoon te maak, is daar ' werklik geen bewyse dat dit bestaan. 10 00:00:29,770 --> 00:00:33,720 Ons het nie 'n middel van die stoor het aanhoudende inligting, inligting 11 00:00:33,720 --> 00:00:36,890 wat bestaan ​​nadat ons program het opgehou hardloop, 12 00:00:36,890 --> 00:00:39,241 of ons het nie tot op hierdie punt. 13 00:00:39,241 --> 00:00:41,490 Gelukkig maar, c doen voorsien ons met die vermoë 14 00:00:41,490 --> 00:00:44,220 om dit te doen deur die implementering van iets genoem 15 00:00:44,220 --> 00:00:48,330 'n lêer, 'n struktuur wat basies verteenwoordig 'n lêer wat jy sou verdubbel 16 00:00:48,330 --> 00:00:53,826 Klik op jou rekenaar, as jy gebruik om 'n grafiese gebruikerskoppelvlak omgewing. 17 00:00:53,826 --> 00:00:55,700 Algemeen by die werk met c, ons is eintlik 18 00:00:55,700 --> 00:00:59,965 gaan om te werk met verwysings na lêer files-- stars-- 19 00:00:59,965 --> 00:01:02,090 behalwe vir 'n bietjie wanneer ons praat oor 'n paar 20 00:01:02,090 --> 00:01:04,560 van die funksies wat werk met lêer verwysings. 21 00:01:04,560 --> 00:01:08,990 Jy hoef nie regtig gegrawe te diep in begrip pointers 22 00:01:08,990 --> 00:01:09,730 hulself. 23 00:01:09,730 --> 00:01:12,870 Daar is 'n bietjie Teeny bietjie waar ons sal praat oor hulle, 24 00:01:12,870 --> 00:01:18,090 maar oor die algemeen te dien wysers en wysers, terwyl onderling, 25 00:01:18,090 --> 00:01:20,290 is nie presies dieselfde ding. 26 00:01:20,290 --> 00:01:22,440 >> Nou wat moet ek bedoel wanneer Ek sê aanhoudende data? 27 00:01:22,440 --> 00:01:23,650 Wat is 'n aanhoudende data? 28 00:01:23,650 --> 00:01:25,232 Hoekom moet ons omgee? 29 00:01:25,232 --> 00:01:27,190 Sê, byvoorbeeld, dat jy 'n program 30 00:01:27,190 --> 00:01:29,850 of jy herskryf n program wat is 'n spel, 31 00:01:29,850 --> 00:01:32,960 en jy wil om tred te hou van alle beweeg die gebruiker se 32 00:01:32,960 --> 00:01:36,620 sodat miskien as iets verkeerd gaan, kan jy die lêer na die wedstryd te hersien. 33 00:01:36,620 --> 00:01:39,970 Dit is wat ons bedoel wanneer ons praat oor hardnekkige data. 34 00:01:39,970 --> 00:01:43,930 >> In die loop van die bestuur van jou program, is 'n lêer geskep. 35 00:01:43,930 --> 00:01:45,680 En wanneer jou program gestop hardloop, 36 00:01:45,680 --> 00:01:48,689 die lêer bestaan ​​steeds op jou stelsel. 37 00:01:48,689 --> 00:01:50,230 En ons kan kyk na dit en dit ondersoek. 38 00:01:50,230 --> 00:01:53,670 En sodat program sal ingestel word om het 'n paar hardnekkige data geskep, 39 00:01:53,670 --> 00:01:57,390 data bestaan ​​na die program klaar hardloop. 40 00:01:57,390 --> 00:02:02,320 >> Nou al hierdie funksies wat werk met die skep van lêers en manipuleer 41 00:02:02,320 --> 00:02:04,940 hulle op verskeie maniere lewe in die standaard io.h, 42 00:02:04,940 --> 00:02:08,210 wat is 'n kop-lêer wat jy waarskynlik gewees het pond 43 00:02:08,210 --> 00:02:10,910 insluitende by die top van die mooi veel van al jou programme 44 00:02:10,910 --> 00:02:14,130 omdat dit een van die bevat mees nuttige funksies vir ons, 45 00:02:14,130 --> 00:02:16,130 printf, wat ook kan woon in die standaard io.h. 46 00:02:16,130 --> 00:02:20,400 Sodat jy nie nodig het om te skut sluit enige bykomende lêers waarskynlik 47 00:02:20,400 --> 00:02:23,540 om te werk met lêer verwysings. 48 00:02:23,540 --> 00:02:29,980 >> Nou is elke enkele lêer wyser funksie, of elke enkele lêer I / O, insette uitset 49 00:02:29,980 --> 00:02:33,310 funksie, aanvaar as een van sy parameters of insette 50 00:02:33,310 --> 00:02:35,822 'n lêer pointer-- behalwe vir een, fopen, wat 51 00:02:35,822 --> 00:02:38,280 is wat jy gebruik om die lêer te kry wyser in die eerste plek. 52 00:02:38,280 --> 00:02:41,010 Maar nadat jy het die lêer en jy kry lêer verwysings, 53 00:02:41,010 --> 00:02:43,510 kan jy hulle dan slaag as argumente om die verskillende funksies 54 00:02:43,510 --> 00:02:46,720 ons gaan om te praat oor vandag, asook vele ander 55 00:02:46,720 --> 00:02:48,520 sodat jy kan werk met lêers. 56 00:02:48,520 --> 00:02:50,980 >> So is daar ses mooi algemene basiese kinders 57 00:02:50,980 --> 00:02:52,870 dat ons gaan om te praat oor vandag. 58 00:02:52,870 --> 00:02:57,160 fopen en sy metgesel funksie fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 en sy metgesel funksie fputc, en fread en sy metgesel funksie, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 So laat ons kry reg in dit. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- wat doen dit? 63 00:03:07,050 --> 00:03:10,050 Wel, dit maak 'n lêer en dit gee jou 'n lêer wyser om dit, 64 00:03:10,050 --> 00:03:14,000 sodat jy dan kan gebruik wat lêer wyser as 'n argument 65 00:03:14,000 --> 00:03:16,730 aan enige van die ander lêer I / O funksies. 66 00:03:16,730 --> 00:03:19,100 Die belangrikste ding om te onthou met fopen 67 00:03:19,100 --> 00:03:24,222 is dat nadat jy oopgemaak het die lêer of 'n oproep gemaak soos die een hier, 68 00:03:24,222 --> 00:03:26,930 wat jy nodig het om te kyk om seker te maak dat die wyser wat jou terug gekry 69 00:03:26,930 --> 00:03:28,320 is nie gelyk aan null. 70 00:03:28,320 --> 00:03:31,320 As jy die video op nie gekyk wysers, is dit dalk nie sin maak nie. 71 00:03:31,320 --> 00:03:35,639 Maar as jy probeer en dereference 'n null pointer onthou, 72 00:03:35,639 --> 00:03:38,180 Jou program sal waarskynlik ly 'n segmentering [onhoorbaar]. 73 00:03:38,180 --> 00:03:40,540 Ons wil seker maak dat ons het 'n wettige wyser terug. 74 00:03:40,540 --> 00:03:43,665 Die oorgrote meerderheid van die tyd wat ons sal het 'n wettige wyser terug gekry 75 00:03:43,665 --> 00:03:45,280 en dit sal 'n probleem te wees nie. 76 00:03:45,280 --> 00:03:46,760 >> So hoe maak ons ​​'n oproep om fopen? 77 00:03:46,760 --> 00:03:48,051 Dit lyk pretty much soos hierdie. 78 00:03:48,051 --> 00:03:52,690 Lêer star ptr-- PTR 'n generiese naam vir die lêer pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 en ons slaag in twee dinge, 'n lêer naam en 'n operasie wil ons onderneem. 80 00:03:57,300 --> 00:04:01,690 So kan ons 'n oproep wat lyk soos het lêer star ptr this-- 1 gelyk fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 En die operasie het ek gekies het is r. 83 00:04:07,020 --> 00:04:08,639 >> So wat dink jy r is hier? 84 00:04:08,639 --> 00:04:11,180 Wat is die aard van die dinge wat ons dalk in staat wees om te doen om lêers? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 So r is die operasie dat ons kies wanneer ons wil 'n lêer te lees. 87 00:04:17,500 --> 00:04:20,260 So sou ons basies wanneer Ons maak 'n oproep soos hierdie 88 00:04:20,260 --> 00:04:25,440 kry ons 'n lêer wyser so dat ons dan kon lees inligting 89 00:04:25,440 --> 00:04:27,770 van file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> Net so, kan ons lêer 2.txt oop vir die skryf en sodat ons kan slaag ptr2, 91 00:04:34,190 --> 00:04:38,210 die lêer wyser Ek het hier geskep is, as 'n argument om enige funksie wat 92 00:04:38,210 --> 00:04:40,080 skryf inligting na 'n lêer. 93 00:04:40,080 --> 00:04:43,767 En soortgelyk aan die skryf, daar is ook die opsie om by te voeg, 'n. 94 00:04:43,767 --> 00:04:45,600 Die verskil tussen skryf en die aanbring 95 00:04:45,600 --> 00:04:50,920 is dat wanneer jy skryf 'n lêer, as jy 'n oproep om fopen vir skryf te maak 96 00:04:50,920 --> 00:04:54,761 en dat die lêer bestaan ​​reeds, dit is gaan die hele lêer te vervang. 97 00:04:54,761 --> 00:04:56,510 Dit gaan om te begin aan die begin, 98 00:04:56,510 --> 00:04:58,820 al die inligting te verwyder dit is reeds daar. 99 00:04:58,820 --> 00:05:02,210 >> Terwyl as jy dit vir die aanbring van oop, dit sal gaan tot die einde van die lêer 100 00:05:02,210 --> 00:05:04,340 As daar reeds teks dit of inligting in dit, 101 00:05:04,340 --> 00:05:06,040 en dit sal dan begin skryf van daar af. 102 00:05:06,040 --> 00:05:08,570 So sal jy nie enige van die verloor inligting wat jy voorheen gedoen het nie. 103 00:05:08,570 --> 00:05:12,110 Of jy nou wil om te skryf of voeg soort hang af van die situasie. 104 00:05:12,110 --> 00:05:16,840 Maar jy sal waarskynlik weet wat die regte operasie is wanneer die tyd kom. 105 00:05:16,840 --> 00:05:18,020 So dit is fopen. 106 00:05:18,020 --> 00:05:18,930 >> Wat van fclose? 107 00:05:18,930 --> 00:05:21,600 Wel, mooi eenvoudig, fclose net aanvaar die lêer wyser. 108 00:05:21,600 --> 00:05:24,000 En as jy kan verwag, dit sluit die lêer. 109 00:05:24,000 --> 00:05:29,270 En sodra ons 'n lêer het gesluit, kan ons nie voer meer lêer I / O funksies, 110 00:05:29,270 --> 00:05:31,420 lees of skryf, op die lêer. 111 00:05:31,420 --> 00:05:36,444 Ons het om te her-open die lêer 'n ander tyd in orde 112 00:05:36,444 --> 00:05:38,610 om voort te gaan werk met dit met behulp van die I / O funksies. 113 00:05:38,610 --> 00:05:41,520 So fclose beteken ons is gedoen werk met hierdie lêer. 114 00:05:41,520 --> 00:05:44,690 En al wat ons nodig het om te slaag in is die naam van 'n lêer wyser. 115 00:05:44,690 --> 00:05:50,010 So op 'n paar skyfies gelede, het ons fopened lêer 1 dot teks vir die lees 116 00:05:50,010 --> 00:05:52,854 en ons dat opgedra lêer wyser na ptr1. 117 00:05:52,854 --> 00:05:55,020 Nou het ons besluit ons gedoen lees van die lêer. 118 00:05:55,020 --> 00:05:56,561 Ons het nie nodig om meer te doen met dit. 119 00:05:56,561 --> 00:05:58,890 Ons kan net fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 En insgelyks, kan ons fclose die ander kinders. 121 00:06:01,950 --> 00:06:02,450 Alles reg. 122 00:06:02,450 --> 00:06:03,700 So dit is die opening en sluiting. 123 00:06:03,700 --> 00:06:05,780 Dit is die twee basiese begin bedrywighede. 124 00:06:05,780 --> 00:06:08,050 >> Nou wil ons eintlik doen 'n paar interessante dinge, 125 00:06:08,050 --> 00:06:11,940 en die eerste funksie wat ons sal sien dat sal doen wat fgetc-- 126 00:06:11,940 --> 00:06:14,110 lêer kry 'n karakter. 127 00:06:14,110 --> 00:06:17,350 Dit is wat algemeen fgetc sou vertaal. 128 00:06:17,350 --> 00:06:20,190 Sy doel in die lewe is om die volgende karakter te lees, 129 00:06:20,190 --> 00:06:22,079 of as dit jou baie eerste oproep om fgetc 130 00:06:22,079 --> 00:06:23,870 vir 'n spesifieke lêer, die eerste karakter. 131 00:06:23,870 --> 00:06:26,210 Maar dan daarna, jy die volgende een te kry, 132 00:06:26,210 --> 00:06:31,500 die volgende karakter van die lêer, en slaan dit in 'n karakter veranderlike. 133 00:06:31,500 --> 00:06:34,490 Soos ons hier gedoen het, char ch gelyk fgetc, 134 00:06:34,490 --> 00:06:36,389 slaag in die naam van 'n lêer wyser. 135 00:06:36,389 --> 00:06:38,180 Weereens, dit is baie belangrik om te onthou hier 136 00:06:38,180 --> 00:06:41,430 dat dit in orde om hierdie aksie slaag nie, 137 00:06:41,430 --> 00:06:45,690 die lêer wyser self het seker geopen vir die lees. 138 00:06:45,690 --> 00:06:50,589 Ons kan 'n karakter nie lees van 'n lêer wyser dat ons vir skryf oop. 139 00:06:50,589 --> 00:06:52,630 So dit is een van die beperkinge van fopen, reg? 140 00:06:52,630 --> 00:06:55,470 Ons het om te beperk onsself net presteer 141 00:06:55,470 --> 00:06:57,710 een operasie met 'n lêer wyser. 142 00:06:57,710 --> 00:07:00,220 As ons wou om te lees en skryf van die dieselfde lêer, 143 00:07:00,220 --> 00:07:03,840 sou ons oop twee afsonderlike het lêer verwysings na dieselfde file-- 144 00:07:03,840 --> 00:07:05,670 een vir die lees, een vir skryf. 145 00:07:05,670 --> 00:07:08,400 >> So weer, die enigste rede Ek bring dat tot nou 146 00:07:08,400 --> 00:07:11,920 want as ons gaan om 'n oproep te maak om fgetc, die lêer wyser het seker 147 00:07:11,920 --> 00:07:14,172 geopen vir die lees. 148 00:07:14,172 --> 00:07:15,880 En dan mooi eenvoudig, Al wat ons moet doen 149 00:07:15,880 --> 00:07:17,546 is verby in die naam van die lêer wyser. 150 00:07:17,546 --> 00:07:21,060 So char ch gelyk fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> Dit gaan om ons te kry die volgende character-- 152 00:07:23,200 --> 00:07:25,575 of weer, as dit is die eerste tyd wat ons het hierdie oproep gemaak het, 153 00:07:25,575 --> 00:07:29,750 die eerste character-- van watter lêer daarop om deur ptr1. 154 00:07:29,750 --> 00:07:32,210 Onthou dat dit was lêer 1 dot teks. 155 00:07:32,210 --> 00:07:36,490 Dit sal die eerste karakter van daardie te kry en ons sal dit op te slaan in die veranderlike ch. 156 00:07:36,490 --> 00:07:37,941 Redelik eenvoudig. 157 00:07:37,941 --> 00:07:40,190 Dus het ons net kyk na drie funksies en reeds ons 158 00:07:40,190 --> 00:07:43,070 kan iets mooi netjies te doen. 159 00:07:43,070 --> 00:07:46,320 >> So as ons hierdie vermoë om 'n karakter 160 00:07:46,320 --> 00:07:48,943 en ons lus it-- sodat ons voortgaan om karakters te kry 161 00:07:48,943 --> 00:07:51,390 uit 'n lêer oor en nou verby en ons over-- 162 00:07:51,390 --> 00:07:54,500 kan lees elke enkele karakter van 'n lêer. 163 00:07:54,500 --> 00:07:58,670 En as ons elke karakter te druk onmiddellik nadat ons dit lees, 164 00:07:58,670 --> 00:08:01,960 ons het nou gelees van 'n lêer en gedruk die inhoud op die skerm. 165 00:08:01,960 --> 00:08:05,610 Ons het effektief saamgevoeg dat 'n lêer op die skerm. 166 00:08:05,610 --> 00:08:09,670 En dit is wat die Linux command kat doen. 167 00:08:09,670 --> 00:08:13,250 >> As jy die kat tik in die naam van die lêer, is dit sal die hele inhoud druk 168 00:08:13,250 --> 00:08:15,160 van die lêer in jou terminale venster. 169 00:08:15,160 --> 00:08:19,010 En so hierdie klein lus hier slegs drie reëls van die kode, 170 00:08:19,010 --> 00:08:23,270 maar dit effektief duplikate die Linux command kat. 171 00:08:23,270 --> 00:08:25,210 So hierdie sintaksis dalk kyk 'n bietjie vreemd, 172 00:08:25,210 --> 00:08:26,670 maar hier is wat hier gebeur. 173 00:08:26,670 --> 00:08:31,460 Terwyl ch gelyk fgetc, ptr is nie gelyk aan EOF-- dit is 'n hele mondvol, 174 00:08:31,460 --> 00:08:34,669 maar laat breek dit net af so dit is duidelik oor die sintaksis. 175 00:08:34,669 --> 00:08:37,169 Ek het dit gekonsolideer ter wille van die ruimte, 176 00:08:37,169 --> 00:08:39,049 hoewel dit 'n bietjie sintakties lastig. 177 00:08:39,049 --> 00:08:41,194 >> So hierdie deel in die groen regte Nou, wat is om dit te doen? 178 00:08:41,194 --> 00:08:42,860 Wel, dit is net ons fgetc oproep, reg? 179 00:08:42,860 --> 00:08:44,530 Ons het gesien dat voor. 180 00:08:44,530 --> 00:08:49,500 Dit is die verkryging van 'n karakter van die lêer. 181 00:08:49,500 --> 00:08:53,220 Dan vergelyk ons ​​dat karakter teen EOF. 182 00:08:53,220 --> 00:08:57,470 EOF is 'n spesiale waarde wat gedefinieer in die standaard io.h, wat 183 00:08:57,470 --> 00:08:59,390 is die einde van die lêer karakter. 184 00:08:59,390 --> 00:09:03,450 So basies wat gaan gebeur is hierdie lus sal 'n karakter te lees, 185 00:09:03,450 --> 00:09:07,445 dit vergelyk met eof, die einde van die lêer karakter. 186 00:09:07,445 --> 00:09:10,070 As hulle nie pas nie, so ons het nie aan die einde van die lêer, 187 00:09:10,070 --> 00:09:11,490 ons sal daardie karakter uit te druk. 188 00:09:11,490 --> 00:09:13,740 Dan sal ons terug te gaan na die begin van die lus weer. 189 00:09:13,740 --> 00:09:18,310 Ons sal 'n karakter te kry, gaan teen EOF, druk dit uit, en so aan 190 00:09:18,310 --> 00:09:21,094 en so aan en so aan, deur herhaling op dié manier 191 00:09:21,094 --> 00:09:22,760 totdat ons die einde van die lêer bereik het. 192 00:09:22,760 --> 00:09:24,593 En dan deur daardie punt, Ons sal gedruk 193 00:09:24,593 --> 00:09:26,210 uit die hele inhoud van die lêer. 194 00:09:26,210 --> 00:09:29,450 So weer, het ons net gesien fopen, fclose en fgetc 195 00:09:29,450 --> 00:09:34,950 en al kan ons dupliseer 'n Linux terminale opdrag. 196 00:09:34,950 --> 00:09:38,850 >> Soos ek gesê het aan die begin, ons het fgetc en fputc, 197 00:09:38,850 --> 00:09:41,860 en fputc was die metgesel funksie van fgetc. 198 00:09:41,860 --> 00:09:44,880 En so, as jy dalk dink, dit is die skrif ekwivalent. 199 00:09:44,880 --> 00:09:49,440 Dit stel ons in staat om 'n skrywe enkele karakter na 'n lêer. 200 00:09:49,440 --> 00:09:53,290 >> Weereens, die caveat dat, net soos dit was met fgetc, die lêer 201 00:09:53,290 --> 00:09:56,660 dat ons skryf aan het seker al oop vir skryf of vir die aanbring. 202 00:09:56,660 --> 00:10:00,820 As ons probeer en gebruik fputc op 'n lêer dat ons vir die lees oopgemaak het, 203 00:10:00,820 --> 00:10:02,760 ons gaan ly 'n bietjie van 'n fout. 204 00:10:02,760 --> 00:10:04,440 Maar die oproep is redelik eenvoudig. 205 00:10:04,440 --> 00:10:08,000 fputc kapitaal A ptr2, al wat gaan doen, is dit 206 00:10:08,000 --> 00:10:12,040 gaan die brief te skryf in 'n lêer in 2 dot 207 00:10:12,040 --> 00:10:14,760 teks, wat die naam van die was lêer dat ons oopgemaak en opgedra 208 00:10:14,760 --> 00:10:17,280 die wyser na ptr2. 209 00:10:17,280 --> 00:10:20,430 So ons gaan 'n skrywe kapitaal A tot 2 dot tekslêer. 210 00:10:20,430 --> 00:10:24,592 En ons sal 'n uitroep skryf wys 3 dot lêer 211 00:10:24,592 --> 00:10:27,330 teks, wat wys na die ptr3. 212 00:10:27,330 --> 00:10:29,730 So weer, hier redelik eenvoudig. 213 00:10:29,730 --> 00:10:32,727 >> Maar nou kan ons nog 'n ding te doen. 214 00:10:32,727 --> 00:10:34,560 Ons het hierdie voorbeeld ons net gaan oor 215 00:10:34,560 --> 00:10:38,950 oor die vermoë om die kat te herhaal Linux opdrag, die een wat druk uit 216 00:10:38,950 --> 00:10:40,500 na die skerm. 217 00:10:40,500 --> 00:10:43,510 Wel, nou dat ons die vermoë om die karakters van lêers te lees 218 00:10:43,510 --> 00:10:46,590 en skryf karakters lêers, Daarom het ons nie vervang net dat 219 00:10:46,590 --> 00:10:50,720 bel om printf met 'n oproep om fputc. 220 00:10:50,720 --> 00:10:54,090 >> En nou het ons gedupliseer CP, 'n baie basiese Linux command 221 00:10:54,090 --> 00:10:59,100 dat ons gepraat oor 'n lang pad gelede in die Linux instruksies video. 222 00:10:59,100 --> 00:11:01,070 Ons het effektief gedupliseer dat hier. 223 00:11:01,070 --> 00:11:04,790 Ons lees van 'n karakter en dan is ons skryf dat karakter na 'n ander lêer. 224 00:11:04,790 --> 00:11:07,660 Lees van 'n lêer, skryf na 'n ander, oor en oor 225 00:11:07,660 --> 00:11:11,350 en oor weer totdat ons getref EOF. 226 00:11:11,350 --> 00:11:14,250 Ons het tot die einde van die lêer ons probeer om te kopieer van. 227 00:11:14,250 --> 00:11:18,500 En dat ons sal al geskryf het van die karakters wat ons nodig het om die lêer 228 00:11:18,500 --> 00:11:19,500 dat ons skriftelik aan. 229 00:11:19,500 --> 00:11:24,270 So dit is CP, die Linux kopie opdrag. 230 00:11:24,270 --> 00:11:26,550 >> Aan die begin van hierdie video het ek die caveat 231 00:11:26,550 --> 00:11:29,840 dat ons 'n wil praat bietjie oor wenke. 232 00:11:29,840 --> 00:11:32,480 Hier is spesifiek waar ons gaan om te praat oor pointers 233 00:11:32,480 --> 00:11:34,800 bykomend tot lêer verwysings. 234 00:11:34,800 --> 00:11:37,870 So hierdie funksie lyk soort van scary. 235 00:11:37,870 --> 00:11:39,120 Dit het 'n hele paar parameters. 236 00:11:39,120 --> 00:11:40,430 Daar is 'n baie gaan op hier. 237 00:11:40,430 --> 00:11:42,760 Daar is 'n baie verskillende kleure en tekste. 238 00:11:42,760 --> 00:11:47,100 Maar regtig, dit is net die generiese weergawe van fgetc 239 00:11:47,100 --> 00:11:50,110 wat ons toelaat om enige te kry hoeveelheid inligting. 240 00:11:50,110 --> 00:11:53,560 Dit kan 'n bietjie ondoeltreffende as ons kry karakters op 'n tyd, 241 00:11:53,560 --> 00:11:55,770 iterating deur die lêer een karakter op 'n tyd. 242 00:11:55,770 --> 00:12:00,230 Sou dit nie mooier te kry 100 op 'n slag of 500 op 'n slag? 243 00:12:00,230 --> 00:12:03,250 >> Wel, fread en sy metgesel funksie fwrite, wat ons sal praat oor 244 00:12:03,250 --> 00:12:05,490 in 'n tweede, ons toelaat om dit te doen. 245 00:12:05,490 --> 00:12:08,480 Ons kan nie 'n arbitrêre bedrag gelees inligting van 'n lêer 246 00:12:08,480 --> 00:12:10,290 en ons bêre dit iewers tydelik. 247 00:12:10,290 --> 00:12:12,980 In plaas van om te kan net pas dit in 'n enkele veranderlike, 248 00:12:12,980 --> 00:12:15,790 ons dalk nodig om dit te stoor in 'n skikking. 249 00:12:15,790 --> 00:12:19,980 En so het ons slaag in vier argumente om 'n wyser fread-- 250 00:12:19,980 --> 00:12:23,940 om die ligging waar ons gaan om inligting te stoor, 251 00:12:23,940 --> 00:12:29,180 hoe groot elke eenheid van inligting sal wees, hoeveel eenhede van inligting 252 00:12:29,180 --> 00:12:35,192 ons wil bekom, en van watter lêer ons wil om dit te kry. 253 00:12:35,192 --> 00:12:37,150 Waarskynlik die beste geïllustreer met 'n voorbeeld hier. 254 00:12:37,150 --> 00:12:41,640 So kom ons sê dat ons verklaar 'n verskeidenheid van 10 heelgetalle. 255 00:12:41,640 --> 00:12:45,080 Ons het nou net verklaar word op die stapel arbitrêr int arr 10. 256 00:12:45,080 --> 00:12:46,970 So dit is redelik eenvoudig. 257 00:12:46,970 --> 00:12:51,970 Nou wat ons al te doen, is die frecall is ons lees grootte van int 258 00:12:51,970 --> 00:12:54,180 keer 10 grepe van inligting. 259 00:12:54,180 --> 00:12:59,040 Grootte van int wese four-- dis die grootte van 'n heelgetal in c. 260 00:12:59,040 --> 00:13:02,790 >> So wat ons doen is ons lees 40 grepe waarde van inligting 261 00:13:02,790 --> 00:13:05,850 uit die lêer verwys na deur ptr. 262 00:13:05,850 --> 00:13:08,600 En ons stoor diegene 40 grepe iewers 263 00:13:08,600 --> 00:13:12,080 waar ons opsygesit 40 grepe waarde van die geheue. 264 00:13:12,080 --> 00:13:15,970 Gelukkig het ons reeds gedoen deur verklaar arr dat array reg daar. 265 00:13:15,970 --> 00:13:19,770 Dit is in staat om van hou 10 vier-byte eenhede. 266 00:13:19,770 --> 00:13:22,860 So in totaal, kan dit hou 40 grepe werd van inligting. 267 00:13:22,860 --> 00:13:26,540 En ons is nou lees 40 grepe van inligting uit die lêer, 268 00:13:26,540 --> 00:13:30,330 en ons is dit stoor in arr. 269 00:13:30,330 --> 00:13:35,470 >> Onthou uit die video op pointers wat die naam van 'n skikking, soos arr, 270 00:13:35,470 --> 00:13:38,370 is eintlik net 'n wyser om sy eerste element. 271 00:13:38,370 --> 00:13:43,680 So wanneer ons slaag in arr daar, het ons is, in werklikheid, verby in 'n wyser. 272 00:13:43,680 --> 00:13:46,120 >> Net so kan ons this-- doen ons doen nie noodwendig 273 00:13:46,120 --> 00:13:51,200 moet ons buffer bespaar op die stapel. 274 00:13:51,200 --> 00:13:54,990 Ons kan ook dinamiese toewys 'n buffer soos hierdie, met behulp van malloc. 275 00:13:54,990 --> 00:13:57,340 Onthou, wanneer ons dinamiese toewys geheue, 276 00:13:57,340 --> 00:14:00,550 ons spaar dit op die hoop, nie die stapel. 277 00:14:00,550 --> 00:14:02,110 Maar dit is nog steeds 'n buffer. 278 00:14:02,110 --> 00:14:06,810 >> Dit nog steeds, in hierdie geval, is hou 640 grepe inligting 279 00:14:06,810 --> 00:14:09,230 omdat 'n dubbele neem agt grepe. 280 00:14:09,230 --> 00:14:11,570 En ons vra vir 80 van hulle. 281 00:14:11,570 --> 00:14:13,770 Ons wil ruimte 80 dubbelspel te hou. 282 00:14:13,770 --> 00:14:17,210 So 80 keer 8 is 640 grepe inligting. 283 00:14:17,210 --> 00:14:21,880 En dat oproep om fread is invordering 640 grepe inligting 284 00:14:21,880 --> 00:14:27,770 uit die lêer verwys na deur PTR en stoor dit nou in arr2. 285 00:14:27,770 --> 00:14:32,770 >> Nou kan ons ook fread behandel net soos 'n oproep om fgetc. 286 00:14:32,770 --> 00:14:37,140 In hierdie geval, ons net probeer om kry een karakter uit die lêer. 287 00:14:37,140 --> 00:14:40,070 En ons het nie 'n moet skikking om 'n karakter te hou. 288 00:14:40,070 --> 00:14:43,170 Ons kan net stoor dit in 'n karakter veranderlike. 289 00:14:43,170 --> 00:14:46,390 >> Die vangs, al is, is dat wanneer ons net 'n veranderlike, 290 00:14:46,390 --> 00:14:50,290 ons nodig het om te slaag in die adres van daardie veranderlike 291 00:14:50,290 --> 00:14:52,550 want onthou dat die eerste argument fread 292 00:14:52,550 --> 00:14:59,210 is 'n verwysing na die plek en geheue waar ons wil die inligting te stoor. 293 00:14:59,210 --> 00:15:01,550 Weereens, die naam van 'n skikking is 'n wyser. 294 00:15:01,550 --> 00:15:04,200 Sodat ons nie nodig het om te ampersand verskeidenheid te doen. 295 00:15:04,200 --> 00:15:07,270 Maar c, die karakter c hier is, is nie 'n skikking. 296 00:15:07,270 --> 00:15:08,390 Dit is net 'n veranderlike. 297 00:15:08,390 --> 00:15:11,840 En so het ons nodig het om te slaag 'n ampersand c om aan te dui 298 00:15:11,840 --> 00:15:15,350 dat dit is die adres waar ons wil hierdie een byte van inligting te stoor, 299 00:15:15,350 --> 00:15:20,479 hierdie een karakter wat ons insamel ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Ek sal deurgaan dit 'n bietjie meer 301 00:15:22,270 --> 00:15:25,440 quickly-- is pretty much die presiese ekwivalent van fread 302 00:15:25,440 --> 00:15:27,720 behalwe dit is vir skryf in plaas van die lees, net 303 00:15:27,720 --> 00:15:31,610 soos die other-- ons oop gehad het en sluit, kry 'n karakter, 304 00:15:31,610 --> 00:15:32,530 skryf 'n karakter. 305 00:15:32,530 --> 00:15:35,040 Nou is dit te kry arbitrêre hoeveelheid inligting, 306 00:15:35,040 --> 00:15:37,170 reg arbitrêre hoeveelheid inligting. 307 00:15:37,170 --> 00:15:39,790 So net soos voorheen, kan ons het 'n verskeidenheid van 10 heelgetalle 308 00:15:39,790 --> 00:15:43,210 waar ons reeds ' inligting gestoor, miskien. 309 00:15:43,210 --> 00:15:46,580 >> Dit was waarskynlik 'n paar reëls van die kode wat moet gaan tussen hierdie twee 310 00:15:46,580 --> 00:15:49,990 waar ek vul skik met iets betekenisvol. 311 00:15:49,990 --> 00:15:51,880 Ek vul dit met 10 verskillende heelgetalle. 312 00:15:51,880 --> 00:15:54,920 En in plaas daarvan, wat ek doen, is skryf van arr 313 00:15:54,920 --> 00:15:58,600 en die invordering van die inligting uit arr. 314 00:15:58,600 --> 00:16:02,390 En ek neem dat die inligting en sit dit in die lêer. 315 00:16:02,390 --> 00:16:05,410 >> So in plaas van dit wat uit die lêer om die buffer, 316 00:16:05,410 --> 00:16:08,790 ons gaan nou uit die buffer om die lêer. 317 00:16:08,790 --> 00:16:10,580 So dit is net die omgekeerde. 318 00:16:10,580 --> 00:16:16,680 So weer, net soos voorheen, kan ons het ook 'n hoop stuk van die geheue 319 00:16:16,680 --> 00:16:19,600 wat ons het dinamies toegeken en lees van daardie 320 00:16:19,600 --> 00:16:21,570 en skryf dit op die lêer. 321 00:16:21,570 --> 00:16:24,900 >> En ons het ook 'n enkele veranderlike staat van die hou van 'n byte 322 00:16:24,900 --> 00:16:27,200 van inligting, soos 'n karakter. 323 00:16:27,200 --> 00:16:29,830 Maar weereens, moet ons in slaag die adres van daardie veranderlike 324 00:16:29,830 --> 00:16:31,840 wanneer ons wil om te lees van dit. 325 00:16:31,840 --> 00:16:35,280 So kan ons die inligting skryf vind ons by daardie adres 326 00:16:35,280 --> 00:16:39,050 om die lêer pointer, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Daar is baie van die ander groot lêer I / O funksies 328 00:16:41,630 --> 00:16:44,650 doen verskeie dinge behalwe die wat ons het gepraat oor vandag. 329 00:16:44,650 --> 00:16:46,450 'N Paar van die kinders jy dalk nuttig vind 330 00:16:46,450 --> 00:16:50,840 is fgets en fputs, wat die ekwivalent 331 00:16:50,840 --> 00:16:56,190 van fgetc en fputc maar vir die lees 'n enkele string van 'n lêer. 332 00:16:56,190 --> 00:16:59,020 In plaas van 'n enkele karakter, dit sal 'n hele string lees. 333 00:16:59,020 --> 00:17:02,940 fprintf, wat basies kan jy printf gebruik om te skryf na lêer. 334 00:17:02,940 --> 00:17:05,619 So net soos jy die kan doen veranderlike vervanging met behulp 335 00:17:05,619 --> 00:17:09,900 die plekhouers persent i en persent d, en so aan, met printf 336 00:17:09,900 --> 00:17:14,690 jy kan insgelyks neem printf string en druk iets 337 00:17:14,690 --> 00:17:16,800 soos dit na 'n lêer. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- as jy 'n DVD-speler is die analogie Ek gebruik gewoonlik here-- 339 00:17:20,720 --> 00:17:23,109 is 'n soort van soos die gebruik van jou rewind en vinnig vorentoe 340 00:17:23,109 --> 00:17:25,819 knoppies om rond te beweeg die film. 341 00:17:25,819 --> 00:17:28,369 Net so, kan jy beweeg om die lêer. 342 00:17:28,369 --> 00:17:30,250 Een van die dinge in dat lêerstruktuur 343 00:17:30,250 --> 00:17:34,270 dat c skep vir jou 'n aanduiding van waar jy is in die lêer. 344 00:17:34,270 --> 00:17:36,420 Is jy op die heel begin op byte nul? 345 00:17:36,420 --> 00:17:39,290 Is jy op byte 100, byte 1000, en so aan? 346 00:17:39,290 --> 00:17:44,340 Jy kan gebruik om fseek arbitrêr beweeg dat aanwyser vorentoe of agtertoe. 347 00:17:44,340 --> 00:17:46,744 >> En ftell weer soortgelyk aan 'n DVD-speler, 348 00:17:46,744 --> 00:17:49,660 is soos 'n klein klok wat vertel jy hoeveel minute en sekondes 349 00:17:49,660 --> 00:17:52,480 is in 'n bepaalde film. 350 00:17:52,480 --> 00:17:56,990 Net so, ftell vertel hoe jy baie grepe jy in die lêer. 351 00:17:56,990 --> 00:18:00,210 feof is 'n ander weergawe van die opsporing of jy het 352 00:18:00,210 --> 00:18:01,700 aan die einde van die lêer. 353 00:18:01,700 --> 00:18:03,600 En ferror is 'n funksie wat jy kan gebruik 354 00:18:03,600 --> 00:18:06,959 op te spoor of iets gegaan verkeerde werk met 'n lêer. 355 00:18:06,959 --> 00:18:08,750 Weereens, dit is net krap die oppervlak. 356 00:18:08,750 --> 00:18:12,730 Daar is nog baie meer lêer I / O funksies in die standaard io.h. 357 00:18:12,730 --> 00:18:16,620 Maar dit sal jy waarskynlik kry begin werk met lêer verwysings. 358 00:18:16,620 --> 00:18:17,640 Ek is Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Dit is cs50. 360 00:18:19,750 --> 00:18:21,669