1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> SPEAKER: Zatím je pravděpodobné, že většina vašich programů 3 00:00:07,870 --> 00:00:10,170 být trochu pomíjivá. 4 00:00:10,170 --> 00:00:13,310 Spustit program, jako Maria nebo chamtivý. 5 00:00:13,310 --> 00:00:17,350 Je to něco dělá, ale možná vyzve Uživatel nějaké informace, 6 00:00:17,350 --> 00:00:20,400 vytisknout nějaký výstup na obrazovku, ale pak, když váš program je po všem, 7 00:00:20,400 --> 00:00:23,252 je to opravdu neexistuje žádný důkaz, vůbec byla spuštěn v první řadě. 8 00:00:23,252 --> 00:00:25,960 Chci říct, jasně, možná jste odešel otevře v terminálovém okně, 9 00:00:25,960 --> 00:00:29,770 ale pokud vymazat obrazovku, je tu Opravdu žádný důkaz o tom, že to existuje. 10 00:00:29,770 --> 00:00:33,720 Nemáme prostředky k ukládání perzistentní informace, informace 11 00:00:33,720 --> 00:00:36,890 že existuje po našem Program byla zastavena, 12 00:00:36,890 --> 00:00:39,241 nebo nemáme až do tohoto bodu. 13 00:00:39,241 --> 00:00:41,490 Naštěstí však, c dělá nám poskytují možnost 14 00:00:41,490 --> 00:00:44,220 na to tím, že se provádí něco, co nazývá 15 00:00:44,220 --> 00:00:48,330 soubor, struktura, která v zásadě představuje soubor, který by zdvojnásobit 16 00:00:48,330 --> 00:00:53,826 klikněte na vašem počítači, pokud jste slouží k grafického uživatelského prostředí. 17 00:00:53,826 --> 00:00:55,700 Obecně při práci s c, my jsme vlastně 18 00:00:55,700 --> 00:00:59,965 bude pracovat s ukazatele na files-- soubor stars-- 19 00:00:59,965 --> 00:01:02,090 až na trochu když hovoříme o pár 20 00:01:02,090 --> 00:01:04,560 z funkcí, které pracovat s ukazateli souborů. 21 00:01:04,560 --> 00:01:08,990 Nemusíte mít opravdu vykopali příliš hluboko do chápání ukazatelů 22 00:01:08,990 --> 00:01:09,730 oni sami. 23 00:01:09,730 --> 00:01:12,870 Je tu trochu malinký kousek kde budeme mluvit o nich, 24 00:01:12,870 --> 00:01:18,090 ale obecně soubor ukazatelů a ukazatele, zatímco vzájemně propojené, 25 00:01:18,090 --> 00:01:20,290 nejsou přesně totéž. 26 00:01:20,290 --> 00:01:22,440 >> Co teď mám na mysli, když Říkám trvalá data? 27 00:01:22,440 --> 00:01:23,650 Co je to perzistentní údaje? 28 00:01:23,650 --> 00:01:25,232 Proč se nám záleží na tom? 29 00:01:25,232 --> 00:01:27,190 Řekněme, například, že vedete program 30 00:01:27,190 --> 00:01:29,850 nebo jste přepsaný Program, který je hra, 31 00:01:29,850 --> 00:01:32,960 a chcete mít přehled ze všech pohybů uživatele 32 00:01:32,960 --> 00:01:36,620 takže možná, pokud se něco pokazí, si můžete prohlédnout v souboru po zápase. 33 00:01:36,620 --> 00:01:39,970 To je to, co máme na mysli, když jsme mluvit o perzistentních dat. 34 00:01:39,970 --> 00:01:43,930 >> V průběhu spuštěním Program, je vytvořen soubor. 35 00:01:43,930 --> 00:01:45,680 A když váš program byla zastavena, 36 00:01:45,680 --> 00:01:48,689 že soubor stále existuje ve vašem systému. 37 00:01:48,689 --> 00:01:50,230 A můžeme se na to podívat a prozkoumat ho. 38 00:01:50,230 --> 00:01:53,670 A tak, aby program by být nastaven na vytvořili několik trvalých dat, 39 00:01:53,670 --> 00:01:57,390 Existují údaje po programu ukončil svůj běh. 40 00:01:57,390 --> 00:02:02,320 >> Nyní jsou všechny tyto funkce, které pracují s vytváření souborů a manipulaci 41 00:02:02,320 --> 00:02:04,940 je různými způsoby žít ve standardním io.h, 42 00:02:04,940 --> 00:02:08,210 což je soubor záhlaví, které Vy jste pravděpodobně byla libra 43 00:02:08,210 --> 00:02:10,910 a to i na horní části docela hodně všech vašich programů 44 00:02:10,910 --> 00:02:14,130 proto, že obsahuje jeden z následujících Nejužitečnější je funkce pro nás, 45 00:02:14,130 --> 00:02:16,130 printf, která také umožňuje žije ve standardním io.h. 46 00:02:16,130 --> 00:02:20,400 Takže nemusíte bušit zahrnout další soubory pravděpodobně 47 00:02:20,400 --> 00:02:23,540 Aby bylo možné pracovat s ukazateli souborů. 48 00:02:23,540 --> 00:02:29,980 >> Nyní každý ukazatel funkce souboru, nebo každý soubor I / O, vstup výstup 49 00:02:29,980 --> 00:02:33,310 funkce, přijímá jako jeden jeho parametry nebo vstupy 50 00:02:33,310 --> 00:02:35,822 pointer-- soubor s výjimkou pro jednoho, fopen, který 51 00:02:35,822 --> 00:02:38,280 je to, co použít k získání souboru ukazatel na prvním místě. 52 00:02:38,280 --> 00:02:41,010 Ale poté, co jste otevření soubor a dostanete ukazatele souboru, 53 00:02:41,010 --> 00:02:43,510 pak můžete předat jako Argumenty různých funkcí 54 00:02:43,510 --> 00:02:46,720 budeme mluvit o tom, Dnes, stejně jako mnoho dalších 55 00:02:46,720 --> 00:02:48,520 takže můžete pracovat se soubory. 56 00:02:48,520 --> 00:02:50,980 >> Takže tam je šest dost společné základní ones 57 00:02:50,980 --> 00:02:52,870 že budeme mluvit o dnes. 58 00:02:52,870 --> 00:02:57,160 fopen a jeho společník Funkce fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 a jeho funkce společník fputc, a fread a jeho společník funkce, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Tak pojďme přímo do ní. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- co to dělá? 63 00:03:07,050 --> 00:03:10,050 No, to otevře soubor, a to vám dává ukazatel souboru na to, 64 00:03:10,050 --> 00:03:14,000 takže pak můžete použít, že soubor ukazatel jako argument 65 00:03:14,000 --> 00:03:16,730 na některou z druhého souboru I / O funkce. 66 00:03:16,730 --> 00:03:19,100 Nejdůležitější věc pamatovat si s fopen 67 00:03:19,100 --> 00:03:24,222 je, že poté, co jste otevřel souboru nebo kamsi zavolal, jako je ta tady, 68 00:03:24,222 --> 00:03:26,930 je třeba zkontrolovat, aby se ujistil že ukazatel, že jste se vrátili 69 00:03:26,930 --> 00:03:28,320 se nerovná null. 70 00:03:28,320 --> 00:03:31,320 Pokud jste sledovali video na ukazatele, mohlo by to nedávalo smysl. 71 00:03:31,320 --> 00:03:35,639 Ale pokud se pokusíte a dereference nulový ukazatel odvolání, 72 00:03:35,639 --> 00:03:38,180 váš program bude pravděpodobně trpět segmentace [neslyšitelných]. 73 00:03:38,180 --> 00:03:40,540 Chceme, aby se ujistil, že jsme dostal legitimní ukazatel záda. 74 00:03:40,540 --> 00:03:43,665 Drtivá většina času budeme se dostali legitimní ukazatel zpět 75 00:03:43,665 --> 00:03:45,280 a to nebude problém. 76 00:03:45,280 --> 00:03:46,760 >> Tak jak to uděláme volání fopen? 77 00:03:46,760 --> 00:03:48,051 Vypadá to skoro jako je tento. 78 00:03:48,051 --> 00:03:52,690 Soubor hvězda ptr-- PTR být obecný jméno pro soubor pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 a míjíme dvě věci, název souboru a operace chceme podniknout. 80 00:03:57,300 --> 00:04:01,690 Takže bychom mohli mít hovor, který vypadá jako tohle-- soubor hvězda ptr 1 rovná fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 A operace jsem zvolil, je r. 83 00:04:07,020 --> 00:04:08,639 >> Takže to, co si myslíte, že r je tady? 84 00:04:08,639 --> 00:04:11,180 Jaké jsou druhy věcí, které jsme mohl udělat, aby soubory? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Takže r je operace, která jsme zvolit, kdy chceme číst soubor. 87 00:04:17,500 --> 00:04:20,260 Takže bychom v podstatě, když jsme volat takhle 88 00:04:20,260 --> 00:04:25,440 se dostat sami ukazatel souboru taková, že bychom mohli číst informace 89 00:04:25,440 --> 00:04:27,770 od file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> Stejně tak bychom mohli otevřít soubor 2.txt pro psaní a tak můžeme projít ptr2, 91 00:04:34,190 --> 00:04:38,210 Soubor ukazatel jsem tu vytvořil, jako argument pro jakoukoli funkci, která 92 00:04:38,210 --> 00:04:40,080 zapíše informace do souboru. 93 00:04:40,080 --> 00:04:43,767 A podobně jako psaní, je tu také možnost připojit, a. 94 00:04:43,767 --> 00:04:45,600 Rozdíl mezi psaní a připojením 95 00:04:45,600 --> 00:04:50,920 v tom, že když píšete do souboru, pokud uděláte volání fopen pro psaní 96 00:04:50,920 --> 00:04:54,761 a tento soubor již existuje, je to chystá přepsat celý soubor. 97 00:04:54,761 --> 00:04:56,510 Bude to začátek na samém začátku, 98 00:04:56,510 --> 00:04:58,820 odstranění veškeré informace že už tam je. 99 00:04:58,820 --> 00:05:02,210 >> Vzhledem k tomu, pokud jej otevřený pouze pro připojení, to půjde na konec souboru 100 00:05:02,210 --> 00:05:04,340 v případě, že je již v textu ho nebo informace v něm, 101 00:05:04,340 --> 00:05:06,040 a bude pak začít psaní odtamtud. 102 00:05:06,040 --> 00:05:08,570 Takže budete neztratily nic z Informace, které jste předtím. 103 00:05:08,570 --> 00:05:12,110 Ať už chcete psát nebo připojit druh závisí na situaci. 104 00:05:12,110 --> 00:05:16,840 Ale pravděpodobně budete vědět, co právo operace je, když přijde čas. 105 00:05:16,840 --> 00:05:18,020 Tak to je fopen. 106 00:05:18,020 --> 00:05:18,930 >> Co fclose? 107 00:05:18,930 --> 00:05:21,600 No, docela jednoduše, fclose právě přijímá ukazatel souboru. 108 00:05:21,600 --> 00:05:24,000 A jak se dalo očekávat, zavře tento soubor. 109 00:05:24,000 --> 00:05:29,270 A jakmile jsme uzavřeli soubor, nemůžeme provádět žádné další soubor I / O funkce, 110 00:05:29,270 --> 00:05:31,420 čtení nebo zápisu na tomto souboru. 111 00:05:31,420 --> 00:05:36,444 Musíme znovu otevřít soubor jindy, aby 112 00:05:36,444 --> 00:05:38,610 pokračovat v práci s to pomocí I / O-funkce. 113 00:05:38,610 --> 00:05:41,520 Takže fclose znamená, že jsme hotovi práci s tímto souborem. 114 00:05:41,520 --> 00:05:44,690 A všechno, co potřebujeme, je předat jméno ukazatel v souboru. 115 00:05:44,690 --> 00:05:50,010 Takže o pár posune před jsme fopened soubor 1 bod text pro čtení 116 00:05:50,010 --> 00:05:52,854 a jsme přiřadili, že soubor ukazatel na ptr1. 117 00:05:52,854 --> 00:05:55,020 Nyní jsme se rozhodli, že jsme provádí čtení z tohoto souboru. 118 00:05:55,020 --> 00:05:56,561 Nepotřebujeme dělat víc s ním. 119 00:05:56,561 --> 00:05:58,890 Můžeme jen fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 A stejně, mohli bychom fclose ty ostatní. 121 00:06:01,950 --> 00:06:02,450 Dobře. 122 00:06:02,450 --> 00:06:03,700 Tak to je otevírání a zavírání. 123 00:06:03,700 --> 00:06:05,780 To jsou dva základní zahájení operace. 124 00:06:05,780 --> 00:06:08,050 >> Teď chceme skutečně udělat nějaké zajímavé věci, 125 00:06:08,050 --> 00:06:11,940 a první funkce, že budeme vidět, že to udělá, je fgetc-- 126 00:06:11,940 --> 00:06:14,110 podat si charakter. 127 00:06:14,110 --> 00:06:17,350 To je to, co obvykle fgetc by se promítají do. 128 00:06:17,350 --> 00:06:20,190 Jeho životním cílem je přečíst následující znak, 129 00:06:20,190 --> 00:06:22,079 nebo je-li to vaše velmi První volání fgetc 130 00:06:22,079 --> 00:06:23,870 pro určitý soubor, první znak. 131 00:06:23,870 --> 00:06:26,210 Ale pak po tom, dostanete další, 132 00:06:26,210 --> 00:06:31,500 hned další charakter tohoto souboru, a ukládá ji do proměnné znak. 133 00:06:31,500 --> 00:06:34,490 Jak jsme tu udělali, char ch rovná fgetc, 134 00:06:34,490 --> 00:06:36,389 projít ve jménu ukazatel v souboru. 135 00:06:36,389 --> 00:06:38,180 Opět platí, že je to velmi zde důležité mít na paměti, 136 00:06:38,180 --> 00:06:41,430 že za účelem provedení tato operace úspěšná, 137 00:06:41,430 --> 00:06:45,690 Soubor ukazatel sám musel byl otevřen pro čtení. 138 00:06:45,690 --> 00:06:50,589 Nemůžeme číst znak ze souboru ukazatel, který jsme otevřeli pro zápis. 139 00:06:50,589 --> 00:06:52,630 Takže to je jedna z omezení fopen, že jo? 140 00:06:52,630 --> 00:06:55,470 Musíme omezit abychom se pouze provádění 141 00:06:55,470 --> 00:06:57,710 jedna operace s jedním ukazatel v souboru. 142 00:06:57,710 --> 00:07:00,220 Pokud bychom chtěli číst a napsat ze stejného souboru, 143 00:07:00,220 --> 00:07:03,840 budeme mít otevřené dva samostatné ukazatele soubor do stejné file-- 144 00:07:03,840 --> 00:07:05,670 jeden pro čtení, jeden pro psaní. 145 00:07:05,670 --> 00:07:08,400 >> Takže znovu, jediný důvod, proč Uvedu, že se nyní je 146 00:07:08,400 --> 00:07:11,920 protože pokud budeme volat na fgetc, že ​​ukazatel souboru muselo 147 00:07:11,920 --> 00:07:14,172 byl otevřen pro čtení. 148 00:07:14,172 --> 00:07:15,880 A pak docela jednoduše, vše, co potřebujete udělat, 149 00:07:15,880 --> 00:07:17,546 je projít v názvu ukazatel v souboru. 150 00:07:17,546 --> 00:07:21,060 Takže char ch rovná fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> To bude, abychom se dostali další character-- 152 00:07:23,200 --> 00:07:25,575 nebo znovu, pokud se jedná o první Tentokrát jsme udělali tuto výzvu, 153 00:07:25,575 --> 00:07:29,750 první character-- jakéhokoli soubor odkazuje ptr1. 154 00:07:29,750 --> 00:07:32,210 Připomeňme si, že to byl soubor 1 bod textu. 155 00:07:32,210 --> 00:07:36,490 To bude mít první písmeno, které a my uložit jej do proměnné ch. 156 00:07:36,490 --> 00:07:37,941 Docela jednoduché. 157 00:07:37,941 --> 00:07:40,190 A tak jsme se jen podíval na tři funkce a už jsme 158 00:07:40,190 --> 00:07:43,070 může něco docela čistý. 159 00:07:43,070 --> 00:07:46,320 >> Takže pokud vezmeme tuto schopnost dostat znak 160 00:07:46,320 --> 00:07:48,943 a my smyčka to-- tak jsme nadále dostávat znaky 161 00:07:48,943 --> 00:07:51,390 ze souboru znovu a nad a over-- teď jsme 162 00:07:51,390 --> 00:07:54,500 může číst každý charakter souboru. 163 00:07:54,500 --> 00:07:58,670 A pokud budeme tisknout každý znak hned poté, co jsme si ho přečetli, 164 00:07:58,670 --> 00:08:01,960 jsme nyní číst ze souboru a tištěný jeho obsah na obrazovku. 165 00:08:01,960 --> 00:08:05,610 Jsme účinně zřetězený tento soubor na obrazovce. 166 00:08:05,610 --> 00:08:09,670 A to je to, co Linux příkaz cat dělá. 167 00:08:09,670 --> 00:08:13,250 >> Zadáte-li kočka v názvu souboru to, vytiskne celý obsah 168 00:08:13,250 --> 00:08:15,160 souboru v okně vašeho terminálu. 169 00:08:15,160 --> 00:08:19,010 A tak tato malá smyčka tady, pouze tři řádky kódu, 170 00:08:19,010 --> 00:08:23,270 ale účinně zdvojuje Linux příkaz cat. 171 00:08:23,270 --> 00:08:25,210 Tak tohle by mohlo syntaxe vypadat trochu divně, 172 00:08:25,210 --> 00:08:26,670 ale tady je to, co se tady děje. 173 00:08:26,670 --> 00:08:31,460 Zatímco ch rovná fgetc, ptr není rovná EOF--, že je to celé sousto, 174 00:08:31,460 --> 00:08:34,669 ale pojďme rozebrat to jen takže je jasné, na syntaxi. 175 00:08:34,669 --> 00:08:37,169 Já jsem to upevnil kvůli prostoru, 176 00:08:37,169 --> 00:08:39,049 i když je to trochu syntakticky ošidné. 177 00:08:39,049 --> 00:08:41,194 >> Takže tato část v zelené vpravo A teď, co to dělá? 178 00:08:41,194 --> 00:08:42,860 No, to je právě náš fgetc volání, že jo? 179 00:08:42,860 --> 00:08:44,530 Viděli jsme, že před. 180 00:08:44,530 --> 00:08:49,500 Je to získání jednoho znak ze souboru. 181 00:08:49,500 --> 00:08:53,220 Pak jsme se porovnat, že znak proti OSZ. 182 00:08:53,220 --> 00:08:57,470 EOF je zvláštní hodnota, která je definované v normě io.h, který 183 00:08:57,470 --> 00:08:59,390 je konec souboru charakteru. 184 00:08:59,390 --> 00:09:03,450 Takže v podstatě to, co se bude dít je tato smyčka bude číst znak, 185 00:09:03,450 --> 00:09:07,445 porovnat ji s EOF se Konec souboru charakteru. 186 00:09:07,445 --> 00:09:10,070 Pokud se neshodují, takže nemáme došel na konec souboru, 187 00:09:10,070 --> 00:09:11,490 budeme tisknout tu postavu ven. 188 00:09:11,490 --> 00:09:13,740 Pak se vrátíme do začátek smyčky znovu. 189 00:09:13,740 --> 00:09:18,310 Dostaneme charakter, zkontrolujte proti OSZ, vytisknout, a tak dále 190 00:09:18,310 --> 00:09:21,094 a tak dále, a tak dále, opakování prostřednictvím tímto způsobem 191 00:09:21,094 --> 00:09:22,760 až jsme došli na konec souboru. 192 00:09:22,760 --> 00:09:24,593 A pak se tím bodem, budeme mít vytištěn 193 00:09:24,593 --> 00:09:26,210 out celého obsahu spisu. 194 00:09:26,210 --> 00:09:29,450 Takže znovu, jsme viděli jen fopen, fclose, a fgetc 195 00:09:29,450 --> 00:09:34,950 a už můžeme duplikovat terminální příkaz Linux. 196 00:09:34,950 --> 00:09:38,850 >> Jak jsem řekl na začátku, měli jsme fgetc a fputc, 197 00:09:38,850 --> 00:09:41,860 a fputc byl společníkem funkce fgetc. 198 00:09:41,860 --> 00:09:44,880 A tak, jak byste si mohli představit, to je ekvivalent psaní. 199 00:09:44,880 --> 00:09:49,440 To nám umožňuje napsat jeden znak do souboru. 200 00:09:49,440 --> 00:09:53,290 >> Opět platí, že je námitka, jen jako by to bylo s fgetc, soubor 201 00:09:53,290 --> 00:09:56,660 že jsme písemně musel být otevřít pro zápis nebo pouze pro připojení. 202 00:09:56,660 --> 00:10:00,820 Pokud se budeme snažit a používat fputc na soubor že jsme otevřen pro čtení, 203 00:10:00,820 --> 00:10:02,760 budeme trpět trochu omylem. 204 00:10:02,760 --> 00:10:04,440 Ale volání je velmi jednoduchý. 205 00:10:04,440 --> 00:10:08,000 fputc kapitálu ptr2, všechny že to bude dělat, je, že je to 206 00:10:08,000 --> 00:10:12,040 chystá napsat dopis do A do souboru 2 tečkou 207 00:10:12,040 --> 00:10:14,760 text, což bylo jméno toho soubor, který jsme otevřeli a přidělen 208 00:10:14,760 --> 00:10:17,280 ukazatel na ptr2. 209 00:10:17,280 --> 00:10:20,430 Takže budeme napsat kapitál od A do souboru 2 dot text. 210 00:10:20,430 --> 00:10:24,592 A budeme psát výkřik poukazují na souboru 3 tečka 211 00:10:24,592 --> 00:10:27,330 text, který byl na který ukazuje ptr3. 212 00:10:27,330 --> 00:10:29,730 Takže znovu, tady docela jednoduché. 213 00:10:29,730 --> 00:10:32,727 >> Ale teď můžeme dělat něco jiného. 214 00:10:32,727 --> 00:10:34,560 Máme tento příklad jsme prostě jít přes 215 00:10:34,560 --> 00:10:38,950 o schopnosti replikovat kočku Linux příkaz, ten, který vytiskne 216 00:10:38,950 --> 00:10:40,500 na obrazovku. 217 00:10:40,500 --> 00:10:43,510 No, teď, že máme schopnost číst znaky ze souborů 218 00:10:43,510 --> 00:10:46,590 a psát znaky do souborů, proč ne my prostě nahradit, že 219 00:10:46,590 --> 00:10:50,720 zavolat do printf s voláním fputc. 220 00:10:50,720 --> 00:10:54,090 >> A teď jsme duplicitní cp, velmi základní příkaz Linux 221 00:10:54,090 --> 00:10:59,100 že jsme mluvili o způsob, jak dlouho Před v Linuxu příkazy videa. 222 00:10:59,100 --> 00:11:01,070 Máme skutečně jsem duplikovány, že právě zde. 223 00:11:01,070 --> 00:11:04,790 Jsme čtení postavu a pak jsme psaní, že znak jiného souboru. 224 00:11:04,790 --> 00:11:07,660 Čtení z jednoho souboru, psaní do druhého, znovu a znovu 225 00:11:07,660 --> 00:11:11,350 a znovu, dokud jsme narazili EOF. 226 00:11:11,350 --> 00:11:14,250 Musíme se na konci soubor se snažíme kopírovat. 227 00:11:14,250 --> 00:11:18,500 A tím, že budeme mít napsáno postav musíme souboru 228 00:11:18,500 --> 00:11:19,500 že jsme písemně. 229 00:11:19,500 --> 00:11:24,270 Tak tohle je cp, příkaz Linux kopírování. 230 00:11:24,270 --> 00:11:26,550 >> Na samém počátku toto video, měl jsem námitku 231 00:11:26,550 --> 00:11:29,840 že bychom mluvit Něco málo o ukazatele. 232 00:11:29,840 --> 00:11:32,480 Zde se konkrétně, kde jsme mluvit o ukazatele 233 00:11:32,480 --> 00:11:34,800 kromě souboru ukazatele. 234 00:11:34,800 --> 00:11:37,870 Takže tato funkce vypadá děsivě. 235 00:11:37,870 --> 00:11:39,120 Má to několik parametrů. 236 00:11:39,120 --> 00:11:40,430 Je tu spousta děje. 237 00:11:40,430 --> 00:11:42,760 Je tu mnoho různých barvy a texty. 238 00:11:42,760 --> 00:11:47,100 Ale vážně, je to jen generické verze fgetc 239 00:11:47,100 --> 00:11:50,110 který nám umožňuje dostat nějakou množství informací. 240 00:11:50,110 --> 00:11:53,560 To může být trochu neefektivní když jsme dostat znaků jeden po druhém, 241 00:11:53,560 --> 00:11:55,770 iterace souboru jeden znak najednou. 242 00:11:55,770 --> 00:12:00,230 Nebylo by to být hezčí se dostat 100 v době, nebo 500 v době? 243 00:12:00,230 --> 00:12:03,250 >> No, fread a jeho společník funkce fwrite, který budeme mluvit o tom, 244 00:12:03,250 --> 00:12:05,490 V druhé, nám umožňují dělat jen to. 245 00:12:05,490 --> 00:12:08,480 Můžeme přečíst libovolnou částku informací z souboru 246 00:12:08,480 --> 00:12:10,290 a uložíme ho někde dočasně. 247 00:12:10,290 --> 00:12:12,980 Místo toho, že se může jen vešel v jedné proměnné, 248 00:12:12,980 --> 00:12:15,790 bychom mohli potřebovat uložit jej do pole. 249 00:12:15,790 --> 00:12:19,980 A tak jsme se projít ve čtyřech argumenty fread-- ukazatel 250 00:12:19,980 --> 00:12:23,940 na místo, kam máme se k ukládání informací, 251 00:12:23,940 --> 00:12:29,180 jak velké jsou jednotlivé informační jednotkou bude, kolik jednotek informací 252 00:12:29,180 --> 00:12:35,192 chceme získat, a od který soubor chceme dostat. 253 00:12:35,192 --> 00:12:37,150 Pravděpodobně nejlépe dokládá s příkladem zde. 254 00:12:37,150 --> 00:12:41,640 Takže řekněme, že prohlašujeme Pole 10 celých čísel. 255 00:12:41,640 --> 00:12:45,080 Právě jsme deklaroval na stack libovolně int arr 10. 256 00:12:45,080 --> 00:12:46,970 Tak to je docela jednoduché. 257 00:12:46,970 --> 00:12:51,970 To, co děláme, ale nyní je frecall se budeme velikost int čtení 258 00:12:51,970 --> 00:12:54,180 krát 10 bajtů informací. 259 00:12:54,180 --> 00:12:59,040 Velikost int bytí four-- to je velikost celé číslo v C. 260 00:12:59,040 --> 00:13:02,790 >> Takže to, co děláme je, že čtete 40 bytů v hodnotě informací 261 00:13:02,790 --> 00:13:05,850 ze souboru, na který ukazuje PTR. 262 00:13:05,850 --> 00:13:08,600 A my jsme ti, skladování 40 bytů někde 263 00:13:08,600 --> 00:13:12,080 kde jsme odložili 40 bytů v hodnotě paměti. 264 00:13:12,080 --> 00:13:15,970 Naštěstí jsme již učinili, že deklarovat arr, že pole tam. 265 00:13:15,970 --> 00:13:19,770 To je vhodné pro uchovávání 10 čtyřbytové jednotky. 266 00:13:19,770 --> 00:13:22,860 Takže celkem, to může držet 40 bytů v hodnotě informací. 267 00:13:22,860 --> 00:13:26,540 A my jsme právě čtete 40 bajtů informací ze spisu, 268 00:13:26,540 --> 00:13:30,330 a my ukládání do arr. 269 00:13:30,330 --> 00:13:35,470 >> Připomeňme z videa na ukazatele, které jméno pole, jako je například arr, 270 00:13:35,470 --> 00:13:38,370 je opravdu jen ukazatel k jeho prvnímu prvku. 271 00:13:38,370 --> 00:13:43,680 Takže když jsme se projít v arr tam, jsme se jsou ve skutečnosti, předáním ukazatel. 272 00:13:43,680 --> 00:13:46,120 >> Podobně můžeme udělat tohle-- my ne nutně 273 00:13:46,120 --> 00:13:51,200 je třeba zachránit naše vyrovnávací paměti v zásobníku. 274 00:13:51,200 --> 00:13:54,990 Také bychom mohli dynamicky přidělovat vyrovnávací paměť jako je tento, pomocí malloc. 275 00:13:54,990 --> 00:13:57,340 Pamatujte si, že když jsme se dynamicky alokovat paměť, 276 00:13:57,340 --> 00:14:00,550 jsme jeho uložení na haldy, nikoli zásobník. 277 00:14:00,550 --> 00:14:02,110 Ale je to pořád vyrovnávací paměti. 278 00:14:02,110 --> 00:14:06,810 >> Stále, v tomto případě je držení 640 bajtů informací 279 00:14:06,810 --> 00:14:09,230 protože double zabírá osm bajtů. 280 00:14:09,230 --> 00:14:11,570 A žádáme pro 80 z nich. 281 00:14:11,570 --> 00:14:13,770 Chceme mít prostor držet 80 dvoulůžkových pokojů. 282 00:14:13,770 --> 00:14:17,210 Tak 80 krát 8 640 bajtů informace. 283 00:14:17,210 --> 00:14:21,880 A to je výzva k fread sbírání 640 bajtů informací 284 00:14:21,880 --> 00:14:27,770 ze souboru, na který ukazuje PTR a ukládání nyní v arr2. 285 00:14:27,770 --> 00:14:32,770 >> Nyní můžeme léčit fread stejně jako volání fgetc. 286 00:14:32,770 --> 00:14:37,140 V tomto případě, my jsme jen se snaží získat jeden znak ze souboru. 287 00:14:37,140 --> 00:14:40,070 A my nepotřebují array držet znak. 288 00:14:40,070 --> 00:14:43,170 Můžeme jen uložit jej do variabilní znak. 289 00:14:43,170 --> 00:14:46,390 >> Úlovek, však je, že když jsme prostě proměnnou, 290 00:14:46,390 --> 00:14:50,290 musíme projít v Adresa této proměnné 291 00:14:50,290 --> 00:14:52,550 Připomeňme si, že proto, První argument fread 292 00:14:52,550 --> 00:14:59,210 je ukazatel na umístění a paměti kde chceme uložit informace. 293 00:14:59,210 --> 00:15:01,550 Opět platí, že na jméno pole je ukazatel. 294 00:15:01,550 --> 00:15:04,200 Takže nepotřebujeme dělat ampersand pole. 295 00:15:04,200 --> 00:15:07,270 Ale c, charakter c tady, není polem. 296 00:15:07,270 --> 00:15:08,390 Je to jen variabilní. 297 00:15:08,390 --> 00:15:11,840 A proto je třeba složit ampersand c uvést 298 00:15:11,840 --> 00:15:15,350 že to je adresa, kde chceme uložit tento jeden bajt informací, 299 00:15:15,350 --> 00:15:20,479 to jeden znak, který jsme sběr z PTR. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Projdu to trochu víc 301 00:15:22,270 --> 00:15:25,440 quickly-- je skoro přesný ekvivalent fread 302 00:15:25,440 --> 00:15:27,720 s výjimkou, že je to pro psaní místo čtení, jen 303 00:15:27,720 --> 00:15:31,610 stejně jako other-- jsme měli otevřeno V blízkosti, si postavu, 304 00:15:31,610 --> 00:15:32,530 napsat znak. 305 00:15:32,530 --> 00:15:35,040 Teď je to dostat libovolná Množství informací, 306 00:15:35,040 --> 00:15:37,170 právo libovolné množství informací. 307 00:15:37,170 --> 00:15:39,790 Takže stejně jako předtím, můžeme mají celou řadu 10 celých čísel 308 00:15:39,790 --> 00:15:43,210 kde už máme Informace uložené, snad. 309 00:15:43,210 --> 00:15:46,580 >> To bylo pravděpodobně několik řádků kódu že by měl jít mezi těmito dvěma 310 00:15:46,580 --> 00:15:49,990 kde jsem naplnit arr se něco smysluplného. 311 00:15:49,990 --> 00:15:51,880 I naplňte ji 10 různých čísel. 312 00:15:51,880 --> 00:15:54,920 A místo toho, co já jsem dělá píše z arr 313 00:15:54,920 --> 00:15:58,600 a shromažďování informací od arr. 314 00:15:58,600 --> 00:16:02,390 A beru, že informace a uvedení do souboru. 315 00:16:02,390 --> 00:16:05,410 >> Takže místo toho by bylo z soubor do vyrovnávací paměti, 316 00:16:05,410 --> 00:16:08,790 Nyní se z vyrovnávací paměti do souboru. 317 00:16:08,790 --> 00:16:10,580 Takže je to právě naopak. 318 00:16:10,580 --> 00:16:16,680 Takže znovu, stejně jako předtím, můžeme mají také haldy kus paměti 319 00:16:16,680 --> 00:16:19,600 že máme dynamicky přidělené a číst z toho 320 00:16:19,600 --> 00:16:21,570 a píší, že do souboru. 321 00:16:21,570 --> 00:16:24,900 >> A máme také jednu proměnnou schopna pojmout jeden bajt 322 00:16:24,900 --> 00:16:27,200 informací, jako je charakter. 323 00:16:27,200 --> 00:16:29,830 Ale opět, musíme předat adresa této proměnné 324 00:16:29,830 --> 00:16:31,840 když chceme číst z něj. 325 00:16:31,840 --> 00:16:35,280 Takže můžeme zapsat informace najdeme na této adrese 326 00:16:35,280 --> 00:16:39,050 na ukazatel v souboru, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Je tu spousta jiné velký soubor I / O funkce 328 00:16:41,630 --> 00:16:44,650 že dělat různé věci kromě toho ty, které jsme mluvili o dnešku. 329 00:16:44,650 --> 00:16:46,450 Pár z těch, můžete najít užitečné 330 00:16:46,450 --> 00:16:50,840 jsou fgets a fputs, které jsou ekvivalentní 331 00:16:50,840 --> 00:16:56,190 z fgetc a fputc ale pro čtení jediný řetězec ze souboru. 332 00:16:56,190 --> 00:16:59,020 Místo toho, jeden znak, to bude číst celý řetězec. 333 00:16:59,020 --> 00:17:02,940 fprintf, který v zásadě umožňuje použít printf zapisovat do souboru. 334 00:17:02,940 --> 00:17:05,619 Takže stejně jako vy můžete udělat Substituce za proměnné s použitím 335 00:17:05,619 --> 00:17:09,900 Symboly procent i a procent d, a tak dále, s printf 336 00:17:09,900 --> 00:17:14,690 můžete podobně vzít printf řetězec a tisknout něco 337 00:17:14,690 --> 00:17:16,800 jako, že do souboru. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- pokud máte DVD přehrávač je analogie I obvykle používají here-- 339 00:17:20,720 --> 00:17:23,109 je něco jako pomocí svého přetočit a rychle dopředu 340 00:17:23,109 --> 00:17:25,819 tlačítka pro pohyb po filmu. 341 00:17:25,819 --> 00:17:28,369 Podobně můžete pohybovat po souboru. 342 00:17:28,369 --> 00:17:30,250 Jednou z věcí, uvnitř že struktura souboru 343 00:17:30,250 --> 00:17:34,270 že c vytváří pro vás je indikátor kde jste v souboru. 344 00:17:34,270 --> 00:17:36,420 Vy jste u velmi začátek, v byte nulové? 345 00:17:36,420 --> 00:17:39,290 Jste na bajtu 100, byte 1000, a tak dále? 346 00:17:39,290 --> 00:17:44,340 Můžete použít fseek libovolně pohybovat že ukazatel dopředu nebo dozadu. 347 00:17:44,340 --> 00:17:46,744 >> A ftell, znovu podobně jako DVD přehrávače, 348 00:17:46,744 --> 00:17:49,660 je jako malý hodiny, které říká, vy, kolik minut a sekund 349 00:17:49,660 --> 00:17:52,480 jsou do určitého filmu. 350 00:17:52,480 --> 00:17:56,990 Stejně tak, jak vám řekne ftell mnoho bajtů jste do souboru. 351 00:17:56,990 --> 00:18:00,210 feof je jiná verze detekce Ať už jste 352 00:18:00,210 --> 00:18:01,700 došel na konec souboru. 353 00:18:01,700 --> 00:18:03,600 A ferror je funkce které můžete použít 354 00:18:03,600 --> 00:18:06,959 zjistit, zda má něco pokazilo práci se souborem. 355 00:18:06,959 --> 00:18:08,750 Znovu, toto je jen poškrábání povrchu. 356 00:18:08,750 --> 00:18:12,730 Je tu ještě spousta dalších souborů I / O funkce ve standardním io.h. 357 00:18:12,730 --> 00:18:16,620 Ale to bude pravděpodobně dostanete začal pracovat s ukazateli souborů. 358 00:18:16,620 --> 00:18:17,640 Jsem Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 To je cs50. 360 00:18:19,750 --> 00:18:21,669