1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> Vorbitor: Până în prezent, este probabil că cele mai multe dintre programele 3 00:00:07,870 --> 00:00:10,170 au fost un pic efemer. 4 00:00:10,170 --> 00:00:13,310 Executați un program ca Mario sau lacom. 5 00:00:13,310 --> 00:00:17,350 Ea face ceva, poate cere utilizatorul de unele informații, 6 00:00:17,350 --> 00:00:20,400 imprima o anumită printat pe ecran, dar apoi, când programul sa terminat, 7 00:00:20,400 --> 00:00:23,252 nu există cu adevărat nici o dovadă acolo a fost rula vreodată în primul rând. 8 00:00:23,252 --> 00:00:25,960 Adică, sigur, s-ar putea au lăsat deschide în fereastra terminalului, 9 00:00:25,960 --> 00:00:29,770 dar dacă clar ecran, nu e într-adevăr nici o dovada ca a existat. 10 00:00:29,770 --> 00:00:33,720 Noi nu avem un mijloc de stocare a informații persistente, informații 11 00:00:33,720 --> 00:00:36,890 care există, după noastră Programul sa oprit de funcționare, 12 00:00:36,890 --> 00:00:39,241 sau nu avea până la acest punct. 13 00:00:39,241 --> 00:00:41,490 Din fericire însă, c nu ne oferă cu capacitatea de 14 00:00:41,490 --> 00:00:44,220 pentru a face acest lucru prin punerea în aplicare a ceva numit 15 00:00:44,220 --> 00:00:48,330 un fișier, o structură care, practic, reprezintă un fișier pe care le-ar dubla 16 00:00:48,330 --> 00:00:53,826 click pe computerul dumneavoastră, dacă sunteți folosit într-un mediu grafic de utilizator. 17 00:00:53,826 --> 00:00:55,700 În general, atunci când se lucrează cu C, suntem de fapt 18 00:00:55,700 --> 00:00:59,965 va fi de lucru cu indicii pentru a files-- fișier stars-- 19 00:00:59,965 --> 00:01:02,090 cu excepția un pic atunci când vorbim despre un cuplu 20 00:01:02,090 --> 00:01:04,560 a funcțiilor pe care lucra cu indicii de fișiere. 21 00:01:04,560 --> 00:01:08,990 Nu aveți nevoie să fi săpat într-adevăr prea adânc în indicii înțelegerea 22 00:01:08,990 --> 00:01:09,730 înșiși. 23 00:01:09,730 --> 00:01:12,870 Există un pic Teeny unde vom vorbi despre ele, 24 00:01:12,870 --> 00:01:18,090 dar, în general, și indicii fișier indicii, în timp ce interdependente, 25 00:01:18,090 --> 00:01:20,290 nu sunt exact acelasi lucru. 26 00:01:20,290 --> 00:01:22,440 >> Acum, ce vreau sa spun, atunci când Eu spun de date persistente? 27 00:01:22,440 --> 00:01:23,650 Ce este de date persistente? 28 00:01:23,650 --> 00:01:25,232 De ce nu ne pasă de asta? 29 00:01:25,232 --> 00:01:27,190 Spune, de exemplu, că rulați un program de 30 00:01:27,190 --> 00:01:29,850 sau le-ați rescris o program care este un joc, 31 00:01:29,850 --> 00:01:32,960 si doriti să urmăriți de toate de miscari ale utilizatorului 32 00:01:32,960 --> 00:01:36,620 astfel că poate dacă ceva nu merge bine, puteți consulta fișierul după meci. 33 00:01:36,620 --> 00:01:39,970 Asta e ceea ce ne referim atunci când ne vorbim despre date persistente. 34 00:01:39,970 --> 00:01:43,930 >> În cursul de a rula dvs. Programul, se creează un fișier. 35 00:01:43,930 --> 00:01:45,680 Iar atunci când programul a oprit de funcționare, 36 00:01:45,680 --> 00:01:48,689 acel fișier încă mai există pe sistemul dumneavoastră. 37 00:01:48,689 --> 00:01:50,230 Si ne putem uita la ea și să examineze o. 38 00:01:50,230 --> 00:01:53,670 Și astfel încât program ar fi setat la au creat unele date persistente, 39 00:01:53,670 --> 00:01:57,390 Există date după programul a terminat de funcționare. 40 00:01:57,390 --> 00:02:02,320 >> Acum toate aceste funcții care lucrează cu crearea de fișiere și manipularea 41 00:02:02,320 --> 00:02:04,940 le în diverse moduri trăiesc în io.h standard 42 00:02:04,940 --> 00:02:08,210 care este un fișier header care ai fost probabil lira 43 00:02:08,210 --> 00:02:10,910 inclusiv la partea de sus a destul mult toate programele 44 00:02:10,910 --> 00:02:14,130 deoarece conține una dintre cele mai cele mai multe funcții utile pentru noi, 45 00:02:14,130 --> 00:02:16,130 printf, care vă permite, de asemenea, locuiește în io.h. standardul 46 00:02:16,130 --> 00:02:20,400 Deci, tu nu trebuie să includă lira orice fișiere suplimentare, probabil, 47 00:02:20,400 --> 00:02:23,540 în scopul de a lucra cu indicii de fișiere. 48 00:02:23,540 --> 00:02:29,980 >> Acum, fiecare funcție fișier pointer, sau fiecare fișier I / O, ieșire de intrare 49 00:02:29,980 --> 00:02:33,310 funcție, acceptă ca unul de parametrii sau intrările sale 50 00:02:33,310 --> 00:02:35,822 un fișier cu excepția pointer-- pentru unul, fopen, care 51 00:02:35,822 --> 00:02:38,280 este ceea ce se utilizează pentru a obține fișierul pointer în primul rând. 52 00:02:38,280 --> 00:02:41,010 Dar după ce ați deschis fișier și veți obține indicii de fișiere, 53 00:02:41,010 --> 00:02:43,510 atunci puteți trece-le ca argumente la diversele funcții 54 00:02:43,510 --> 00:02:46,720 vom vorbi despre astăzi, precum și multe altele 55 00:02:46,720 --> 00:02:48,520 astfel încât să puteți lucra cu fișiere. 56 00:02:48,520 --> 00:02:50,980 >> Deci, există șase destul de cele de bază comune 57 00:02:50,980 --> 00:02:52,870 că vom vorbi despre ziua de azi. 58 00:02:52,870 --> 00:02:57,160 fopen și însoțitorul acestuia Funcția fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 și fputc funcția sa de companie, și fread și funcția sa de companie, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Așa că hai să-l direct in. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- ce face? 63 00:03:07,050 --> 00:03:10,050 Ei bine, se deschide un fișier și îl vă oferă un pointer fișier pentru, 64 00:03:10,050 --> 00:03:14,000 astfel încât să puteți folosi apoi că fișier pointer ca argument 65 00:03:14,000 --> 00:03:16,730 la oricare dintre celelalte funcții I / O dosar. 66 00:03:16,730 --> 00:03:19,100 Cel mai important lucru să-și amintească cu fopen 67 00:03:19,100 --> 00:03:24,222 este că după ce ați deschis fișier sau făcut un apel ca cea de aici, 68 00:03:24,222 --> 00:03:26,930 aveți nevoie pentru a verifica pentru a vă asigura că indicatorul care te-ai întors 69 00:03:26,930 --> 00:03:28,320 nu este egal cu null. 70 00:03:28,320 --> 00:03:31,320 Dacă nu ați vizionat video de pe indicii, acest lucru ar putea să nu aibă sens. 71 00:03:31,320 --> 00:03:35,639 Dar dacă încerci și dereference o rechemare pointer nul, 72 00:03:35,639 --> 00:03:38,180 probabil programul va avea de suferit o segmentare [neauzit]. 73 00:03:38,180 --> 00:03:40,540 Vrem să ne asigurăm că a primit un pointer înapoi legitim. 74 00:03:40,540 --> 00:03:43,665 Marea majoritate a timpului vom au ajuns un pointer legitim înapoi 75 00:03:43,665 --> 00:03:45,280 și nu va fi o problemă. 76 00:03:45,280 --> 00:03:46,760 >> Deci, cum putem face un apel la fopen? 77 00:03:46,760 --> 00:03:48,051 Se pare destul de mult ca aceasta. 78 00:03:48,051 --> 00:03:52,690 Stele fișier ptr-- ptr a fi un generic nume pentru fișier pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 și trecem în două lucruri, un nume de fișier și o operațiune vrem să întreprindă. 80 00:03:57,300 --> 00:04:01,690 Deci, am putea avea un apel care arata ca astea-- stele fișier ptr 1 este egal cu fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 Și funcționarea am ales este r. 83 00:04:07,020 --> 00:04:08,639 >> Deci, ce crezi că r este aici? 84 00:04:08,639 --> 00:04:11,180 Care sunt tipurile de lucruri pe care le ar putea fi capabil să facă la fișiere? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Deci r este operația pe care le alege atunci când doriți să citiți un fișier. 87 00:04:17,500 --> 00:04:20,260 Deci, ne-ar, practic, atunci când vom face un apel ca aceasta 88 00:04:20,260 --> 00:04:25,440 fi obtinerea noi înșine un indicator fișier astfel încât am putea citi informații atunci 89 00:04:25,440 --> 00:04:27,770 din file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> În mod similar, am putea deschide fișierul 2.txt pentru scris și astfel încât să putem trece ptr2, 91 00:04:34,190 --> 00:04:38,210 indicatorul de fișier am creat aici, ca un argument la orice funcție care 92 00:04:38,210 --> 00:04:40,080 scrie informații într-un fișier. 93 00:04:40,080 --> 00:04:43,767 Și similar cu scris, nu e de asemenea, opțiunea de a adăuga, a. 94 00:04:43,767 --> 00:04:45,600 Diferența dintre scris și adăugarea 95 00:04:45,600 --> 00:04:50,920 fiind că, atunci când scrie într-un fișier, dacă faci un apel la fopen pentru scris 96 00:04:50,920 --> 00:04:54,761 și că fișierul există deja, e O să suprascrie întregul dosar. 97 00:04:54,761 --> 00:04:56,510 O să înceapă de la bun început, 98 00:04:56,510 --> 00:04:58,820 ștergerea toate informațiile care este deja acolo. 99 00:04:58,820 --> 00:05:02,210 >> Întrucât, dacă îl deschideți pentru adăugarea, se va merge la sfârșitul fișierului 100 00:05:02,210 --> 00:05:04,340 dacă nu există deja în textul sau informații în ea, 101 00:05:04,340 --> 00:05:06,040 și va începe apoi scris de acolo. 102 00:05:06,040 --> 00:05:08,570 Deci nu va pierdeti nici unul din informațiile pe care le-ai facut inainte. 103 00:05:08,570 --> 00:05:12,110 Fie că doriți să scrie sau adăuga un fel de depinde de situația. 104 00:05:12,110 --> 00:05:16,840 Dar veți probabil știți ce operațiune drept este atunci când vine momentul. 105 00:05:16,840 --> 00:05:18,020 Așa că e fopen. 106 00:05:18,020 --> 00:05:18,930 >> Ce despre fclose? 107 00:05:18,930 --> 00:05:21,600 Ei bine, destul de simplu, fclose doar acceptă indicatorul de fișier. 108 00:05:21,600 --> 00:05:24,000 Și, după cum s-ar putea aștepta, se închide acel fișier. 109 00:05:24,000 --> 00:05:29,270 Și odată ce am închis un fișier, nu putem efectua mai fișier funcții I / O, 110 00:05:29,270 --> 00:05:31,420 citește sau scrie, pe acel fisier. 111 00:05:31,420 --> 00:05:36,444 Trebuie să re-deschideți fișier altă dată pentru 112 00:05:36,444 --> 00:05:38,610 să continue să lucreze cu l folosind funcțiile I / O. 113 00:05:38,610 --> 00:05:41,520 Înseamnă atât de fclose am terminat de lucru cu acest fișier. 114 00:05:41,520 --> 00:05:44,690 Și tot ce ne trebuie pentru a trece în este numele unui pointer fișier. 115 00:05:44,690 --> 00:05:50,010 Deci, pe un cuplu alunecă în urmă, am fopened fișier 1 punct text pentru citire 116 00:05:50,010 --> 00:05:52,854 și am alocat că fișier pointer la ptr1. 117 00:05:52,854 --> 00:05:55,020 Acum ne-am decis că suntem terminat de citit din acel fișier. 118 00:05:55,020 --> 00:05:56,561 Noi nu trebuie să facem mai cu ea. 119 00:05:56,561 --> 00:05:58,890 Putem ptr1 doar fclose. 120 00:05:58,890 --> 00:06:01,950 În mod similar și, am putea fclose celelalte. 121 00:06:01,950 --> 00:06:02,450 In regula. 122 00:06:02,450 --> 00:06:03,700 Deci care este de deschidere și închidere. 123 00:06:03,700 --> 00:06:05,780 Acestea sunt cele două de bază începerea operațiunilor. 124 00:06:05,780 --> 00:06:08,050 >> Acum vrem să de fapt, face unele lucruri interesante, 125 00:06:08,050 --> 00:06:11,940 și prima funcția pe care o vom vedea că va face acest lucru este fgetc-- 126 00:06:11,940 --> 00:06:14,110 depune obține un caracter. 127 00:06:14,110 --> 00:06:17,350 Asta e ceea ce, în general, fgetc s-ar traduce la. 128 00:06:17,350 --> 00:06:20,190 Scopul său în viață este să citiți următorul caracter, 129 00:06:20,190 --> 00:06:22,079 sau în cazul în care acest lucru este foarte dvs. Primul apel la fgetc 130 00:06:22,079 --> 00:06:23,870 pentru un anumit fișier, primul caracter. 131 00:06:23,870 --> 00:06:26,210 Dar apoi, după care, veți obține următoarea, 132 00:06:26,210 --> 00:06:31,500 chiar următorul caracter din dosar, și o stochează într-o variabilă caracter. 133 00:06:31,500 --> 00:06:34,490 Așa cum am făcut aici, char ch egal fgetc, 134 00:06:34,490 --> 00:06:36,389 trece în numele unui pointer fișier. 135 00:06:36,389 --> 00:06:38,180 Din nou, este foarte important să ne amintim 136 00:06:38,180 --> 00:06:41,430 că, pentru a avea această operațiune reuși, 137 00:06:41,430 --> 00:06:45,690 în sine indicatorul de fișier Cred că fost deschis pentru citire. 138 00:06:45,690 --> 00:06:50,589 Noi nu putem citi un caracter dintr-un fișier pointer că am deschis pentru scriere. 139 00:06:50,589 --> 00:06:52,630 Deci asta e una dintre cele mai limitări de fopen, nu? 140 00:06:52,630 --> 00:06:55,470 Trebuie să restricționeze ne doar la efectuarea 141 00:06:55,470 --> 00:06:57,710 o singură operație cu un singur indicator fișier. 142 00:06:57,710 --> 00:07:00,220 Dacă ne-am dorit să citească și scrie din același fișier, 143 00:07:00,220 --> 00:07:03,840 am avea deschise două separate, indicii de fișiere la același file-- 144 00:07:03,840 --> 00:07:05,670 unul pentru citire, una pentru scris. 145 00:07:05,670 --> 00:07:08,400 >> Deci, din nou, singurul motiv Aduc că acum este 146 00:07:08,400 --> 00:07:11,920 pentru că dacă vom face un apel la fgetc, că Probabil fișier pointer 147 00:07:11,920 --> 00:07:14,172 fost deschis pentru citire. 148 00:07:14,172 --> 00:07:15,880 Și apoi destul de simplu, tot ce trebuie să facem 149 00:07:15,880 --> 00:07:17,546 este trece în numele indicatorul fișierului. 150 00:07:17,546 --> 00:07:21,060 Deci, ch char egal ptr1 fgetc. 151 00:07:21,060 --> 00:07:23,200 >> Asta ne va lua character-- următor 152 00:07:23,200 --> 00:07:25,575 sau, din nou, în cazul în care acest lucru este primul timp am făcut acest apel, 153 00:07:25,575 --> 00:07:29,750 prima character-- indiferent fișier este indicat de ptr1. 154 00:07:29,750 --> 00:07:32,210 Amintiti-va ca asta a fost fișiere 1 punct text. 155 00:07:32,210 --> 00:07:36,490 Va primi primul caracter de care și vom păstra în CH variabilă. 156 00:07:36,490 --> 00:07:37,941 Destul de simplu. 157 00:07:37,941 --> 00:07:40,190 Deci ne-am uitat doar la trei funcții și deja am 158 00:07:40,190 --> 00:07:43,070 poate face ceva destul de elegant. 159 00:07:43,070 --> 00:07:46,320 >> Deci, dacă luăm această capacitate de a obține un caracter 160 00:07:46,320 --> 00:07:48,943 si noi bucla it-- așa că am continua pentru a obține de caractere 161 00:07:48,943 --> 00:07:51,390 dintr-un fișier de peste si peste si over-- acum ne 162 00:07:51,390 --> 00:07:54,500 poate citi fiecare Caracterul unui fișier. 163 00:07:54,500 --> 00:07:58,670 Și dacă ne imprima fiecare caracter imediat după am citit, 164 00:07:58,670 --> 00:08:01,960 am citit acum dintr-un fișier și tipărite conținutul său la ecranul. 165 00:08:01,960 --> 00:08:05,610 Am concatenate în mod eficient că fișier de pe ecran. 166 00:08:05,610 --> 00:08:09,670 Și asta e ceea ce Linux cat comandă face. 167 00:08:09,670 --> 00:08:13,250 >> Dacă tastați pisica în numele fișierului aceasta, va imprima întregul conținut 168 00:08:13,250 --> 00:08:15,160 a fișierului în fereastra terminal. 169 00:08:15,160 --> 00:08:19,010 Și așa această mică buclă aici, doar trei linii de cod, 170 00:08:19,010 --> 00:08:23,270 dar duplicate în mod eficient pisica comanda Linux. 171 00:08:23,270 --> 00:08:25,210 Deci, această sintaxă ar putea uite un pic ciudat, 172 00:08:25,210 --> 00:08:26,670 dar aici e ceea ce se întâmplă aici. 173 00:08:26,670 --> 00:08:31,460 În timp ce ch egal fgetc, ptr nu este egală cu EOF-- este un întreg îmbucătură, 174 00:08:31,460 --> 00:08:34,669 dar să-l rupe în jos doar asa ca e clar cu privire la sintaxa. 175 00:08:34,669 --> 00:08:37,169 Am consolidat de dragul de spațiu, 176 00:08:37,169 --> 00:08:39,049 deși este un pic sintactic dificil. 177 00:08:39,049 --> 00:08:41,194 >> Deci, această parte în drept verde acum, ceea ce o face? 178 00:08:41,194 --> 00:08:42,860 Ei bine, asta e doar apelul nostru fgetc, nu? 179 00:08:42,860 --> 00:08:44,530 Am mai văzut asta înainte. 180 00:08:44,530 --> 00:08:49,500 Se obține o caracter din fișierul. 181 00:08:49,500 --> 00:08:53,220 Apoi ne-am compara pe care Caracterul împotriva EOF. 182 00:08:53,220 --> 00:08:57,470 EOF este o valoare specială care este definite în io.h standard care 183 00:08:57,470 --> 00:08:59,390 este sfârșitul de caracter fișier. 184 00:08:59,390 --> 00:09:03,450 Deci, practic ce se va întâmpla este această buclă vor citi un caracter, 185 00:09:03,450 --> 00:09:07,445 compara-l la EOF, The sfârșitul de caracter fișier. 186 00:09:07,445 --> 00:09:10,070 În cazul în care nu se potrivesc, asa ca nu avem ajuns la sfârșitul fișierului, 187 00:09:10,070 --> 00:09:11,490 vom imprima caracterul afară. 188 00:09:11,490 --> 00:09:13,740 Apoi ne întoarcem la începând din bucla din nou. 189 00:09:13,740 --> 00:09:18,310 Vom primi un caracter, verificați împotriva EOF, imprima afară, și așa mai departe 190 00:09:18,310 --> 00:09:21,094 și așa mai departe și așa mai departe, looping prin în acest fel 191 00:09:21,094 --> 00:09:22,760 până am ajuns la sfârșitul fișierului. 192 00:09:22,760 --> 00:09:24,593 Și apoi de către acel moment, vom avea imprimat 193 00:09:24,593 --> 00:09:26,210 din întregul conținut al fișierului. 194 00:09:26,210 --> 00:09:29,450 Deci, din nou, am văzut numai fopen, fclose, și fgetc 195 00:09:29,450 --> 00:09:34,950 si deja putem duplica o comandă terminal de Linux. 196 00:09:34,950 --> 00:09:38,850 >> Așa cum am spus la început, am avut fgetc și fputc, 197 00:09:38,850 --> 00:09:41,860 și fputc a fost partenerul în funcție de fgetc. 198 00:09:41,860 --> 00:09:44,880 Și astfel, după cum s-ar putea imagina, aceasta este echivalentul scris. 199 00:09:44,880 --> 00:09:49,440 Acesta ne permite să scrie un caracter singur într-un fișier. 200 00:09:49,440 --> 00:09:53,290 >> Din nou, avertismentul fiind, doar cum a fost cu fgetc, fișierul 201 00:09:53,290 --> 00:09:56,660 că suntem scris trebuie să fi fost deschis pentru scris sau pentru adăugarea. 202 00:09:56,660 --> 00:10:00,820 Dacă încercăm și de a folosi fputc pe un fișier că am deschis pentru citire, 203 00:10:00,820 --> 00:10:02,760 vom suferi un pic de o greșeală. 204 00:10:02,760 --> 00:10:04,440 Dar apelul este destul de simplu. 205 00:10:04,440 --> 00:10:08,000 capitalul fputc Un ptr2, toate care va face este că e 206 00:10:08,000 --> 00:10:12,040 de gând să scrie scrisoarea în Un fișier în 2 puncte 207 00:10:12,040 --> 00:10:14,760 text, care a fost numele fișier pe care am deschis și sunt încadrate 208 00:10:14,760 --> 00:10:17,280 indicatorul de ptr2. 209 00:10:17,280 --> 00:10:20,430 Deci vom scrie de capital de la A la dosar 2 Textul punct. 210 00:10:20,430 --> 00:10:24,592 Și vom scrie o exclamație punctul de a depune 3 dot 211 00:10:24,592 --> 00:10:27,330 text, care a fost indicat de către ptr3. 212 00:10:27,330 --> 00:10:29,730 Deci, din nou, destul de simplă aici. 213 00:10:29,730 --> 00:10:32,727 >> Dar acum putem face un alt lucru. 214 00:10:32,727 --> 00:10:34,560 Avem acest exemplu am fost doar de gând peste 215 00:10:34,560 --> 00:10:38,950 despre a fi capabil de a reproduce pisica Comandă Linux, cel care imprimă 216 00:10:38,950 --> 00:10:40,500 la ecranul. 217 00:10:40,500 --> 00:10:43,510 Ei bine, acum că avem capacitatea de pentru a citi caractere de la fișiere 218 00:10:43,510 --> 00:10:46,590 și scrie caractere la fișiere, de ce nu ne-am înlocui că 219 00:10:46,590 --> 00:10:50,720 apel pentru a printf cu un apel la fputc. 220 00:10:50,720 --> 00:10:54,090 >> Și acum am duplicat cp, o comandă foarte de bază Linux 221 00:10:54,090 --> 00:10:59,100 despre care am vorbit drum lung acum în Linux comenzi video. 222 00:10:59,100 --> 00:11:01,070 Avem în mod eficient duplicat că aici. 223 00:11:01,070 --> 00:11:04,790 Suntem citirea unui caracter și apoi suntem scris că caracter un alt fișier. 224 00:11:04,790 --> 00:11:07,660 Citirea dintr-un fișier, scris la altul, peste si peste 225 00:11:07,660 --> 00:11:11,350 si peste din nou, până când am lovit EOF. 226 00:11:11,350 --> 00:11:14,250 Avem la sfârșitul fișier încercăm să copieze de la. 227 00:11:14,250 --> 00:11:18,500 Si de care ne vom scris toate dintre personaje care avem nevoie la dosar 228 00:11:18,500 --> 00:11:19,500 că suntem scris. 229 00:11:19,500 --> 00:11:24,270 Astfel încât acesta este cp, comanda de copiere Linux. 230 00:11:24,270 --> 00:11:26,550 >> Chiar de la începutul acest film, am avut avertismentul 231 00:11:26,550 --> 00:11:29,840 care ne-ar vorbi o pic despre indicii. 232 00:11:29,840 --> 00:11:32,480 Aici este în mod special în cazul în care suntem vorbi despre indicii 233 00:11:32,480 --> 00:11:34,800 în plus la dosar indicii. 234 00:11:34,800 --> 00:11:37,870 Deci, această funcție pare un fel de înfricoșător. 235 00:11:37,870 --> 00:11:39,120 Are mai mulți parametri. 236 00:11:39,120 --> 00:11:40,430 Există o mulțime întâmplă aici. 237 00:11:40,430 --> 00:11:42,760 Există o mulțime de diferite culori și texte. 238 00:11:42,760 --> 00:11:47,100 Dar, de fapt, e doar versiune generic de fgetc 239 00:11:47,100 --> 00:11:50,110 care ne permite pentru a obține orice cantitate de informații. 240 00:11:50,110 --> 00:11:53,560 Acesta poate fi un pic ineficient dacă suntem obtinerea caracterele unul la un moment dat, 241 00:11:53,560 --> 00:11:55,770 iterarea prin fișierul un caracter la un moment dat. 242 00:11:55,770 --> 00:12:00,230 Nu ar fi mai frumos pentru a obține 100 la un moment dat sau de 500 la un moment dat? 243 00:12:00,230 --> 00:12:03,250 >> Ei bine, fread și funcția sa de companie fwrite, care vom vorbi despre 244 00:12:03,250 --> 00:12:05,490 într-o a doua, ne permit să facem doar asta. 245 00:12:05,490 --> 00:12:08,480 Putem citi o sumă arbitrară de informații dintr-un fișier 246 00:12:08,480 --> 00:12:10,290 si l-am stoca undeva temporar. 247 00:12:10,290 --> 00:12:12,980 În loc de a fi capabil de a doar se potrivesc într-o singură variabilă, 248 00:12:12,980 --> 00:12:15,790 s-ar putea nevoie pentru a stoca într-o matrice. 249 00:12:15,790 --> 00:12:19,980 Și astfel, trecem în patru argumente pentru fread-- un pointer 250 00:12:19,980 --> 00:12:23,940 la locul unde suntem va pentru a stoca informații, 251 00:12:23,940 --> 00:12:29,180 cât de mare fiecare unitate de informații va fi, cât de multe unități de informații 252 00:12:29,180 --> 00:12:35,192 vrem să achiziționeze, și de la care fișierul vrem să le obține. 253 00:12:35,192 --> 00:12:37,150 Probabil cel mai bine ilustrat cu un exemplu aici. 254 00:12:37,150 --> 00:12:41,640 Deci, haideți să spunem că ne-am declara o serie de 10 numere întregi. 255 00:12:41,640 --> 00:12:45,080 Tocmai am declarat cu privire la stiva arbitrar int arr 10. 256 00:12:45,080 --> 00:12:46,970 Așa că e destul de simplu. 257 00:12:46,970 --> 00:12:51,970 Acum ceea ce facem, deși este frecall este ne citesc dimensiunea Int 258 00:12:51,970 --> 00:12:54,180 ori 10 octeți de informații. 259 00:12:54,180 --> 00:12:59,040 Mărimea Int ființei four-- asta e mărimea un număr întreg în c. 260 00:12:59,040 --> 00:13:02,790 >> Deci ceea ce facem e că sunteți de lectură 40 bytes valoare de informații 261 00:13:02,790 --> 00:13:05,850 din fișierul indicat de ptr. 262 00:13:05,850 --> 00:13:08,600 Si suntem stocarea celor 40 bytes undeva 263 00:13:08,600 --> 00:13:12,080 în cazul în care ne-am pus deoparte 40 bytes în valoare a memoriei. 264 00:13:12,080 --> 00:13:15,970 Din fericire, ne-am făcut deja că, prin declarând ARR, că matrice acolo. 265 00:13:15,970 --> 00:13:19,770 Că este capabil să mențină 10 unități de patru-byte. 266 00:13:19,770 --> 00:13:22,860 Deci, în total, poate deține 40 bytes valoare de informații. 267 00:13:22,860 --> 00:13:26,540 Și noi suntem acum citesc 40 de bytes de informații din dosar, 268 00:13:26,540 --> 00:13:30,330 si suntem o stocarea în arr. 269 00:13:30,330 --> 00:13:35,470 >> Amintiți de video pe indicii care numele unui tablou, cum ar fi ARR, 270 00:13:35,470 --> 00:13:38,370 este de fapt doar un pointer la primul element. 271 00:13:38,370 --> 00:13:43,680 Asa ca atunci cand vom trece în ARR acolo, ne-am sunt, de fapt, trecerea într-un pointer. 272 00:13:43,680 --> 00:13:46,120 >> În mod similar putem face asta: noi nu neapărat 273 00:13:46,120 --> 00:13:51,200 nevoie pentru a salva tampon nostru pe stiva. 274 00:13:51,200 --> 00:13:54,990 De asemenea, am putea aloca dinamic un tampon ca aceasta, folosind malloc. 275 00:13:54,990 --> 00:13:57,340 Amintiți-vă, atunci când am aloca dinamic memorie, 276 00:13:57,340 --> 00:14:00,550 suntem o economisire cu privire la morman, nu stiva. 277 00:14:00,550 --> 00:14:02,110 Dar este încă un tampon. 278 00:14:02,110 --> 00:14:06,810 >> Încă, în acest caz, este deține 640 octeți de informații 279 00:14:06,810 --> 00:14:09,230 pentru că o dublă preia opt bytes. 280 00:14:09,230 --> 00:14:11,570 Și noi cerem de 80 dintre ele. 281 00:14:11,570 --> 00:14:13,770 Vrem să dispună de un spațiu să dețină 80 de camere duble. 282 00:14:13,770 --> 00:14:17,210 Deci, de 80 de ori 8 informații 640 bytes. 283 00:14:17,210 --> 00:14:21,880 Și care apel la fread este colectarea de informații 640 bytes 284 00:14:21,880 --> 00:14:27,770 din fișierul indicat de ptr și stocarea acum în arr2. 285 00:14:27,770 --> 00:14:32,770 >> Acum putem trata, de asemenea, fread la fel ca o chemare la fgetc. 286 00:14:32,770 --> 00:14:37,140 În acest caz, suntem doar încercarea de a obține un caracter din fișierul. 287 00:14:37,140 --> 00:14:40,070 Și nu avem nevoie de o matrice de a deține un caracter. 288 00:14:40,070 --> 00:14:43,170 Putem doar stoca în o variabilă caracter. 289 00:14:43,170 --> 00:14:46,390 >> Captura, însă, este faptul că atunci când avem doar o variabilă, 290 00:14:46,390 --> 00:14:50,290 avem nevoie pentru a pasa ce adresa acelei variabile 291 00:14:50,290 --> 00:14:52,550 deoarece Reamintim că Primul argument pentru fread 292 00:14:52,550 --> 00:14:59,210 este un pointer la locul și memoria în cazul în care ne-o dorim pentru a stoca informația. 293 00:14:59,210 --> 00:15:01,550 Din nou, numele unui matrice este un pointer. 294 00:15:01,550 --> 00:15:04,200 Așa că nu trebuie să faci matrice ampersand. 295 00:15:04,200 --> 00:15:07,270 Dar C, caracterul c aici, nu este o matrice. 296 00:15:07,270 --> 00:15:08,390 E doar o variabilă. 297 00:15:08,390 --> 00:15:11,840 Și așa am nevoie pentru a trece o ampersand C pentru a indica 298 00:15:11,840 --> 00:15:15,350 că este adresa la care ne-o dorim pentru a stoca această un octet de informații, 299 00:15:15,350 --> 00:15:20,479 acest personaj care unul suntem colectarea de ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Voi trece prin acest un pic mai mult 301 00:15:22,270 --> 00:15:25,440 quickly-- este destul de mult echivalent exact al fread 302 00:15:25,440 --> 00:15:27,720 cu excepția e pentru scris în loc de lectură, doar 303 00:15:27,720 --> 00:15:31,610 ca other-- am avut deschis și aproape, pentru a primi un caracter, 304 00:15:31,610 --> 00:15:32,530 scrie un caracter. 305 00:15:32,530 --> 00:15:35,040 Acum e obține arbitrară cantitate de informații, 306 00:15:35,040 --> 00:15:37,170 cantitate arbitrară drept de informații. 307 00:15:37,170 --> 00:15:39,790 Deci, la fel ca înainte, putem au o serie de 10 numere întregi 308 00:15:39,790 --> 00:15:43,210 în cazul în care avem deja informațiile stocate, poate. 309 00:15:43,210 --> 00:15:46,580 >> Acesta a fost, probabil, unele linii de cod că ar trebui să meargă între aceste două 310 00:15:46,580 --> 00:15:49,990 unde am umple cu arr ceva semnificativ. 311 00:15:49,990 --> 00:15:51,880 Am umple cu 10 numere întregi diferite. 312 00:15:51,880 --> 00:15:54,920 Și în loc, ceea ce eu sunt face este scris de la arr 313 00:15:54,920 --> 00:15:58,600 și colectarea informațiilor de la ARR. 314 00:15:58,600 --> 00:16:02,390 Și eu iau această informație și punerea în fișierul. 315 00:16:02,390 --> 00:16:05,410 >> Deci, în loc de a fi de la fișierul în tampon, 316 00:16:05,410 --> 00:16:08,790 ne acum merge de la tamponul la dosar. 317 00:16:08,790 --> 00:16:10,580 Deci e doar invers. 318 00:16:10,580 --> 00:16:16,680 Deci, din nou, la fel ca înainte, putem au, de asemenea, o bucată grămadă de memorie 319 00:16:16,680 --> 00:16:19,600 care le-am dinamic alocate și citit de la care 320 00:16:19,600 --> 00:16:21,570 și scrie că la dosar. 321 00:16:21,570 --> 00:16:24,900 >> Și avem, de asemenea, o singură variabilă capabil să mențină un octet 322 00:16:24,900 --> 00:16:27,200 de informații, cum ar fi un personaj. 323 00:16:27,200 --> 00:16:29,830 Dar, din nou, avem nevoie pentru a trece în adresa de pe care variabile 324 00:16:29,830 --> 00:16:31,840 atunci când doriți să citiți de la ea. 325 00:16:31,840 --> 00:16:35,280 Deci, putem scrie informația găsim la acea adresă 326 00:16:35,280 --> 00:16:39,050 pentru indicatorul de fișiere, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Există o mulțime de alte mare de fișiere funcții I / O 328 00:16:41,630 --> 00:16:44,650 care fac diverse lucruri în afară de cele pe care le-am vorbit despre ziua de azi. 329 00:16:44,650 --> 00:16:46,450 Un cuplu a celor s-ar putea găsi utile 330 00:16:46,450 --> 00:16:50,840 sunt fgets și fputs, care sunt echivalente 331 00:16:50,840 --> 00:16:56,190 de fgetc și fputc dar pentru citirea un singur șir dintr-un fișier. 332 00:16:56,190 --> 00:16:59,020 În loc de un singur caracter, se va citi un întreg șir. 333 00:16:59,020 --> 00:17:02,940 fprintf, care permite practic să utilizați printf pentru a scrie pentru a depune. 334 00:17:02,940 --> 00:17:05,619 Deci, la fel ca tine poate face substituție variabilă utilizând 335 00:17:05,619 --> 00:17:09,900 substituenții la sută I și sută d, și așa mai departe, cu printf 336 00:17:09,900 --> 00:17:14,690 Puteți lua în mod similar șir printf și imprimare ceva 337 00:17:14,690 --> 00:17:16,800 așa într-un fișier. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- dacă aveți un DVD player este analogia obicei folosesc here-- 339 00:17:20,720 --> 00:17:23,109 este un fel de a utiliza înapoi și fast forward 340 00:17:23,109 --> 00:17:25,819 butoane pentru a vă deplasa în jurul valorii de film. 341 00:17:25,819 --> 00:17:28,369 În mod similar, vă puteți deplasa fișierul. 342 00:17:28,369 --> 00:17:30,250 Unul dintre lucrurile din interiorul ca structura de fișiere 343 00:17:30,250 --> 00:17:34,270 care c creează pentru tine este un indicator de unde vă aflați în fișierul. 344 00:17:34,270 --> 00:17:36,420 Sunteti la foarte începând, la octet zero,? 345 00:17:36,420 --> 00:17:39,290 Esti la octet 100, octet 1000, și așa mai departe? 346 00:17:39,290 --> 00:17:44,340 Puteți folosi pentru a muta arbitrar fseek că indicatorul înainte sau înapoi. 347 00:17:44,340 --> 00:17:46,744 >> Și ftell, din nou similar cu un DVD player, 348 00:17:46,744 --> 00:17:49,660 este ca un mic ceas care spune vă cât de multe minute și secunde 349 00:17:49,660 --> 00:17:52,480 sunt într-o anumită film. 350 00:17:52,480 --> 00:17:56,990 În mod similar, ftell tine cum spune mai multe bytes sunteți în fișierul. 351 00:17:56,990 --> 00:18:00,210 feof este o versiune diferită de a detecta dacă ați 352 00:18:00,210 --> 00:18:01,700 a ajuns la sfârșitul fișierului. 353 00:18:01,700 --> 00:18:03,600 Și ferror este o funcție care le puteți utiliza 354 00:18:03,600 --> 00:18:06,959 pentru a detecta dacă ceva are căzut de lucru in neregula cu un fișier. 355 00:18:06,959 --> 00:18:08,750 Din nou, aceasta este doar zgârierea suprafeței. 356 00:18:08,750 --> 00:18:12,730 Există încă o multime mai multe fișiere I / O funcții în io.h. standardul 357 00:18:12,730 --> 00:18:16,620 Dar acest lucru, probabil, va te a început să lucreze cu indicii de fișiere. 358 00:18:16,620 --> 00:18:17,640 Sunt Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Acest lucru este CS50. 360 00:18:19,750 --> 00:18:21,669