1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> Speak: Hittills ÃĊr det troligt att de flesta av dina program 3 00:00:07,870 --> 00:00:10,170 har varit lite kortlivad. 4 00:00:10,170 --> 00:00:13,310 Du kör ett program som Mario eller giriga. 5 00:00:13,310 --> 00:00:17,350 Det gör nÃċgot, det kanske uppmanas anvÃĊndaren om viss information, 6 00:00:17,350 --> 00:00:20,400 skriva ut vissa utdata till skÃĊrmen, men sedan nÃĊr programmet ÃĊr över, 7 00:00:20,400 --> 00:00:23,252 det finns egentligen inga bevis finns det nÃċgonsin kör i första hand. 8 00:00:23,252 --> 00:00:25,960 Jag menar, visst, du kanske har lÃĊmnat Det öppnas i terminalfönstret, 9 00:00:25,960 --> 00:00:29,770 men om du rensar din skÃĊrm, det finns egentligen inga bevis för att det fanns. 10 00:00:29,770 --> 00:00:33,720 Vi har inte ett sÃĊtt att lagra ihÃċllande, information 11 00:00:33,720 --> 00:00:36,890 som existerar efter vÃċr Programmet har stannat, 12 00:00:36,890 --> 00:00:39,241 eller sÃċ har vi inte upp till denna punkt. 13 00:00:39,241 --> 00:00:41,490 Lyckligtvis gör c ge oss möjlighet 14 00:00:41,490 --> 00:00:44,220 att göra detta genom att implementera nÃċgot som kallas 15 00:00:44,220 --> 00:00:48,330 en fil, en struktur som i grund och botten representerar en fil som du skulle fördubbla 16 00:00:48,330 --> 00:00:53,826 klicka pÃċ din dator, om du ÃĊr van vid ett grafiskt anvÃĊndarmiljö. 17 00:00:53,826 --> 00:00:55,700 Generellt vid arbete med c, vi ÃĊr faktiskt 18 00:00:55,700 --> 00:00:59,965 kommer att arbeta med pekare till files-- fil stars-- 19 00:00:59,965 --> 00:01:02,090 med undantag för lite nÃĊr vi talar om ett par 20 00:01:02,090 --> 00:01:04,560 av de funktioner som arbeta med fil pekare. 21 00:01:04,560 --> 00:01:08,990 Du behöver inte ha riktigt grÃĊvt för djupt för att öka kunskapen pekare 22 00:01:08,990 --> 00:01:09,730 sjÃĊlva. 23 00:01:09,730 --> 00:01:12,870 Det finns en liten pyttelitet bit dÃĊr vi kommer att prata om dem, 24 00:01:12,870 --> 00:01:18,090 men i allmÃĊnhet fil pekare och pekare, medan varandra, 25 00:01:18,090 --> 00:01:20,290 ÃĊr inte exakt samma sak. 26 00:01:20,290 --> 00:01:22,440 >> Nu vad jag menar nÃĊr Jag sÃĊger ihÃċllande data? 27 00:01:22,440 --> 00:01:23,650 Vad ÃĊr bestÃĊndiga data? 28 00:01:23,650 --> 00:01:25,232 Varför vi bryr oss om det? 29 00:01:25,232 --> 00:01:27,190 SÃĊg till exempel att du kör ett program 30 00:01:27,190 --> 00:01:29,850 eller om du har skrivit om en program som ÃĊr ett spel, 31 00:01:29,850 --> 00:01:32,960 och du vill hÃċlla koll av alla anvÃĊndarens rörelser 32 00:01:32,960 --> 00:01:36,620 sÃċ att kanske om nÃċgot gÃċr fel, du kan granska filen efter matchen. 33 00:01:36,620 --> 00:01:39,970 Det ÃĊr vad vi menar nÃĊr vi prata om bestÃĊndiga data. 34 00:01:39,970 --> 00:01:43,930 >> Under köra din program, skapas en fil. 35 00:01:43,930 --> 00:01:45,680 Och nÃĊr ditt program har stannat, 36 00:01:45,680 --> 00:01:48,689 att filen finns fortfarande pÃċ ditt system. 37 00:01:48,689 --> 00:01:50,230 Och vi kan titta pÃċ det och undersöka det. 38 00:01:50,230 --> 00:01:53,670 Och sÃċ det programmet skulle stÃĊllas in pÃċ har skapat nÃċgra bestÃĊndiga data, 39 00:01:53,670 --> 00:01:57,390 Det finns uppgifter efter programmet har körts. 40 00:01:57,390 --> 00:02:02,320 >> Nu har alla dessa funktioner som fungerar med att skapa filer och manipulera 41 00:02:02,320 --> 00:02:04,940 dem pÃċ olika sÃĊtt bor i standard io.h, 42 00:02:04,940 --> 00:02:08,210 vilket ÃĊr en header-fil som du har förmodligen varit pund 43 00:02:08,210 --> 00:02:10,910 inbegripet pÃċ toppen av vackra mycket alla dina program 44 00:02:10,910 --> 00:02:14,130 eftersom den innehÃċller en av de mest anvÃĊndbara funktioner för oss, 45 00:02:14,130 --> 00:02:16,130 printf, som ocksÃċ lÃċter bor i standard io.h. 46 00:02:16,130 --> 00:02:20,400 SÃċ du behöver inte pund inkluderar eventuella ytterligare filer förmodligen 47 00:02:20,400 --> 00:02:23,540 för att arbeta med fil pekare. 48 00:02:23,540 --> 00:02:29,980 >> Nu varenda filpekaren funktion, eller varje enskild fil I / O, Input Output 49 00:02:29,980 --> 00:02:33,310 funktionen accepterar som en av dess parametrar eller insatsvaror 50 00:02:33,310 --> 00:02:35,822 en fil pointer-- utom för en, fopen, vilket 51 00:02:35,822 --> 00:02:38,280 ÃĊr vad du anvÃĊnder för att hÃĊmta filen pekaren i första hand. 52 00:02:38,280 --> 00:02:41,010 Men efter att du har öppnat fil och du fÃċr filen pekare, 53 00:02:41,010 --> 00:02:43,510 Du kan sedan skicka dem som argument till de olika funktionerna 54 00:02:43,510 --> 00:02:46,720 vi kommer att prata om idag, liksom mÃċnga andra 55 00:02:46,720 --> 00:02:48,520 sÃċ att du kan arbeta med filer. 56 00:02:48,520 --> 00:02:50,980 >> SÃċ det finns sex ganska gemensamma grundlÃĊggande ettor 57 00:02:50,980 --> 00:02:52,870 att vi kommer att prata om idag. 58 00:02:52,870 --> 00:02:57,160 fopen och dess följeslagare funktion fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 och dess följeslagare funktion fputc, och fread och dess följeslagare funktion, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 SÃċ lÃċt oss fÃċ rÃĊtt till det. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- vad gör det? 63 00:03:07,050 --> 00:03:10,050 Tja, öppnar det en fil och det ger dig en fil pekare till det, 64 00:03:10,050 --> 00:03:14,000 sÃċ att du sedan kan anvÃĊnda det fil pekare som ett argument 65 00:03:14,000 --> 00:03:16,730 till nÃċgon av de andra fil-I / O-funktioner. 66 00:03:16,730 --> 00:03:19,100 Det viktigaste att minnas med fopen 67 00:03:19,100 --> 00:03:24,222 ÃĊr att nÃĊr du har öppnat fil eller gjorde ett samtal som den hÃĊr, 68 00:03:24,222 --> 00:03:26,930 du behöver för att kontrollera att att pekaren att du kommer tillbaka 69 00:03:26,930 --> 00:03:28,320 ÃĊr inte lika med noll. 70 00:03:28,320 --> 00:03:31,320 Om du inte har sett videon pÃċ pekare, vilket kanske inte vettigt. 71 00:03:31,320 --> 00:03:35,639 Men om du försöker och dereference en null-pekare Ãċterkallelse, 72 00:03:35,639 --> 00:03:38,180 ditt program kommer sannolikt att bli lidande en segmente [OHÖRBAR]. 73 00:03:38,180 --> 00:03:40,540 Vi vill se till att vi fick en legitim pekare tillbaka. 74 00:03:40,540 --> 00:03:43,665 Den stora majoriteten av den tid som vi kommer har fÃċtt en legitim pekare tillbaka 75 00:03:43,665 --> 00:03:45,280 och det kommer inte att vara ett problem. 76 00:03:45,280 --> 00:03:46,760 >> SÃċ hur gör vi ett anrop till fopen? 77 00:03:46,760 --> 00:03:48,051 Det ser ut ungefÃĊr som den hÃĊr. 78 00:03:48,051 --> 00:03:52,690 Fil stjÃĊrna ptr-- PTR vara en generisk namn för fil pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 och vi passera i tvÃċ saker, ett filnamn och en operation som vi vill utföra. 80 00:03:57,300 --> 00:04:01,690 SÃċ vi kan ha ett samtal som ser ut this-- fil stjÃĊrn ptr en lika fopen 81 00:04:01,690 --> 00:04:04,040 fil1.txt. 82 00:04:04,040 --> 00:04:07,020 Och operationen jag har valt r. 83 00:04:07,020 --> 00:04:08,639 >> SÃċ vad tror du r ÃĊr hÃĊr? 84 00:04:08,639 --> 00:04:11,180 Vad ÃĊr den typ av saker som vi skulle kunna göra för att filer? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 SÃċ r ÃĊr den verksamhet som vi vÃĊlja nÃĊr vi vill lÃĊsa en fil. 87 00:04:17,500 --> 00:04:20,260 SÃċ skulle vi i princip nÃĊr Vi gör ett samtal sÃċ hÃĊr 88 00:04:20,260 --> 00:04:25,440 att fÃċ oss en filpekare sÃċ att vi sedan kan lÃĊsa information 89 00:04:25,440 --> 00:04:27,770 frÃċn fil1.txt. 90 00:04:27,770 --> 00:04:34,190 >> PÃċ samma sÃĊtt kan vi öppna filen 2.txt för att skriva och sÃċ att vi kan passera ptr2, 91 00:04:34,190 --> 00:04:38,210 filpekaren jag har skapat hÃĊr, som ett argument till en funktion som 92 00:04:38,210 --> 00:04:40,080 skriver information till en fil. 93 00:04:40,080 --> 00:04:43,767 Och liknande till skrivande, det finns ocksÃċ möjlighet att lÃĊgga till en. 94 00:04:43,767 --> 00:04:45,600 Skillnaden mellan skriva och lÃĊgga 95 00:04:45,600 --> 00:04:50,920 ÃĊr att nÃĊr du skriver till en fil, om du gör ett samtal till fopen för att skriva 96 00:04:50,920 --> 00:04:54,761 och att filen redan existerar, det ÃĊr kommer att skriva över hela filen. 97 00:04:54,761 --> 00:04:56,510 Det kommer att börja i början, 98 00:04:56,510 --> 00:04:58,820 radera all information det ÃĊr redan dÃĊr. 99 00:04:58,820 --> 00:05:02,210 >> Medan om du öppnar det för att lÃĊgga, det kommer att gÃċ till slutet av filen 100 00:05:02,210 --> 00:05:04,340 Om det redan finns text i det eller informationen i den, 101 00:05:04,340 --> 00:05:06,040 och det kommer dÃċ att börja skriver dÃĊrifrÃċn. 102 00:05:06,040 --> 00:05:08,570 SÃċ du kommer inte att förlora nÃċgon av de information som du har gjort förut. 103 00:05:08,570 --> 00:05:12,110 Oavsett om du vill skriva eller lÃĊgga sorts beror pÃċ situationen. 104 00:05:12,110 --> 00:05:16,840 Men du kommer förmodligen vet vad rÃĊtt verksamhet ÃĊr nÃĊr det ÃĊr dags. 105 00:05:16,840 --> 00:05:18,020 SÃċ det ÃĊr fopen. 106 00:05:18,020 --> 00:05:18,930 >> Vad sÃĊgs om fclose? 107 00:05:18,930 --> 00:05:21,600 Tja, ganska enkelt, fclose bara accepterar filpekaren. 108 00:05:21,600 --> 00:05:24,000 Och som man kan förvÃĊnta sig, det stÃĊnger den filen. 109 00:05:24,000 --> 00:05:29,270 Och nÃĊr vi har stÃĊngt en fil, vi kan inte utföra mer fil-I / O-funktioner, 110 00:05:29,270 --> 00:05:31,420 lÃĊser eller skriver pÃċ den filen. 111 00:05:31,420 --> 00:05:36,444 Vi mÃċste Ãċter öppna fil en annan tid för 112 00:05:36,444 --> 00:05:38,610 att fortsÃĊtta arbeta med den med hjÃĊlp av I / O-funktioner. 113 00:05:38,610 --> 00:05:41,520 SÃċ fclose sÃĊtt vi gjort arbeta med denna fil. 114 00:05:41,520 --> 00:05:44,690 Och allt vi behöver skicka in ÃĊr namnet pÃċ en fil pekare. 115 00:05:44,690 --> 00:05:50,010 SÃċ pÃċ ett par glider sedan, vi fopened fil 1 dot text för lÃĊsning 116 00:05:50,010 --> 00:05:52,854 och vi tilldelade att fil pekare till ptr1. 117 00:05:52,854 --> 00:05:55,020 Nu har vi beslutat att vi ÃĊr gjort lÃĊsning frÃċn den filen. 118 00:05:55,020 --> 00:05:56,561 Vi behöver inte göra nÃċgot mer med det. 119 00:05:56,561 --> 00:05:58,890 Vi kan bara fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 Och pÃċ samma sÃĊtt, kunde vi fclose de andra. 121 00:06:01,950 --> 00:06:02,450 Okej. 122 00:06:02,450 --> 00:06:03,700 SÃċ det ÃĊr att öppna och stÃĊnga. 123 00:06:03,700 --> 00:06:05,780 De ÃĊr de tvÃċ grundlÃĊggande startoperationer. 124 00:06:05,780 --> 00:06:08,050 >> Nu vill vi faktiskt göra nÃċgra intressanta saker, 125 00:06:08,050 --> 00:06:11,940 och första funktion som vi ska se som kommer att göra det ÃĊr fgetc-- 126 00:06:11,940 --> 00:06:14,110 fil fÃċr en karaktÃĊr. 127 00:06:14,110 --> 00:06:17,350 Det ÃĊr vad fgetc allmÃĊnhet skulle översÃĊtta till. 128 00:06:17,350 --> 00:06:20,190 Dess mÃċl i livet ÃĊr att LÃĊs nÃĊsta tecken, 129 00:06:20,190 --> 00:06:22,079 eller om detta ÃĊr din mycket första samtalet till fgetc 130 00:06:22,079 --> 00:06:23,870 för en viss fil, det första tecknet. 131 00:06:23,870 --> 00:06:26,210 Men sedan efter det, du fÃċr nÃĊsta, 132 00:06:26,210 --> 00:06:31,500 redan nÃĊsta karaktÃĊr filen, och lagrar det i ett tecken variabel. 133 00:06:31,500 --> 00:06:34,490 Som vi har gjort hÃĊr, char ch lika fgetc, 134 00:06:34,490 --> 00:06:36,389 passera i namnet pÃċ en fil pekare. 135 00:06:36,389 --> 00:06:38,180 Återigen, det ÃĊr mycket viktigt hÃĊr att komma ihÃċg 136 00:06:38,180 --> 00:06:41,430 att för att ha denna operation lyckas, 137 00:06:41,430 --> 00:06:45,690 filpekaren sjÃĊlv mÃċste har öppnats för lÃĊsning. 138 00:06:45,690 --> 00:06:50,589 Vi kan inte lÃĊsa en karaktÃĊr frÃċn en fil pekare som vi öppnade för skrivning. 139 00:06:50,589 --> 00:06:52,630 SÃċ det ÃĊr en av de begrÃĊnsningar av fopen, eller hur? 140 00:06:52,630 --> 00:06:55,470 Vi mÃċste begrÃĊnsa oss endast utför 141 00:06:55,470 --> 00:06:57,710 en operation med en fil pekare. 142 00:06:57,710 --> 00:07:00,220 Om vi ​​ville lÃĊsa och skriva frÃċn samma fil, 143 00:07:00,220 --> 00:07:03,840 vi skulle ha öppet tvÃċ separata fil pekare till samma file-- 144 00:07:03,840 --> 00:07:05,670 ett för lÃĊsning, en för att skriva. 145 00:07:05,670 --> 00:07:08,400 >> SÃċ Ãċterigen, det enda skÃĊlet Jag tar upp det nu ÃĊr 146 00:07:08,400 --> 00:07:11,920 för om vi ska ringa till fgetc, den filen pekare mÃċste har 147 00:07:11,920 --> 00:07:14,172 öppnats för lÃĊsning. 148 00:07:14,172 --> 00:07:15,880 Och sedan ganska enkelt, allt vi behöver göra 149 00:07:15,880 --> 00:07:17,546 ÃĊr passera i namnet pÃċ filen pekaren. 150 00:07:17,546 --> 00:07:21,060 SÃċ röding lm lika fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> Det kommer att fÃċ oss nÃĊsta character-- 152 00:07:23,200 --> 00:07:25,575 eller Ãċterigen, om detta ÃĊr den första NÃĊr vi har gjort det hÃĊr samtalet, 153 00:07:25,575 --> 00:07:29,750 den första character-- oavsett fil pekas pÃċ av ptr1. 154 00:07:29,750 --> 00:07:32,210 Minns att det var fil 1 dot text. 155 00:07:32,210 --> 00:07:36,490 Det fÃċr det första tecknet i det och vi kommer att lagra det i variabeln ch. 156 00:07:36,490 --> 00:07:37,941 Ganska enkelt. 157 00:07:37,941 --> 00:07:40,190 SÃċ vi har bara tittat pÃċ tre funktioner och redan vi 158 00:07:40,190 --> 00:07:43,070 kan göra nÃċgot ganska snyggt. 159 00:07:43,070 --> 00:07:46,320 >> SÃċ om vi tar denna förmÃċga för att fÃċ ett tecken 160 00:07:46,320 --> 00:07:48,943 och vi slinga det-- sÃċ vi fortsÃĊtter att fÃċ tecken 161 00:07:48,943 --> 00:07:51,390 frÃċn en fil över och över och over-- nu vi 162 00:07:51,390 --> 00:07:54,500 kan lÃĊsa varenda karaktÃĊren av en fil. 163 00:07:54,500 --> 00:07:58,670 Och om vi trycker varje tecken omedelbart efter att vi lÃĊst det, 164 00:07:58,670 --> 00:08:01,960 Vi har nu lÃĊsa frÃċn en fil och tryckta innehÃċllet till skÃĊrmen. 165 00:08:01,960 --> 00:08:05,610 Vi har faktiskt sammanlÃĊnkade den filen pÃċ bildskÃĊrmen. 166 00:08:05,610 --> 00:08:09,670 Och det ÃĊr vad Linux kommandot cat gör. 167 00:08:09,670 --> 00:08:13,250 >> Om du skriver katt i filnamnet, det kommer att skriva ut hela innehÃċllet 168 00:08:13,250 --> 00:08:15,160 av filen i din terminalfönster. 169 00:08:15,160 --> 00:08:19,010 Och sÃċ denna lilla slinga hÃĊr, bara tre rader kod, 170 00:08:19,010 --> 00:08:23,270 men det effektivt duplicerar Linux kommandot cat. 171 00:08:23,270 --> 00:08:25,210 SÃċ hÃĊr syntaxen kanske ser lite konstigt, 172 00:08:25,210 --> 00:08:26,670 men hÃĊr ÃĊr vad som hÃĊnder hÃĊr. 173 00:08:26,670 --> 00:08:31,460 Medan ch lika fgetc, inte ptr lika med EOF-- det ÃĊr en hel munsbit, 174 00:08:31,460 --> 00:08:34,669 men lÃċt oss bryta ner det bara sÃċ det ÃĊr klart pÃċ syntax. 175 00:08:34,669 --> 00:08:37,169 Jag har konsoliderat det för tydlighets utrymme, 176 00:08:37,169 --> 00:08:39,049 ÃĊven om det ÃĊr lite syntaktiskt knepigt. 177 00:08:39,049 --> 00:08:41,194 >> SÃċ hÃĊr delen i grönt till höger nu, vad gör det? 178 00:08:41,194 --> 00:08:42,860 Tja, det ÃĊr bara vÃċr fgetc samtal, eller hur? 179 00:08:42,860 --> 00:08:44,530 Vi har sett det förut. 180 00:08:44,530 --> 00:08:49,500 Det ÃĊr fÃċ en tecken frÃċn filen. 181 00:08:49,500 --> 00:08:53,220 Sedan jÃĊmföra vi att karaktÃĊr mot EOF. 182 00:08:53,220 --> 00:08:57,470 EOF ÃĊr ett speciellt vÃĊrde som ÃĊr definieras i standarden io.h, vilket 183 00:08:57,470 --> 00:08:59,390 ÃĊr slutet pÃċ filen karaktÃĊr. 184 00:08:59,390 --> 00:09:03,450 SÃċ i princip vad som kommer att hÃĊnda ÃĊr denna slinga kommer att lÃĊsa ett tecken, 185 00:09:03,450 --> 00:09:07,445 jÃĊmföra det med EOF, den filslut karaktÃĊr. 186 00:09:07,445 --> 00:09:10,070 Om de inte stÃĊmmer överens, sÃċ vi har inte nÃċtt slutet av filen, 187 00:09:10,070 --> 00:09:11,490 Vi kommer att skriva tecknet ut. 188 00:09:11,490 --> 00:09:13,740 Sedan ska vi gÃċ tillbaka till slingans början igen. 189 00:09:13,740 --> 00:09:18,310 Vi fÃċr en karaktÃĊr, kontrollera mot EOF, skriva ut, och sÃċ vidare 190 00:09:18,310 --> 00:09:21,094 och sÃċ vidare och sÃċ vidare, looping igenom pÃċ det sÃĊttet 191 00:09:21,094 --> 00:09:22,760 tills vi har nÃċtt slutet av filen. 192 00:09:22,760 --> 00:09:24,593 Och sedan vid den tidpunkten, Vi kommer att ha tryckt 193 00:09:24,593 --> 00:09:26,210 ut hela innehÃċllet i filen. 194 00:09:26,210 --> 00:09:29,450 SÃċ Ãċterigen, har vi bara sett fopen, fclose och fgetc 195 00:09:29,450 --> 00:09:34,950 och redan kan vi duplicera en linux terminal kommando. 196 00:09:34,950 --> 00:09:38,850 >> Som jag sade i början, Vi hade fgetc och fputc, 197 00:09:38,850 --> 00:09:41,860 och fputc var följeslagare funktion av fgetc. 198 00:09:41,860 --> 00:09:44,880 Och sÃċ, som ni kanske förstÃċr, det ÃĊr skriv motsvarande. 199 00:09:44,880 --> 00:09:49,440 Det ger oss möjlighet att skriva en enstaka tecken till en fil. 200 00:09:49,440 --> 00:09:53,290 >> Återigen, det förbehÃċllet att, precis som det var med fgetc, filen 201 00:09:53,290 --> 00:09:56,660 att vi skriver till mÃċste har varit öppnat för att skriva eller lÃĊgga till. 202 00:09:56,660 --> 00:10:00,820 Om vi ​​försöker anvÃĊnda fputc pÃċ en fil att vi har öppnat för lÃĊsning, 203 00:10:00,820 --> 00:10:02,760 vi kommer att lida en bit av ett misstag. 204 00:10:02,760 --> 00:10:04,440 Men samtalet ÃĊr ganska enkel. 205 00:10:04,440 --> 00:10:08,000 fputc huvudstad En ptr2, alla det kommer att göra ÃĊr att det ÃĊr 206 00:10:08,000 --> 00:10:12,040 kommer att skriva brev i A i fil 2 dot 207 00:10:12,040 --> 00:10:14,760 text, som var namnet pÃċ den filen som vi öppnade och tilldelas 208 00:10:14,760 --> 00:10:17,280 pekaren till ptr2. 209 00:10:17,280 --> 00:10:20,430 SÃċ vi kommer att skriva ett kapital A till fil 2 dot text. 210 00:10:20,430 --> 00:10:24,592 Och vi kommer att skriva ett utropstecken peka pÃċ fil 3 dot 211 00:10:24,592 --> 00:10:27,330 text, som utpekas av ptr3. 212 00:10:27,330 --> 00:10:29,730 SÃċ Ãċterigen, ganska enkelt hÃĊr. 213 00:10:29,730 --> 00:10:32,727 >> Men nu kan vi göra en annan sak. 214 00:10:32,727 --> 00:10:34,560 Vi har detta exempel vi bara gÃċ över 215 00:10:34,560 --> 00:10:38,950 om att kunna replikera katten Linux kommando, den som skriver ut 216 00:10:38,950 --> 00:10:40,500 till skÃĊrmen. 217 00:10:40,500 --> 00:10:43,510 NÃċvÃĊl, nu nÃĊr vi har förmÃċgan att lÃĊsa tecken frÃċn filer 218 00:10:43,510 --> 00:10:46,590 och skriva tecken till filer, varför inte vi bara ersÃĊtta det 219 00:10:46,590 --> 00:10:50,720 ringa för att printf med en uppmaning till fputc. 220 00:10:50,720 --> 00:10:54,090 >> Och nu har vi dupliceras cp, en mycket grundlÃĊggande linux kommando 221 00:10:54,090 --> 00:10:59,100 att vi pratade om hur lÃĊnge sedan i linux kommandon videon. 222 00:10:59,100 --> 00:11:01,070 Vi har pÃċ ett effektivt sÃĊtt dupliceras denna rÃĊtt hÃĊr. 223 00:11:01,070 --> 00:11:04,790 Vi lÃĊser en karaktÃĊr och dÃċ ÃĊr vi skriftligen tecken till en annan fil. 224 00:11:04,790 --> 00:11:07,660 LÃĊsning frÃċn en fil, skriva till en annan, om och om igen 225 00:11:07,660 --> 00:11:11,350 och om igen tills vi hit EOF. 226 00:11:11,350 --> 00:11:14,250 Vi har kommit till slutet av fil vi försöker kopiera frÃċn. 227 00:11:14,250 --> 00:11:18,500 Och genom att vi har skrivit alla av karaktÃĊrerna mÃċste vi filen 228 00:11:18,500 --> 00:11:19,500 att vi skriver till. 229 00:11:19,500 --> 00:11:24,270 SÃċ det hÃĊr ÃĊr cp, kopiera kommandot Linux. 230 00:11:24,270 --> 00:11:26,550 >> Alldeles i början av den hÃĊr videon hade jag varning 231 00:11:26,550 --> 00:11:29,840 att vi skulle prata lite om pekare. 232 00:11:29,840 --> 00:11:32,480 HÃĊr ÃĊr sÃĊrskilt dÃĊr vi ÃĊr kommer att tala om pekare 233 00:11:32,480 --> 00:11:34,800 förutom till fil pekare. 234 00:11:34,800 --> 00:11:37,870 SÃċ hÃĊr funktionen ser lite skrÃĊmmande. 235 00:11:37,870 --> 00:11:39,120 Det har fÃċtt flera parametrar. 236 00:11:39,120 --> 00:11:40,430 Det ÃĊr mycket som hÃĊnder hÃĊr. 237 00:11:40,430 --> 00:11:42,760 Det finns en massa olika fÃĊrger och texter. 238 00:11:42,760 --> 00:11:47,100 Men egentligen, det ÃĊr bara generisk version av fgetc 239 00:11:47,100 --> 00:11:50,110 som tillÃċter oss att fÃċ nÃċgon mÃĊngd information. 240 00:11:50,110 --> 00:11:53,560 Det kan vara lite ineffektivt om vi ÃĊr fÃċ tecken ett i taget, 241 00:11:53,560 --> 00:11:55,770 iterera igenom filen ett tecken i taget. 242 00:11:55,770 --> 00:12:00,230 Skulle det inte vara trevligare att fÃċ 100 Ãċt gÃċngen eller 500 pÃċ en gÃċng? 243 00:12:00,230 --> 00:12:03,250 >> Tja, fread och dess följeslagare funktion fwrite, som vi kommer att prata om 244 00:12:03,250 --> 00:12:05,490 i en andra, tillÃċter oss att göra just detta. 245 00:12:05,490 --> 00:12:08,480 Vi kan lÃĊsa ett godtyckligt belopp av information frÃċn en fil 246 00:12:08,480 --> 00:12:10,290 och vi förvara den nÃċgonstans tillfÃĊlligt. 247 00:12:10,290 --> 00:12:12,980 I stÃĊllet för att kunna precis montera den i en enda variabel, 248 00:12:12,980 --> 00:12:15,790 Vi kanske behöver förvara den i en array. 249 00:12:15,790 --> 00:12:19,980 Och sÃċ, vi passerar i fyra argument att fread-- en pekare 250 00:12:19,980 --> 00:12:23,940 till den plats dÃĊr vi ÃĊr kommer att lagra information, 251 00:12:23,940 --> 00:12:29,180 hur stor varje informationsenhet kommer att bli, hur mÃċnga enheter av informations 252 00:12:29,180 --> 00:12:35,192 Vi vill att förvÃĊrva, och frÃċn vilken fil vi vill fÃċ dem. 253 00:12:35,192 --> 00:12:37,150 Illustreras förmodligen bÃĊst med ett exempel hÃĊr. 254 00:12:37,150 --> 00:12:41,640 SÃċ lÃċt oss sÃĊga att vi deklarerar en array av 10 heltal. 255 00:12:41,640 --> 00:12:45,080 Vi har just förklarat pÃċ stapla godtyckligt int arr 10. 256 00:12:45,080 --> 00:12:46,970 SÃċ det ÃĊr ganska enkelt. 257 00:12:46,970 --> 00:12:51,970 Nu vad vi gör men ÃĊr frecall ÃĊr vi lÃĊser storleken pÃċ int 258 00:12:51,970 --> 00:12:54,180 gÃċnger 10 byte med information. 259 00:12:54,180 --> 00:12:59,040 Storlek pÃċ int vara four-- det ÃĊr storleken pÃċ ett heltal i c. 260 00:12:59,040 --> 00:13:02,790 >> SÃċ vad vi gör ÃĊr att vi lÃĊser 40 byte till ett vÃĊrde av uppgifter 261 00:13:02,790 --> 00:13:05,850 frÃċn filen som utpekas av PTR. 262 00:13:05,850 --> 00:13:08,600 Och vi lagrar dem 40 bytes nÃċgonstans 263 00:13:08,600 --> 00:13:12,080 dÃĊr vi har avsatt 40 byte vÃĊrde av minne. 264 00:13:12,080 --> 00:13:15,970 Lyckligtvis har vi redan gjort det genom att förklara arr att array dÃĊr. 265 00:13:15,970 --> 00:13:19,770 Som har förmÃċga att innehav 10 fyra-byte enheter. 266 00:13:19,770 --> 00:13:22,860 SÃċ totalt, kan det hÃċlla 40 bytes vÃĊrde av information. 267 00:13:22,860 --> 00:13:26,540 Och vi nu lÃĊser 40 byte information frÃċn filen, 268 00:13:26,540 --> 00:13:30,330 och vi lagra den i arr. 269 00:13:30,330 --> 00:13:35,470 >> Minns frÃċn videon pÃċ pekare som namnet pÃċ en array, sÃċsom arr, 270 00:13:35,470 --> 00:13:38,370 ÃĊr egentligen bara en pekare till dess första elementet. 271 00:13:38,370 --> 00:13:43,680 SÃċ nÃĊr vi passerar i arr dÃĊr, vi ÃĊr i sjÃĊlva verket, som passerar i en pekare. 272 00:13:43,680 --> 00:13:46,120 >> PÃċ samma sÃĊtt kan vi göra this-- Vi gör inte nödvÃĊndigtvis 273 00:13:46,120 --> 00:13:51,200 mÃċste rÃĊdda vÃċr buffert pÃċ stacken. 274 00:13:51,200 --> 00:13:54,990 Vi kunde ocksÃċ dynamiskt allokera en buffert sÃċ hÃĊr, med hjÃĊlp av malloc. 275 00:13:54,990 --> 00:13:57,340 Kom ihÃċg att nÃĊr vi dynamiskt allokera minne, 276 00:13:57,340 --> 00:14:00,550 vi sparar det pÃċ hög, inte bunten. 277 00:14:00,550 --> 00:14:02,110 Men det ÃĊr fortfarande en buffert. 278 00:14:02,110 --> 00:14:06,810 >> Det fortfarande, i det hÃĊr fallet, ÃĊr hÃċlla 640 byte med information 279 00:14:06,810 --> 00:14:09,230 eftersom en dubbel tar upp Ãċtta byte. 280 00:14:09,230 --> 00:14:11,570 Och vi ber för 80 av dem. 281 00:14:11,570 --> 00:14:13,770 Vi vill ha utrymme att hÃċlla 80 dubbel. 282 00:14:13,770 --> 00:14:17,210 SÃċ 80 gÃċnger 8 ÃĊr 640 bytes information. 283 00:14:17,210 --> 00:14:21,880 Och denna uppmaning till fread ÃĊr samla 640 byte med information 284 00:14:21,880 --> 00:14:27,770 frÃċn filen som pekas pÃċ av PTR och lagra den nu arr2. 285 00:14:27,770 --> 00:14:32,770 >> Nu kan vi ocksÃċ behandla fread precis som ett samtal till fgetc. 286 00:14:32,770 --> 00:14:37,140 I det hÃĊr fallet, vi försöker bara fÃċ ett tecken frÃċn filen. 287 00:14:37,140 --> 00:14:40,070 Och vi behöver inte ett array för att hÃċlla ett tecken. 288 00:14:40,070 --> 00:14:43,170 Vi kan bara förvara den i en teckenvariabel. 289 00:14:43,170 --> 00:14:46,390 >> FÃċngsten ÃĊr dock att nÃĊr vi har bara en variabel, 290 00:14:46,390 --> 00:14:50,290 Vi behöver skicka i adressen till den variabel 291 00:14:50,290 --> 00:14:52,550 eftersom minns att första argumentet till fread 292 00:14:52,550 --> 00:14:59,210 ÃĊr en pekare till platsen och minne dÃĊr vi vill lagra informationen. 293 00:14:59,210 --> 00:15:01,550 Återigen, namnet pÃċ en matris ÃĊr en pekare. 294 00:15:01,550 --> 00:15:04,200 SÃċ vi behöver inte göra-tecken array. 295 00:15:04,200 --> 00:15:07,270 Men c, karaktÃĊren c hÃĊr ÃĊr inte en matris. 296 00:15:07,270 --> 00:15:08,390 Det ÃĊr bara en variabel. 297 00:15:08,390 --> 00:15:11,840 Och sÃċ vi behöver för att klara ett et-c för att indikera 298 00:15:11,840 --> 00:15:15,350 att det ÃĊr den adress dÃĊr vi vill att lagra denna en byte med information, 299 00:15:15,350 --> 00:15:20,479 detta ett tecken som vi samla frÃċn PTR. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- jag ska gÃċ igenom detta lite mer 301 00:15:22,270 --> 00:15:25,440 quickly-- ÃĊr ganska mycket exakt motsvarighet till fread 302 00:15:25,440 --> 00:15:27,720 förutom att det ÃĊr för att skriva istÃĊllet för att lÃĊsa, bara 303 00:15:27,720 --> 00:15:31,610 som other-- vi har haft öppna och nÃĊra, fÃċ en karaktÃĊr, 304 00:15:31,610 --> 00:15:32,530 skriva ett tecken. 305 00:15:32,530 --> 00:15:35,040 Nu ÃĊr det fÃċ godtycklig mÃĊngd information, 306 00:15:35,040 --> 00:15:37,170 rÃĊtt godtycklig mÃĊngd information. 307 00:15:37,170 --> 00:15:39,790 SÃċ precis som förut, vi kan har en matris med 10 heltal 308 00:15:39,790 --> 00:15:43,210 dÃĊr vi redan har information som lagras, kanske. 309 00:15:43,210 --> 00:15:46,580 >> Det var förmodligen nÃċgra rader kod som bör gÃċ mellan dessa tvÃċ 310 00:15:46,580 --> 00:15:49,990 dÃĊr jag fyller arr med nÃċgot meningsfullt. 311 00:15:49,990 --> 00:15:51,880 Jag fyller den med 10 olika heltal. 312 00:15:51,880 --> 00:15:54,920 Och i stÃĊllet, vad jag gör skriver frÃċn arr 313 00:15:54,920 --> 00:15:58,600 och samla in information frÃċn arr. 314 00:15:58,600 --> 00:16:02,390 Och jag tar denna information och sÃĊtta in den i filen. 315 00:16:02,390 --> 00:16:05,410 >> SÃċ i stÃĊllet för att det ÃĊr frÃċn filen till bufferten, 316 00:16:05,410 --> 00:16:08,790 vi nu gÃċr frÃċn bufferten till filen. 317 00:16:08,790 --> 00:16:10,580 SÃċ det ÃĊr bara det omvÃĊnda. 318 00:16:10,580 --> 00:16:16,680 SÃċ Ãċterigen, precis som tidigare, kan vi har ocksÃċ en heap bit av minne 319 00:16:16,680 --> 00:16:19,600 att vi har dynamiskt fördelas och lÃĊsa frÃċn den 320 00:16:19,600 --> 00:16:21,570 och skriver att till filen. 321 00:16:21,570 --> 00:16:24,900 >> Och vi har ocksÃċ en enda variabel förmÃċga att hÃċlla en bitgrupp 322 00:16:24,900 --> 00:16:27,200 av information, sÃċsom ett tecken. 323 00:16:27,200 --> 00:16:29,830 Men Ãċterigen, vi mÃċste passera adressen för den variabeln 324 00:16:29,830 --> 00:16:31,840 nÃĊr vi vill lÃĊsa frÃċn den. 325 00:16:31,840 --> 00:16:35,280 SÃċ vi kan skriva ner informationen Vi hittar pÃċ denna adress 326 00:16:35,280 --> 00:16:39,050 till filpekaren, PTR. 327 00:16:39,050 --> 00:16:41,630 >> Det finns massor av andra stor fil I / O-funktioner 328 00:16:41,630 --> 00:16:44,650 att göra olika saker förutom de vi har pratat om i dag. 329 00:16:44,650 --> 00:16:46,450 Ett par av dem du kan ha nytta av 330 00:16:46,450 --> 00:16:50,840 ÃĊr fgets och fputs, vilka ÃĊr ekvivalenta 331 00:16:50,840 --> 00:16:56,190 av fgetc och fputc men för lÃĊsning en enda strÃĊng frÃċn en fil. 332 00:16:56,190 --> 00:16:59,020 I stÃĊllet för ett enda tecken, Det kommer att lÃĊsa en hel strÃĊng. 333 00:16:59,020 --> 00:17:02,940 fprintf, som i princip gör det möjligt du kan anvÃĊnda printf att skriva till filen. 334 00:17:02,940 --> 00:17:05,619 SÃċ precis som du kan göra variabelsubstitution med hjÃĊlp av 335 00:17:05,619 --> 00:17:09,900 den platshÃċllarna procent i och procent d, och sÃċ vidare, med printf 336 00:17:09,900 --> 00:17:14,690 kan pÃċ liknande sÃĊtt ta printf strÃĊng och skriva ut nÃċgot 337 00:17:14,690 --> 00:17:16,800 sÃċ dÃĊr till en fil. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- om du har en DVD-spelare ÃĊr analogin jag brukar anvÃĊnda hÃĊr-- 339 00:17:20,720 --> 00:17:23,109 ÃĊr ungefÃĊr som att anvÃĊnda din spola tillbaka och snabbspola framÃċt 340 00:17:23,109 --> 00:17:25,819 knapparna för att flytta runt pÃċ filmen. 341 00:17:25,819 --> 00:17:28,369 PÃċ samma sÃĊtt kan du flytta runt filen. 342 00:17:28,369 --> 00:17:30,250 En av de saker inuti att filstrukturen 343 00:17:30,250 --> 00:17:34,270 att c skapar för dig ÃĊr en indikator av var du befinner dig i filen. 344 00:17:34,270 --> 00:17:36,420 Är du pÃċ mycket början, vid byte noll? 345 00:17:36,420 --> 00:17:39,290 Är du pÃċ byte 100, byte 1000, och sÃċ vidare? 346 00:17:39,290 --> 00:17:44,340 Du kan anvÃĊnda fseek godtyckligt flytta denna indikator framÃċt eller bakÃċt. 347 00:17:44,340 --> 00:17:46,744 >> Och ftell, Ãċterigen liknar en DVD-spelare, 348 00:17:46,744 --> 00:17:49,660 ÃĊr som en liten klocka som berÃĊttar hur mÃċnga minuter och sekunder dig 349 00:17:49,660 --> 00:17:52,480 ÃĊr i en viss film. 350 00:17:52,480 --> 00:17:56,990 PÃċ liknande sÃĊtt, berÃĊttar ftell hur mÃċnga bytes du ÃĊr i filen. 351 00:17:56,990 --> 00:18:00,210 feof ÃĊr en annan version detektera om du har 352 00:18:00,210 --> 00:18:01,700 nÃċtt slutet av filen. 353 00:18:01,700 --> 00:18:03,600 Och ferror ÃĊr en funktion som du kan anvÃĊnda 354 00:18:03,600 --> 00:18:06,959 att upptÃĊcka om nÃċgot har gÃċtt fel arbetsdag med en fil. 355 00:18:06,959 --> 00:18:08,750 Återigen, detta ÃĊr bara skrapa pÃċ ytan. 356 00:18:08,750 --> 00:18:12,730 Det finns fortfarande mycket mer fil-I / O funktioner i standard io.h. 357 00:18:12,730 --> 00:18:16,620 Men det kommer förmodligen att fÃċ dig började arbeta med fil pekare. 358 00:18:16,620 --> 00:18:17,640 Jag ÃĊr Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Detta ÃĊr CS50. 360 00:18:19,750 --> 00:18:21,669