1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> ALTAVEU: Fins al moment, el més probable que la majoria dels seus programes 3 00:00:07,870 --> 00:00:10,170 han estat una mica efímer. 4 00:00:10,170 --> 00:00:13,310 Executar un programa com Mario o cobdiciós. 5 00:00:13,310 --> 00:00:17,350 Ho fa alguna cosa, potser li demana l'usuari alguna informació, 6 00:00:17,350 --> 00:00:20,400 imprimir alguna sortida a la pantalla, però després quan el programa ha acabat, 7 00:00:20,400 --> 00:00:23,252 no hi ha realment cap evidència existeix Alguna vegada s'ha executat en el primer lloc. 8 00:00:23,252 --> 00:00:25,960 Vull dir, és clar, que podria haver deixat s'obre a la finestra de terminal, 9 00:00:25,960 --> 00:00:29,770 però si s'esborra la pantalla, hi ha Realment no hi ha evidència que va existir. 10 00:00:29,770 --> 00:00:33,720 No tenim un mitjà d'emmagatzematge informació persistent, la informació 11 00:00:33,720 --> 00:00:36,890 que hi ha després de la nostra programa ha deixat de funcionar, 12 00:00:36,890 --> 00:00:39,241 o nosaltres no tenim fins a aquest punt. 13 00:00:39,241 --> 00:00:41,490 Afortunadament, però, fa c ens proporcionen la capacitat 14 00:00:41,490 --> 00:00:44,220 per fer-ho mitjançant la implementació cosa que es diu 15 00:00:44,220 --> 00:00:48,330 un arxiu, una estructura que bàsicament representa un arxiu que vols duplicar 16 00:00:48,330 --> 00:00:53,826 feu clic en l'equip, si estàs utilitzat per a un entorn gràfic d'usuari. 17 00:00:53,826 --> 00:00:55,700 Generalment quan es treballa amb c, en realitat estem 18 00:00:55,700 --> 00:00:59,965 va a estar treballant amb punters a archivos-- arxiu stars-- 19 00:00:59,965 --> 00:01:02,090 a excepció d'una mica quan parlem d'un parell 20 00:01:02,090 --> 00:01:04,560 de les funcions que treballar amb punters d'arxius. 21 00:01:04,560 --> 00:01:08,990 No ha de realment han cavat massa profund en la comprensió dels punters 22 00:01:08,990 --> 00:01:09,730 si mateixos. 23 00:01:09,730 --> 00:01:12,870 Hi ha una mica de petitíssima on parlarem d'ells, 24 00:01:12,870 --> 00:01:18,090 però generalment presentar punters i punters, mentre que estan relacionats entre si, 25 00:01:18,090 --> 00:01:20,290 no són exactament el mateix. 26 00:01:20,290 --> 00:01:22,440 >> Ara, què vull dir quan Dic dades persistents? 27 00:01:22,440 --> 00:01:23,650 Què són les dades persistents? 28 00:01:23,650 --> 00:01:25,232 Per què ens importa això? 29 00:01:25,232 --> 00:01:27,190 Dir, per exemple, que s'està executant un programa de 30 00:01:27,190 --> 00:01:29,850 o que hagi reescrit 1 programa que és un joc, 31 00:01:29,850 --> 00:01:32,960 i vol fer un seguiment de tots els moviments de l'usuari 32 00:01:32,960 --> 00:01:36,620 de manera que potser si alguna cosa surt malament, pot revisar l'arxiu després del partit. 33 00:01:36,620 --> 00:01:39,970 Això és el que volem dir quan parlar de dades persistents. 34 00:01:39,970 --> 00:01:43,930 >> En el curs de l'execució del seu programa, es crea un arxiu. 35 00:01:43,930 --> 00:01:45,680 I quan el seu programa ha deixat de funcionar, 36 00:01:45,680 --> 00:01:48,689 aquest arxiu encara existeix en el sistema. 37 00:01:48,689 --> 00:01:50,230 I podem veure-ho i examinar-lo. 38 00:01:50,230 --> 00:01:53,670 I perquè el programa s'estableix en han creat algunes dades persistents, 39 00:01:53,670 --> 00:01:57,390 existeixen dades després del programa ha acabat de executar-se. 40 00:01:57,390 --> 00:02:02,320 >> Ara totes aquestes funcions que treballen amb la creació d'arxius i la manipulació 41 00:02:02,320 --> 00:02:04,940 de diverses formes viure en io.h estàndard, 42 00:02:04,940 --> 00:02:08,210 que és un arxiu de capçalera que probablement has estat lliures 43 00:02:08,210 --> 00:02:10,910 incloent en la part superior de prou molt tots els teus programes 44 00:02:10,910 --> 00:02:14,130 perquè conté una de les la majoria de funcions útils per a nosaltres, 45 00:02:14,130 --> 00:02:16,130 printf, que també permet viu en io.h. estàndard 46 00:02:16,130 --> 00:02:20,400 Així que vostè no ha de colpejar inclou els fitxers, probablement, 47 00:02:20,400 --> 00:02:23,540 per tal de treballar amb els punters d'arxius. 48 00:02:23,540 --> 00:02:29,980 >> Ara, cada funció de punter sol arxiu, o d'E / S, la sortida d'entrada cada arxiu que he 49 00:02:29,980 --> 00:02:33,310 funció, accepta com un dels seus paràmetres o entrades 50 00:02:33,310 --> 00:02:35,822 1 pointer-- arxiu excepte per un, fopen, que 51 00:02:35,822 --> 00:02:38,280 és el que s'utilitza per a descarregar el fitxer punter en el primer lloc. 52 00:02:38,280 --> 00:02:41,010 Però després d'haver obert la arxiva i s'obté apuntadors d'arxiu, 53 00:02:41,010 --> 00:02:43,510 a continuació, pot passar a ells com arguments a les diverses funcions 54 00:02:43,510 --> 00:02:46,720 anem a parlar sobre Avui en dia, així com molts altres 55 00:02:46,720 --> 00:02:48,520 perquè pugui treballar amb arxius. 56 00:02:48,520 --> 00:02:50,980 >> Així que hi ha sis bonica els bàsics comuns 57 00:02:50,980 --> 00:02:52,870 que parlarem avui. 58 00:02:52,870 --> 00:02:57,160 fopen i la seva companya funció fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 i la seva funció company fputc, i fread i la seva funció company, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Així que tindrem dret. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- què fa? 63 00:03:07,050 --> 00:03:10,050 Bé, s'obre un arxiu i li dóna un apuntador d'arxiu a la mateixa, 64 00:03:10,050 --> 00:03:14,000 de manera que vostè pot utilitzar aquest presentar punter com a argument 65 00:03:14,000 --> 00:03:16,730 a qualsevol de les altres funcions d'E / S d'arxius. 66 00:03:16,730 --> 00:03:19,100 El més important per recordar amb fopen 67 00:03:19,100 --> 00:03:24,222 és que després d'haver obert la presentar o fet una crida com el que aquí, 68 00:03:24,222 --> 00:03:26,930 cal comprovar per assegurar- que el punter que vas tornar 69 00:03:26,930 --> 00:03:28,320 no és igual a null. 70 00:03:28,320 --> 00:03:31,320 Si no has vist el vídeo en punters, això podria no tenir sentit. 71 00:03:31,320 --> 00:03:35,639 Però si vostè tracta d'eliminar la referència un retir de punter nul, 72 00:03:35,639 --> 00:03:38,180 el seu programa probablement patiran una segmentació [inaudible]. 73 00:03:38,180 --> 00:03:40,540 Volem assegurar-nos que ens van donar una volta punter legítim. 74 00:03:40,540 --> 00:03:43,665 La gran majoria de les vegades ho farem han aconseguit un punter legítima volta 75 00:03:43,665 --> 00:03:45,280 i no serà un problema. 76 00:03:45,280 --> 00:03:46,760 >> Llavors, com fem una crida a fopen? 77 00:03:46,760 --> 00:03:48,051 Es veu molt semblant a això. 78 00:03:48,051 --> 00:03:52,690 Estrella Arxiu ptr-- ptr és un genèric nom de fitxer pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 i es passa a dues coses, un nom de fitxer i una operació que volem dur a terme. 80 00:03:57,300 --> 00:04:01,690 Així que pot ser que tinguem una trucada que s'assembla a esto-- ptr estrella arxiu 1 és igual a fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 I l'operació que he triat és r. 83 00:04:07,020 --> 00:04:08,639 >> Llavors, què creu vostè que r és aquí? 84 00:04:08,639 --> 00:04:11,180 Quins són els tipus de coses que podria ser capaç de fer als arxius? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Així que r és l'operació que ens triar quan volem llegir un arxiu. 87 00:04:17,500 --> 00:04:20,260 Així que, bàsicament, quan fem una crida com aquesta 88 00:04:20,260 --> 00:04:25,440 estar rebent nosaltres un apuntador d'arxiu de tal manera que poguéssim després llegir la informació 89 00:04:25,440 --> 00:04:27,770 des file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> De la mateixa manera, podríem obrir el fitxer 2.txt per escriure i perquè puguem passar ptr2, 91 00:04:34,190 --> 00:04:38,210 el punter de l'arxiu que he creat aquí, com a argument per a qualsevol funció que 92 00:04:38,210 --> 00:04:40,080 escriu informació en un arxiu. 93 00:04:40,080 --> 00:04:43,767 I igual que l'escriptura, hi ha També l'opció d'annexar, a. 94 00:04:43,767 --> 00:04:45,600 La diferència entre escriptura i afegint 95 00:04:45,600 --> 00:04:50,920 és que quan s'escriu en un arxiu, si vostè fa una crida a fopen per a l'escriptura 96 00:04:50,920 --> 00:04:54,761 i ja hi ha aquest arxiu, que és va a sobreescriure l'arxiu complet. 97 00:04:54,761 --> 00:04:56,510 Això va a començar des del principi, 98 00:04:56,510 --> 00:04:58,820 esborrant tota la informació això és ja allà. 99 00:04:58,820 --> 00:05:02,210 >> Mentre que si l'obres per annexar, anirà a la final de l'arxiu 100 00:05:02,210 --> 00:05:04,340 si ja hi ha text en o la informació en ell, 101 00:05:04,340 --> 00:05:06,040 i continuació, s'iniciarà escriure des d'allà. 102 00:05:06,040 --> 00:05:08,570 Així que vostè no perdrà cap dels la informació que has fet abans. 103 00:05:08,570 --> 00:05:12,110 Tant si voleu escriure o annexar tipus de depèn de la situació. 104 00:05:12,110 --> 00:05:16,840 Però vostè probablement sap el que el el funcionament adequat és quan arribi el moment. 105 00:05:16,840 --> 00:05:18,020 Així que això és fopen. 106 00:05:18,020 --> 00:05:18,930 >> Què passa amb fclose? 107 00:05:18,930 --> 00:05:21,600 Bé, bastant simple, fclose Només accepta el punter d'arxiu. 108 00:05:21,600 --> 00:05:24,000 I com era d'esperar, que tanqui aquest arxiu. 109 00:05:24,000 --> 00:05:29,270 I una vegada que hem tancat un arxiu, no podem realitzar més funcions d'arxiu d'E / S, 110 00:05:29,270 --> 00:05:31,420 llegir o escriure, en aquest arxiu. 111 00:05:31,420 --> 00:05:36,444 Hem de tornar a obrir la presentar una altra vegada per tal 112 00:05:36,444 --> 00:05:38,610 seguir treballant amb usant les funcions d'E / S. 113 00:05:38,610 --> 00:05:41,520 Mitjans Així fclose hem acabat treballar amb aquest arxiu. 114 00:05:41,520 --> 00:05:44,690 I tot el que necessitem per passar a és el nom d'un apuntador d'arxiu. 115 00:05:44,690 --> 00:05:50,010 Així que en un parell fa llisca, ens fopened arxiu de text 1 punt per a la lectura 116 00:05:50,010 --> 00:05:52,854 i assignem que presentar punter a ptr1. 117 00:05:52,854 --> 00:05:55,020 Ara hem decidit que estem fet la lectura d'aquest arxiu. 118 00:05:55,020 --> 00:05:56,561 Nosaltres no hem de fer res més amb ella. 119 00:05:56,561 --> 00:05:58,890 Podem ptr1 simplement fclose. 120 00:05:58,890 --> 00:06:01,950 I de manera similar, que podria fclose els altres. 121 00:06:01,950 --> 00:06:02,450 Tot bé. 122 00:06:02,450 --> 00:06:03,700 Així que ha d'obrir i tancar. 123 00:06:03,700 --> 00:06:05,780 Aquests són els dos bàsica iniciar operacions. 124 00:06:05,780 --> 00:06:08,050 >> Ara volem realitat fer algunes coses interessants, 125 00:06:08,050 --> 00:06:11,940 i la primera funció que anem a veure que va a fer és fgetc-- 126 00:06:11,940 --> 00:06:14,110 presentar obtenir un caràcter. 127 00:06:14,110 --> 00:06:17,350 Això és el que fgetc general es traduiria en. 128 00:06:17,350 --> 00:06:20,190 El seu objectiu en la vida és llegir el següent caràcter, 129 00:06:20,190 --> 00:06:22,079 o si aquest és el seu molt primera crida a fgetc 130 00:06:22,079 --> 00:06:23,870 per a un arxiu en particular, el primer caràcter. 131 00:06:23,870 --> 00:06:26,210 Però llavors després d'això, s'obté la següent, 132 00:06:26,210 --> 00:06:31,500 el següent caràcter d'aquest arxiu, i l'emmagatzema en una variable de caràcter. 133 00:06:31,500 --> 00:06:34,490 Com ho hem fet aquí, char ch equival fgetc, 134 00:06:34,490 --> 00:06:36,389 Va esdevenir en el nom d'un apuntador d'arxiu. 135 00:06:36,389 --> 00:06:38,180 Un cop més, és molt important aquí recordar 136 00:06:38,180 --> 00:06:41,430 que per tal de tenir aquesta operació tingui èxit, 137 00:06:41,430 --> 00:06:45,690 el punter del propi arxiu haver d'haver ha obert per lectura. 138 00:06:45,690 --> 00:06:50,589 No podem llegir un personatge d'un arxiu punter que vam obrir per a l'escriptura. 139 00:06:50,589 --> 00:06:52,630 Així que aquesta és una de les limitacions de fopen, oi? 140 00:06:52,630 --> 00:06:55,470 Hem de restringir nosaltres mateixos només per fer 141 00:06:55,470 --> 00:06:57,710 una operació amb un punter d'arxiu. 142 00:06:57,710 --> 00:07:00,220 Si volguéssim llegir i escriure des del mateix arxiu, 143 00:07:00,220 --> 00:07:03,840 tindríem obert sengles apuntadors d'arxiu a la mateixa file-- 144 00:07:03,840 --> 00:07:05,670 un per a la lectura, un per a l'escriptura. 145 00:07:05,670 --> 00:07:08,400 >> Així que de nou, l'única raó Porto que fins ara és 146 00:07:08,400 --> 00:07:11,920 perquè si anem a fer una trucada a fgetc, que deu haver apuntador d'arxiu 147 00:07:11,920 --> 00:07:14,172 ha obert per lectura. 148 00:07:14,172 --> 00:07:15,880 I llavors bastant simple, tot el que necessitem fer 149 00:07:15,880 --> 00:07:17,546 és passar en el nom del fitxer apuntat. 150 00:07:17,546 --> 00:07:21,060 Així char ch equival ptr1 fgetc. 151 00:07:21,060 --> 00:07:23,200 >> Això va a treure'ns la següent character-- 152 00:07:23,200 --> 00:07:25,575 o de nou, si aquest és el primer el temps que hem fet aquesta crida, 153 00:07:25,575 --> 00:07:29,750 la primera character-- de qualsevol arxiu està apuntat per ptr1. 154 00:07:29,750 --> 00:07:32,210 Recordem que aquest era l'arxiu de text 1 punt. 155 00:07:32,210 --> 00:07:36,490 Va a arribar el primer caràcter d'aquesta i nosaltres l'emmagatzemem a la ch variable. 156 00:07:36,490 --> 00:07:37,941 Bastant senzill. 157 00:07:37,941 --> 00:07:40,190 Així que només hem vist a les tres funcions i ja tenim 158 00:07:40,190 --> 00:07:43,070 pot fer alguna cosa amb bona pinta. 159 00:07:43,070 --> 00:07:46,320 >> Així que si tenim aquesta capacitat d'aconseguir un personatge 160 00:07:46,320 --> 00:07:48,943 i bucle it-- així que continuar rebent caràcters 161 00:07:48,943 --> 00:07:51,390 des d'un arxiu d'una i 1 i over-- ara 162 00:07:51,390 --> 00:07:54,500 pot llegir cada caràcter d'un arxiu. 163 00:07:54,500 --> 00:07:58,670 I si imprimim tots els personatges immediatament després de la llegim, 164 00:07:58,670 --> 00:08:01,960 ara hem llegit d'un arxiu i impresa seu contingut a la pantalla. 165 00:08:01,960 --> 00:08:05,610 Hem concatenats amb eficàcia aquest arxiu a la pantalla. 166 00:08:05,610 --> 00:08:09,670 I això és el que el Linux comanda cat fa. 167 00:08:09,670 --> 00:08:13,250 >> Si escriu gat al nom d'arxiu, imprimirà tot el contingut 168 00:08:13,250 --> 00:08:15,160 de l'arxiu a la finestra del terminal. 169 00:08:15,160 --> 00:08:19,010 I així, aquest petit bucle d'aquí, només tres línies de codi, 170 00:08:19,010 --> 00:08:23,270 però duplica efectivament el gat de comandaments de Linux. 171 00:08:23,270 --> 00:08:25,210 Així que aquesta sintaxi podria mirar una mica estrany, 172 00:08:25,210 --> 00:08:26,670 però això és el que està passant aquí. 173 00:08:26,670 --> 00:08:31,460 Mentre ch equival fgetc, ptr no és igual a EOF-- és tot un mos, 174 00:08:31,460 --> 00:08:34,669 però anem a trencar just pel que és clar en la sintaxi. 175 00:08:34,669 --> 00:08:37,169 He consolidar pel bé d'espai, 176 00:08:37,169 --> 00:08:39,049 encara que és una mica sintàcticament complicat. 177 00:08:39,049 --> 00:08:41,194 >> Així que aquesta part de la dreta verda ara, què està fent? 178 00:08:41,194 --> 00:08:42,860 Bé, això és només la nostra crida fgetc, oi? 179 00:08:42,860 --> 00:08:44,530 Hem vist això abans. 180 00:08:44,530 --> 00:08:49,500 És l'obtenció d'un caràcter de l'arxiu. 181 00:08:49,500 --> 00:08:53,220 Després comparem que caràcter contra EOF. 182 00:08:53,220 --> 00:08:57,470 EOF és un valor especial que és es defineix en io.h estàndard, que 183 00:08:57,470 --> 00:08:59,390 és el caràcter de fi d'arxiu. 184 00:08:59,390 --> 00:09:03,450 Així que bàsicament el que passarà aquest bucle es llegirà un personatge, 185 00:09:03,450 --> 00:09:07,445 comparar-lo amb EF, el caràcter de fi d'arxiu. 186 00:09:07,445 --> 00:09:10,070 Si no coincideixen, de manera que no tenim arribat al final del fitxer, 187 00:09:10,070 --> 00:09:11,490 anem a publicar aquell caràcter a terme. 188 00:09:11,490 --> 00:09:13,740 Llavors anirem de nou a la principi del bucle de nou. 189 00:09:13,740 --> 00:09:18,310 Anem a arribar a un personatge, comprovem contra EOF, imprimir-lo, etc. 190 00:09:18,310 --> 00:09:21,094 i així successivament i així successivament, bucle a través d'aquesta manera 191 00:09:21,094 --> 00:09:22,760 fins que hem arribat al final del fitxer. 192 00:09:22,760 --> 00:09:24,593 I llavors en aquest moment, haurem impresa 193 00:09:24,593 --> 00:09:26,210 a terme la totalitat del contingut de l'arxiu. 194 00:09:26,210 --> 00:09:29,450 Així que de nou, només hem vist fopen, fclose i fgetc 195 00:09:29,450 --> 00:09:34,950 i ja podem duplicar una ordre de terminal de Linux. 196 00:09:34,950 --> 00:09:38,850 >> Com he dit al principi, vam tenir fgetc i fputc, 197 00:09:38,850 --> 00:09:41,860 i fputc era el company funció de fgetc. 198 00:09:41,860 --> 00:09:44,880 I així, com es pot imaginar, és l'escriptura equivalent. 199 00:09:44,880 --> 00:09:49,440 Se'ns permet escriure una sol caràcter en un arxiu. 200 00:09:49,440 --> 00:09:53,290 >> Un cop més, sent l'excepció, just com ho va ser amb fgetc, l'arxiu 201 00:09:53,290 --> 00:09:56,660 que estem escrivint a ha d'haver estat obert per a escriure o per annexar. 202 00:09:56,660 --> 00:10:00,820 Si tractem i utilitzem fputc en un arxiu que hem obert per a la lectura, 203 00:10:00,820 --> 00:10:02,760 patirem una mica d'un error. 204 00:10:02,760 --> 00:10:04,440 Però la trucada és bastant simple. 205 00:10:04,440 --> 00:10:08,000 el capital fputc Un ptr2, tot que va a fer és que és 206 00:10:08,000 --> 00:10:12,040 va a escriure la carta a A en un arxiu de 2 punts 207 00:10:12,040 --> 00:10:14,760 text, que era el nom de la arxiu que vam obrir i assignem 208 00:10:14,760 --> 00:10:17,280 el punter a PTR2. 209 00:10:17,280 --> 00:10:20,430 Així que anem a escriure una A majúscula a l'arxiu de text 2 punts. 210 00:10:20,430 --> 00:10:24,592 I anem a escriure una exclamació apuntar a presentar 3 punts 211 00:10:24,592 --> 00:10:27,330 text, que va ser apuntat per ptr3. 212 00:10:27,330 --> 00:10:29,730 Així que de nou, bastant senzill aquí. 213 00:10:29,730 --> 00:10:32,727 >> Però ara podem fer una altra cosa. 214 00:10:32,727 --> 00:10:34,560 Tenim aquest exemple només ens anàvem més 215 00:10:34,560 --> 00:10:38,950 sobre ser capaç de replicar el gat Comandaments de Linux, la qual imprimeix 216 00:10:38,950 --> 00:10:40,500 a la pantalla. 217 00:10:40,500 --> 00:10:43,510 Bé, ara que tenim la capacitat llegir caràcters de fitxers 218 00:10:43,510 --> 00:10:46,590 i escriure caràcters en arxius, ¿Per què no simplement substituïm que 219 00:10:46,590 --> 00:10:50,720 trucar a printf amb una crida a fputc. 220 00:10:50,720 --> 00:10:54,090 >> I ara que hem dupliquem cp, una ordre molt bàsic Linux 221 00:10:54,090 --> 00:10:59,100 que hem parlat llarg camí Fa al Linux comandes vídeo. 222 00:10:59,100 --> 00:11:01,070 Tenim efectivament duplicat que aquí. 223 00:11:01,070 --> 00:11:04,790 Estem llegint un personatge i després estem escriure aquest personatge a un altre arxiu. 224 00:11:04,790 --> 00:11:07,660 La lectura d'un arxiu, l'escriptura a un altre, una i altra 225 00:11:07,660 --> 00:11:11,350 i una altra fins que colpegem EOF. 226 00:11:11,350 --> 00:11:14,250 Tenim fins al final de la presentar estem tractant de copiar. 227 00:11:14,250 --> 00:11:18,500 I amb això haurem escrit tot dels personatges necessitem l'arxiu 228 00:11:18,500 --> 00:11:19,500 que estem escrivint a. 229 00:11:19,500 --> 00:11:24,270 Així que això és cp, la comanda de còpia de Linux. 230 00:11:24,270 --> 00:11:26,550 >> En el començament de aquest vídeo, jo tenia l'advertència 231 00:11:26,550 --> 00:11:29,840 que anàvem a parlar una poc sobre els punters. 232 00:11:29,840 --> 00:11:32,480 Aquí està específicament on som parlarem de punters 233 00:11:32,480 --> 00:11:34,800 a més de presentar punters. 234 00:11:34,800 --> 00:11:37,870 Així que aquesta funció es veu una mica de por. 235 00:11:37,870 --> 00:11:39,120 Té diversos paràmetres. 236 00:11:39,120 --> 00:11:40,430 Hi ha molt per fer aquí. 237 00:11:40,430 --> 00:11:42,760 Hi ha un munt de diferents colors i textos. 238 00:11:42,760 --> 00:11:47,100 Però, en realitat, és només el versió genèrica de fgetc 239 00:11:47,100 --> 00:11:50,110 que ens permet obtenir qualsevol quantitat d'informació. 240 00:11:50,110 --> 00:11:53,560 Pot ser una mica ineficient si som obtenir caràcters d'un en un, 241 00:11:53,560 --> 00:11:55,770 iteració a través de l'arxiu un caràcter alhora. 242 00:11:55,770 --> 00:12:00,230 ¿No seria millor per aconseguir 100 a la vegada o 500 a la vegada? 243 00:12:00,230 --> 00:12:03,250 >> Bé, fread i la seva funció company fwrite, el que anem a parlar de 244 00:12:03,250 --> 00:12:05,490 en un segon, ens permeten fer precisament això. 245 00:12:05,490 --> 00:12:08,480 Podem llegir una quantitat arbitrària d'informació d'un arxiu 246 00:12:08,480 --> 00:12:10,290 i el emmagatzemem en algun lloc temporalment. 247 00:12:10,290 --> 00:12:12,980 En lloc de ser capaç de simplement encaixar en una sola variable, 248 00:12:12,980 --> 00:12:15,790 que podríem necessitar per emmagatzemar-lo en una matriu. 249 00:12:15,790 --> 00:12:19,980 Així, es passa de cada quatre arguments per fread-- un punter 250 00:12:19,980 --> 00:12:23,940 a la ubicació on som va a emmagatzemar la informació, 251 00:12:23,940 --> 00:12:29,180 el gran que cada unitat d'informació serà, quantes unitats d'informació 252 00:12:29,180 --> 00:12:35,192 volem adquirir, i des quin arxiu volem aconseguir-los. 253 00:12:35,192 --> 00:12:37,150 Probablement el millor il·lustrat amb un exemple aquí. 254 00:12:37,150 --> 00:12:41,640 Així que diguem que declarem un arranjament de 10 punts. 255 00:12:41,640 --> 00:12:45,080 Ens hem declarat en la apilar arbitràriament int arr 10. 256 00:12:45,080 --> 00:12:46,970 Així que això és bastant senzill. 257 00:12:46,970 --> 00:12:51,970 Ara el que estem fent, encara que és el frecall és que estem mida de int llegint 258 00:12:51,970 --> 00:12:54,180 temps de 10 bytes d'informació. 259 00:12:54,180 --> 00:12:59,040 Mida de int ser four-- això és la mida d'un nombre enter al c. 260 00:12:59,040 --> 00:13:02,790 >> Així que el que estem fent és que estem llegint 40 bytes per valor de la informació 261 00:13:02,790 --> 00:13:05,850 des de l'arxiu apuntat per ptr. 262 00:13:05,850 --> 00:13:08,600 I estem emmagatzemant els 40 bytes en algun lloc 263 00:13:08,600 --> 00:13:12,080 on hem reservat 40 bytes per valor de la memòria. 264 00:13:12,080 --> 00:13:15,970 Afortunadament, ja hem fet això per declarant arr, aquesta matriu allà mateix. 265 00:13:15,970 --> 00:13:19,770 Això és capaç de mantenir 10 unitats de quatre bytes. 266 00:13:19,770 --> 00:13:22,860 Així que en total, que pot contenir 40 bytes valor de la informació. 267 00:13:22,860 --> 00:13:26,540 I ara estem llegint 40 bytes de la informació de l'arxiu, 268 00:13:26,540 --> 00:13:30,330 i estem emmagatzemar-lo en arr. 269 00:13:30,330 --> 00:13:35,470 >> Recordem el vídeo en punters que el nom d'una matriu, com arr, 270 00:13:35,470 --> 00:13:38,370 és en realitat un punter al seu primer element. 271 00:13:38,370 --> 00:13:43,680 Així que quan vam passar a arr allà, són, de fet, passant en un punter. 272 00:13:43,680 --> 00:13:46,120 >> De la mateixa manera que podem fer esto-- No necessàriament 273 00:13:46,120 --> 00:13:51,200 haurà de guardar el nostre buffer a la pila. 274 00:13:51,200 --> 00:13:54,990 També podríem assignar dinàmicament un tampó com aquest, usant malloc. 275 00:13:54,990 --> 00:13:57,340 Recordeu, quan assignar dinàmicament memòria, 276 00:13:57,340 --> 00:14:00,550 estem estalviant en el munt, no la pila. 277 00:14:00,550 --> 00:14:02,110 Però segueix sent un memòria intermèdia. 278 00:14:02,110 --> 00:14:06,810 >> Encara, en aquest cas, és la celebració de 640 bytes d'informació 279 00:14:06,810 --> 00:14:09,230 perquè una doble presa fins a vuit bytes. 280 00:14:09,230 --> 00:14:11,570 I estem demanant 80 d'ells. 281 00:14:11,570 --> 00:14:13,770 Volem tenir espai per celebrar 80 dobles. 282 00:14:13,770 --> 00:14:17,210 Així que 80 vegades 8 és informació de 640 bytes. 283 00:14:17,210 --> 00:14:21,880 I aquesta crida a fread és recollida de 640 bytes d'informació 284 00:14:21,880 --> 00:14:27,770 des de l'arxiu apuntat per ptr i emmagatzemar ara en ARR2. 285 00:14:27,770 --> 00:14:32,770 >> Ara també podem tractar fread igual que una crida a fgetc. 286 00:14:32,770 --> 00:14:37,140 En aquest cas, només estem tractant de tenir un caràcter de l'arxiu. 287 00:14:37,140 --> 00:14:40,070 I no necessitem un matriu per sostenir un personatge. 288 00:14:40,070 --> 00:14:43,170 Només podem emmagatzemar-la en una variable de caràcter. 289 00:14:43,170 --> 00:14:46,390 >> La captura, però, és que quan només tenim una variable, 290 00:14:46,390 --> 00:14:50,290 hem de passar al direcció d'aquesta variable 291 00:14:50,290 --> 00:14:52,550 perquè recordo que el primer argument de fread 292 00:14:52,550 --> 00:14:59,210 és un punter a la ubicació i la memòria on volem emmagatzemar la informació. 293 00:14:59,210 --> 00:15:01,550 Un cop més, el nom d'una array és un punter. 294 00:15:01,550 --> 00:15:04,200 Així que no hem de fer arsenal signe. 295 00:15:04,200 --> 00:15:07,270 Però c, el caràcter c aquí, no és una matriu. 296 00:15:07,270 --> 00:15:08,390 És només una variable. 297 00:15:08,390 --> 00:15:11,840 I així hem de passar un c ampersand per indicar 298 00:15:11,840 --> 00:15:15,350 que aquesta és la direcció en la qual volem per emmagatzemar aquest un byte d'informació, 299 00:15:15,350 --> 00:15:20,479 aquest caràcter que estem recollint el ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- vaig a anar a través això una mica més 301 00:15:22,270 --> 00:15:25,440 quickly-- és més o menys la equivalent exacte de fread 302 00:15:25,440 --> 00:15:27,720 excepte que és per a l'escriptura en lloc de llegir, simplement 303 00:15:27,720 --> 00:15:31,610 com l'altre-- que hem tingut oberta i prop, rebre un caràcter, 304 00:15:31,610 --> 00:15:32,530 escriure un personatge. 305 00:15:32,530 --> 00:15:35,040 Ara és aconseguir arbitrària quantitat d'informació, 306 00:15:35,040 --> 00:15:37,170 quantitat arbitrària dret d'informació. 307 00:15:37,170 --> 00:15:39,790 Així que igual que abans, podem tenir un arranjament de 10 sencers 308 00:15:39,790 --> 00:15:43,210 on ja tenim la informació emmagatzemada, potser. 309 00:15:43,210 --> 00:15:46,580 >> Va ser probablement algunes línies de codi que ha d'anar entre aquests dos 310 00:15:46,580 --> 00:15:49,990 on ple jo arr amb alguna cosa significativa. 311 00:15:49,990 --> 00:15:51,880 Ple amb 10 punts diferents. 312 00:15:51,880 --> 00:15:54,920 I en el seu lloc, el que estic fent és escriure des arr 313 00:15:54,920 --> 00:15:58,600 i la recol·lecció de la informació de arr. 314 00:15:58,600 --> 00:16:02,390 I jo vaig a portar aquesta informació i posar-lo a l'arxiu. 315 00:16:02,390 --> 00:16:05,410 >> Així que en lloc que sigui de l'arxiu a la memòria intermèdia, 316 00:16:05,410 --> 00:16:08,790 ara estem passant de el buffer a l'arxiu. 317 00:16:08,790 --> 00:16:10,580 Així que és just el contrari. 318 00:16:10,580 --> 00:16:16,680 Així que de nou, igual que abans, podem també tenen un tros munt de memòria 319 00:16:16,680 --> 00:16:19,600 que hem dinàmicament assignat i llegir a partir d'aquest 320 00:16:19,600 --> 00:16:21,570 i escriure que a l'arxiu. 321 00:16:21,570 --> 00:16:24,900 >> I també tenim una sola variable capaç de contenir un byte 322 00:16:24,900 --> 00:16:27,200 de la informació, tal com un caràcter. 323 00:16:27,200 --> 00:16:29,830 Però, de nou, hem de passar la direcció d'aquesta variable 324 00:16:29,830 --> 00:16:31,840 quan volem llegir d'ell. 325 00:16:31,840 --> 00:16:35,280 Així que podem escriure la informació ens trobem en aquesta direcció 326 00:16:35,280 --> 00:16:39,050 al punter d'arxiu, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Hi ha un munt d'altres funcions de gran arxiu d'E / S 328 00:16:41,630 --> 00:16:44,650 que fan diverses coses a més els que han parlat de l'actualitat. 329 00:16:44,650 --> 00:16:46,450 Un parell dels que poden interessar 330 00:16:46,450 --> 00:16:50,840 són fgets i fputs, que són l'equivalent 331 00:16:50,840 --> 00:16:56,190 de fgetc i fputc però per a la lectura una única cadena d'un arxiu. 332 00:16:56,190 --> 00:16:59,020 En lloc d'un sol caràcter, llegirà una cadena sencera. 333 00:16:59,020 --> 00:17:02,940 fprintf, el que permet, bàsicament, utilitzar printf per escriure a l'arxiu. 334 00:17:02,940 --> 00:17:05,619 Així que igual que vostè pot fer el la substitució de variables utilitzant 335 00:17:05,619 --> 00:17:09,900 Els marcadors de posició per cent ii d cent, i així successivament, amb printf 336 00:17:09,900 --> 00:17:14,690 pot igualment prendre la cadena printf i imprimir alguna cosa 337 00:17:14,690 --> 00:17:16,800 de la mateixa manera que en un arxiu. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- si vostè té un reproductor de DVD és l'analogia que solen utilitzar aquí-- 339 00:17:20,720 --> 00:17:23,109 és una cosa així com l'ús de la seva rebobinat i avanç ràpid 340 00:17:23,109 --> 00:17:25,819 per moure al voltant de la pel·lícula. 341 00:17:25,819 --> 00:17:28,369 De la mateixa manera, pots moure't per l'arxiu. 342 00:17:28,369 --> 00:17:30,250 Una de les coses a l'interior que l'estructura d'arxius 343 00:17:30,250 --> 00:17:34,270 que c crea per a vostè és un indicador d'on es troba a l'arxiu. 344 00:17:34,270 --> 00:17:36,420 Està vostè en el mateix començant, al byte zero? 345 00:17:36,420 --> 00:17:39,290 Està vostè en el byte 100, byte de 1000, i així successivament? 346 00:17:39,290 --> 00:17:44,340 Podeu utilitzar fseek moure arbitràriament aquest indicador cap endavant o cap enrere. 347 00:17:44,340 --> 00:17:46,744 >> I ftell, de nou similar a un reproductor de DVD, 348 00:17:46,744 --> 00:17:49,660 és com un petit rellotge que li diu quants minuts i segons li 349 00:17:49,660 --> 00:17:52,480 estan en una pel·lícula en particular. 350 00:17:52,480 --> 00:17:56,990 De la mateixa manera, ftell li diu com molts bytes que són a l'arxiu. 351 00:17:56,990 --> 00:18:00,210 feof és una versió diferent de detectar si vostè té 352 00:18:00,210 --> 00:18:01,700 arribat al final de l'arxiu. 353 00:18:01,700 --> 00:18:03,600 I és una funció ferror que es pot utilitzar 354 00:18:03,600 --> 00:18:06,959 per detectar si alguna cosa té anat de treball mal amb un arxiu. 355 00:18:06,959 --> 00:18:08,750 Un cop més, això és només esgarrapar la superfície. 356 00:18:08,750 --> 00:18:12,730 Encara hi ha molts més arxius d'E / S funcions en l'estàndard io.h. 357 00:18:12,730 --> 00:18:16,620 Però això probablement aconseguir- començat a treballar amb punters d'arxius. 358 00:18:16,620 --> 00:18:17,640 Sóc Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Això és CS50. 360 00:18:19,750 --> 00:18:21,669