SPEAKER: Do sada, to je vjerojatno da je većina vaših programa bili malo prolazno. Možete pokrenuti program kao što je Mario ili Pohlepni. To čini nešto, to možda traži korisnik za neke informacije, ispisati neki izlaz na zaslonu, ali onda kada je vaš program je gotov, da stvarno nema dokaza postoji je ikada pokrenuti na prvom mjestu. Mislim, sigurno, možda ste napustili je otvoriti u prozoru terminala, ali ako očistiti ekran, tu je stvarno nema dokaza da je postojao. Mi nemamo sredstva pohranjivanja uporni informacije, informacije koji postoji nakon našeg Program je zaustavljen radi, ili nemamo i do ove točke. Srećom ipak, c ne nam mogućnost to učiniti implementacijom nešto što se zove datoteka, struktura koja u osnovi predstavlja datoteku koju će udvostručiti kliknite na vašem računalu, ako ste koristi u grafičkom korisničkom okruženju. Općenito kada se radi sa c, mi smo zapravo će raditi s upućuje na files-- datoteku stars-- osim malo kada govorimo o par od funkcija koje rad s datotečnim upućuje. Ne morate da se stvarno iskopa previše duboko u razumijevanje pokazivače same. Tu je malo teeny malo gdje ćemo razgovarati o njima, ali općenito podnijeti upućuje i naputke, a međusobno povezane, nisu baš ista stvar. Sada što mislim kad Kažem trajne podatke? Što je postojana podatke? Zašto mi je stalo do njega? Recimo, na primjer, da radite program ili ste prepisivati program koji je igra, a želite pratiti svih korisnikovih poteza tako da možda, ako nešto pođe po zlu, možete pregledati datoteku nakon utakmice. To je ono što mislimo kad smo razgovarati o postojanim podataka. U tijeku izvodi svoj program je datoteka stvorena. A kada vaš program je zaustavljen radi, da i dalje postoji datoteka na vašem sustavu. I možemo gledati na to i ispitati. I tako da program bi se postaviti na stvorili su neke trajne podatke, postoje podaci nakon programa dovršetka. Sada sve ove funkcije koje rade sa stvaranjem datoteke i manipulaciju ih na razne načine živjeti u standardnom io.h, što je zaglavlje datoteke koja vjerojatno ste bili funta uključujući na vrhu prilično koliko sve programe zato što sadrži jedan od većina korisne funkcije za nas, printf, koji također omogućuje živi u standardnom io.h. Dakle, ne morate se uključiti funta bilo kakve dodatne datoteke vjerojatno kako raditi s datotečnim upućuje. Sada svaki funkcija datoteka pokazivač, ili svaki file I / O, ulaz izlaz funkcija, prihvaća kao jedan njegovih parametara ili ulaza pointer-- datoteka osim za jedan, fopen, koji je ono što koristite da biste dobili datoteku pokazivač na prvom mjestu. No, nakon što ste se otvorila datoteka i dobiti datoteka pokazivače, onda možete ih proći kao Argumenti na raznim funkcijama ćemo govoriti o Danas, kao i mnogi drugi tako da možete raditi s datotekama. Dakle, postoje šest lijepa zajedničke temeljne one da ćemo razgovarati o danas. fopen i njegov suputnik Funkcija fclose, fgetc i njegov suputnik funkcija fputc, i fread i njegov suputnik funkcija, fwrite. Tako ćemo dobiti pravo na njega. fopen-- što učiniti? Pa, to otvara datoteku i daje vam datoteke pokazivač na njega, tako da onda možete koristiti kako file pokazivač kao argument bilo druge datoteke I / O funkcije. Najvažnija stvar zapamtiti s fopen je da nakon što su otvorena podnijeti ili se poziv poput one ovdje, morate provjerite je li da pokazivač koji se vratio nije jednako nuli. Ako niste gledali video na pokazivače, to ne bi imalo smisla. Ali ako pokušaš i dereference null pointer podsjetimo, Vaš program će vjerojatno patiti segmentiranja [nečujan]. Želimo biti sigurni da smo dobio legitimnu pokazivač leđa. Velika većina vremena ćemo dobivši legitiman pokazivač natrag a to neće biti problem. Pa kako ćemo napraviti poziv na fopen? Izgleda prilično ovako. Datoteka zvijezda ptr-- PTR kao generički naziv datoteke pointer-- fopen i prolazimo u dvije stvari, naziv datoteke i operacija želimo poduzeti. Tako smo mogli imati poziv koji izgleda kao this-- datoteka zvijezda PTR 1 jednak fopen file1.txt. I rad sam izabrao je r. Dakle, što misliš, je r ovdje? Koje su vrste stvari koje mogli učiniti da datoteke? Dakle, r je operacija koja se odabrati kada želimo čitati datoteku. Dakle, mi bi u osnovi, kada smo uputili poziv kao što je ovaj biti uzimajući sebi datotečni pokazivač tako da smo tada mogli pročitati podatke iz file1.txt. Isto tako, mogli bismo otvoriti datoteku 2.txt za pisanje i tako možemo proći ptr2, file pokazivač sam stvorio ovdje, kao argument za bilo koje funkcije piše podatke u datoteku. A slična pisanja, tu je i mogućnost da se dodati, a. Razlika između pisanje i dodavanjem se da kada pišete u datoteku, ako upućivanje poziva fopen za pisanje i da datoteka već postoji, to je će prebrisati cijeli datoteku. To će za početak na samom početku, brisanje svih informacija to je već tamo. Dok ako ga otvoriti dodavanjem, to će ići na kraju datoteke ako je već tekst ona ili informacije u njemu, a onda će početi pisanje od tamo. Tako nećete izgubiti bilo koji od Informacije koje ste učinili prije. Bilo da želite pisati ili dodati vrsta ovisi o situaciji. Ali vjerojatno ćete znati što je Pravo rad je kada za to dođe vrijeme. Dakle, to je fopen. Što je fclose? Pa, prilično jednostavno, fclose Samo prihvaća datoteke pokazivač. I kao što ste mogli očekivati, zatvara tu datoteku. I nakon što smo zatvorili datoteku, ne možemo obavljati bilo više datoteka I / O funkcije, čitanje ili pisanje na tu datoteku. Moramo ponovno otvoriti podnijeti još vremena kako bi nastaviti rad s to pomoću I / O funkcije. Dakle fclose znači da smo učinili rad s ovom datotekom. I sve što je potrebno da prođe u je naziv datoteke pokazivača. Dakle, na par dana tobogan, mi fopened datoteka 1 točka tekst za čitanje a mi koji dodjeljuje file pokazivač ptr1. Sada smo odlučili smo učinjeno čitanje iz te datoteke. Ne moramo učiniti više s njom. Možemo samo fclose ptr1. A isto tako, mogli bismo fclose one druge. U redu. Tako da je otvaranje i zatvaranje. To su dva osnovna s početkom poslovanja. Sada želimo da se zapravo učiniti neke zanimljive stvari, i prva funkcija da ćemo vidim da će to učiniti je fgetc-- file dobiti karakter. To je ono što se općenito fgetc bi prevesti na. Njegov cilj u životu je pročitajte sljedeći znak, ili ako je to vaš vrlo Prvi poziv na fgetc za određenu datoteku, Prvi znak. Ali onda nakon toga, dobivate sljedeći, već sljedećeg karakter te datoteke, i pohranjuje ga u varijablu znakova. Kao što smo učinili ovdje, char ch jednak fgetc, prolaze u ime datoteke pokazivača. Opet, to je vrlo važno ovdje zapamtiti da bi se ima ova operacija uspije, file sama pokazivač Mora otvoren za čitanje. Ne možemo pročitati lik iz datoteke Pokazivač da smo otvorili za pisanje. Dakle, to je jedan od Ograničenja fopen, zar ne? Moramo ograničiti sami samo na obavljanje jedna operacija s jednim pokazivačem datoteke. Ako smo htjeli čitati i pisati iz iste datoteke, bismo imali otvorene dvije odvojene file upućuje na istom file-- jedan za čitanje, jedan za pisanje. Pa opet, jedini razlog Donosim da do sada jer ako ćemo napraviti poziv da fgetc, datoteka pokazivač Mora otvoren za čitanje. I onda lijepo jednostavno, sve što trebate učiniti je proći u ime datoteke pokazivača. Dakle char ch jednak fgetc ptr1. To će nam doći sljedeći character-- ili opet, ako je to prvi Vrijeme smo napravili ovaj poziv, prvi character-- bez obzira Datoteka je ukazao na koju ptr1. Sjetite se da je to datoteka 1 točka tekst. To će dobiti prvi znak da je a mi ćemo ga pohraniti u varijablu ch. Prilično jednostavan. Tako smo gledao samo na tri funkcije i već smo može učiniti nešto prilično uredan. Dakle, ako uzmemo tu sposobnost dobivanje znaka a mi petlje it-- pa smo nastaviti da biste dobili znakova iz datoteke tijekom i više i over-- sada smo može čitati svaki karakter datoteke. A ako ćemo ispisati svaki lik Odmah nakon što smo ga čitali, sada smo pročitali iz datoteke i tiskani njezin sadržaj na zaslonu. Mi smo spojeni učinkovito koji datoteka na zaslonu. I to je ono što je Linux naredbe mačka radi. Ako upišete mačka u nazivu datoteke ga, će ispisati cijeli sadržaj datoteke u prozoru terminala. I tako ovaj mali petlje ovdje samo tri linije koda, ali učinkovito duplicira Linux naredbe mačka. Dakle, ovo sintaksa moglo izgleda malo čudno, ali ovdje je ono što se događa ovdje. Dok ch jednak fgetc, PTR nije jednaka EOF-- to je sasvim mala količina, ali neka je to break down jednostavno tako da je jasno na sintaksi. Ja sam to konsolidirano zbog prostora, iako je malo sintaktički lukav. Dakle, ovo je dio u zelenoj prava Sada, što se to radi? Pa, to je samo naš fgetc poziv, zar ne? Vidjeli smo da je prije. To je dobivanje jednog lik iz datoteke. Onda smo usporediti karakter protiv EOF. EOF je posebna vrijednost koja je definirana u standardnom io.h, koji je kraj datoteke karaktera. Tako je u osnovi ono što će se dogoditi je ova petlja će pročitati lik, usporedite ga EOF je kraj datoteke karaktera. Ako oni ne odgovaraju, tako da nemamo do kraja datoteke, ćemo ispisati taj lik. Onda ćemo se vratiti na početak petlje opet. Mi ćemo dobiti znak, provjerite Protiv EOF, print it out, i tako dalje i tako dalje i tako dalje, petlje kroz na taj način dok smo došli do kraja datoteke. I onda po tom pitanju, ćemo ispisati kako cijeli sadržaj datoteke. Pa opet, mi samo smo vidjeli fopen, fclose i fgetc a već možemo ponoviti Linux terminala naredbe. Kao što sam rekao na početku, imali smo fgetc i fputc, i fputc je suputnik funkcija fgetc. I tako, kao što ste mogli zamisliti, to je pisanje ekvivalent. To nam omogućuje da napisati jedan znak u datoteku. Opet, caveat se, samo kao što je to bilo s fgetc, datoteka da smo pismeno morao biti otvorena za pisanje ili dodavanjem. Ako ćemo pokušati i koristiti fputc na datoteku da smo otvorili za čitanje, ćemo trpjeti malo pogreške. No, poziv je vrlo jednostavna. fputc prijestolnica ptr2, sve što će učiniti je da je će napisati pismo u u datoteku 2. točke tekst, što je naziv podnijeti da smo otvorili i dodjeljuje pokazivač ptr2. Tako ćemo napisati kapital od A do datoteka 2 dot tekst. A mi ćemo pisati uzvik ukazuju da podnese 3 točka Tekst, koji je istaknuo da se od ptr3. Pa opet, prilično jednostavan ovdje. No, sada možemo učiniti još jednu stvar. Imamo ovaj primjer samo smo išli preko o bitak u mogućnosti replicirati mačku Linux naredba, onaj koji ispisuje na zaslonu. Pa, sada kada imamo mogućnost čitati znakove iz datoteka i pisati znakove u datoteke, zašto ne bismo jednostavno zamijeniti da poziv na printf s pozivom na fputc. I sada smo umnožavati CP, vrlo osnovni Linux naredbe da smo razgovarali o tako dugo Prije u Linux naredbe video. Imamo učinkovito umnožavati da upravo ovdje. Mi čitanje karaktera, a zatim smo pisanje da je lik na drugu datoteku. Čitanje iz jedne datoteke, pisanje na drugu, više i više i iznova dok ne pogoditi EOF. Moramo do kraja od file mi pokušavamo kopirati s. I da ćemo napisali sve od likova moramo datoteke da mi pismeno. Dakle, to je cp, Linux primjerak naredbe. Na samom početku ovaj video sam imao upozorenje da ćemo pričati malo o pokazivače. Ovdje je posebno gdje smo će govoriti o pokazivače osim da podnese naputke. Dakle, ova funkcija izgleda nekako zastrašujuće. To je dobio nekoliko parametara. Postoji mnogo događa ovdje. Postoji mnogo različitih Boje i tekstovi. Ali zapravo, to je samo generička verzija fgetc koji nam omogućuje da se bilo Količina informacija. To može biti malo neučinkovita ako smo dobivanje znakove jedan po jedan, iterating kroz datoteke jedan znak na vrijeme. Ne bi li bilo ljepše da se 100 na vrijeme ili 500 na vrijeme? Pa, fread i njegov suputnik funkcija fwrite, koje ćemo razgovarati o u drugi, dopustite nam da učinite upravo to. Možemo pročitati proizvoljan iznos informacija iz datoteke a mi ga pohraniti negdje privremeno. Umjesto da bude u mogućnosti da se samo stane ga u jednoj varijabli, mogli bismo ga morati pohraniti u niz. I tako, prolazimo u četiri argumenti za fread-- pokazivač do mjesta gdje smo ide za pohranu podataka, koliko je velika svaka jedinica podataka će biti, koliko jedinica podataka želimo steći, i od koje datoteke želimo ih dobiti. Vjerojatno je najbolje prikazano s primjerom ovdje. Dakle, recimo da mi izjavljujemo niz od 10 brojeva. Upravo smo proglasio na stog samovoljno int ARR 10. Dakle, to je prilično jednostavan. Što radimo iako Sada je frecall se mi čita veličinu int puta po 10 bajtova podataka. Veličina int bića four-- to veličina cijeli broj u c. Dakle, ono što mi radimo je da smo čitanje 40 bajtova vrijedi informacija iz spisa je ukazao na koju PTR. I mi smo pohranjivanje onima 40 bajtova negdje gdje smo postavili na stranu 40 bajtova vrijedan pamćenja. Srećom, već smo učinili da do izjavljujući ARR, kako niz upravo tamo. Da je sposoban za držanje 10 četiri bajta jedinice. Tako je u ukupno, to može držati 40 bajtova vrijedan informacija. A mi smo sada čitanja 40 bajtova informacija iz datoteke, a mi smo ga pohrane u ARR. Podsjetimo iz video na upućuje da naziv niza, kao što ARR, stvarno samo pokazivač na prvom elementu. Dakle, kada prolazimo u ARR tamo, su, u stvari, prolazi u pokazivača. Slično možemo učiniti this-- mi ne nužno morate spasiti naš tampon na stog. Mi također može dinamički alocirati tampon ovako, pomoću malloc. Zapamtite, kada smo dinamički alocirati memoriju, mi smo ga štedi na gomila, a ne snop. Ali to je još uvijek tampon. Još uvijek, u ovom slučaju, je drži 640 bajtova podataka jer dvostruka zauzima osam bajtova. A mi tražimo za 80 od njih. Želimo imati prostora držati 80 parovima. Dakle, 80 puta 8 je 640 bajtova podataka. I to poziv na fread je prikupljanje 640 bajtova podataka iz spisa je ukazao na koju PTR i pohranjivanje sada u arr2. Sada možemo liječiti fread baš kao poziv na fgetc. U ovom slučaju, mi samo pokušavamo dobiti jedan lik iz datoteke. A mi ne trebaju Niz održati karakter. Mi samo možemo pohraniti u varijabla karakter. Kvaka je, međutim, da je kad smo samo varijablu, moramo proći u adresu te varijable jer Sjetite se da je Prvi argument za fread je pokazivač na mjesto i memorije gdje želimo pohraniti podatke. Opet, ime i prezime Niz je pokazivač. Dakle, ne trebamo učiniti ampersand niz. Ali c, znak c Ovdje, nije niz. To je samo varijabla. I tako moramo proći znak za struju c naznačiti da je to adresa na kojoj želimo pohraniti ovaj jedan bajt podataka, ovaj jedan lik koji smo prikupljanje iz PTR. Fwrite-- ću proći ovo malo više quickly-- je ljepušan velik dio Točan ekvivalent fread osim što je za pisanje umjesto čitanja, samo poput other-- smo imali otvorene te u neposrednoj blizini, dobiti lik, napišite znak. Sada je mogao proizvoljna Količina informacija, Pravo proizvoljna količina podataka. Dakle, baš kao i prije, možemo imaju niz od 10 brojeva gdje smo već Podaci pohranjeni, možda. To je vjerojatno neka linija koda koji bi trebao ići između ove dvije gdje sam ispuniti ARR s nešto suvislo. Ja ispunite ga s 10 različitih brojeva. I umjesto što sam radi se od pisanja ARR i prikupljanje informacija od ARR. I Vodim te podatke i stavljajući ga u datoteku. Dakle, umjesto da bude iz datoteka u međuspremnik, sada idemo iz tampon na datoteku. Tako da je upravo obrnuto. Pa opet, baš kao i prije, možemo također imaju hrpu komad memorije koje smo dinamički dodjeljuje i čitati iz toga i napisati da u datoteku. I mi također imaju jednu varijablu sposoban za držanje jedan bajt informacija, kao što je lik. Ali opet, mi moramo proći adresu te varijable kada želimo čitati iz nje. Tako možemo napisati podatke nailazimo na toj adresi u datoteku pokazivač, PTR. Postoji mnogo drugih veliki file I / O funkcije kako napraviti razne stvari osim one što smo razgovarali o tome danas. Nekoliko onih možda ćete naći korisne su fgets i fputs, koje su ekvivalent od fgetc i fputc, ali za čitanje jedan string iz datoteke. Umjesto jednog lika, to će pročitati cijeli niz. fprintf, koji u osnovi omogućuje korištenje printf pisati u datoteku. Dakle, baš kao što se može učiniti varijabla zamjena korištenja rezerviranih mjesta posto ja i posto d, i tako dalje, s printf što slično može uzeti printf string i ispisati nešto kao što je to u datoteku. fseek-- ako imate DVD player je analogija Ja obično koriste here-- je vrsta poput koristeći svoje premotavati i brzo naprijed tipke za pomicanje film. Isto tako, možete kretati datoteke. Jedna od stvari unutar da struktura datoteke da c stvara za vas je pokazatelj gdje ste u spisu. Jeste li na samom s početkom, na byte nula? Jeste li u bajtu 100, byte 1000, i tako dalje? Možete koristiti fseek samovoljno pomicati da Indikator naprijed ili natrag. I ftell, opet sličan DVD player, je kao mali sat koji govori ti koliko minuta i sekundi su se u određenom film. Slično tome, ftell vas kako govori mnogi bajtova ste u datoteku. feof je drugačija verzija otkrivanja li ste do kraja datoteke. I ferror je funkcija koje možete koristiti otkriti je li nešto mora pošlo krivo rad s datotekom. Opet, to je samo grebanje površine. Tu je još mnogo više datoteka I / O funkcije u standardnoj io.h. Ali to će vjerojatno dobiti počeo raditi s datotečnim upućuje. Ja sam Doug Lloyd. To je cs50.