>> Vorbitor: Până în prezent, este probabil că cele mai multe dintre programele
au fost un pic efemer.
Executați un program ca Mario sau lacom.
Ea face ceva, poate cere utilizatorul de unele informații,
imprima o anumită printat pe ecran, dar apoi, când programul sa terminat,
nu există cu adevărat nici o dovadă acolo a fost rula vreodată în primul rând.
Adică, sigur, s-ar putea au lăsat deschide în fereastra terminalului,
dar dacă clar ecran, nu e într-adevăr nici o dovada ca a existat.
Noi nu avem un mijloc de stocare a informații persistente, informații
care există, după noastră Programul sa oprit de funcționare,
sau nu avea până la acest punct.
Din fericire însă, c nu ne oferă cu capacitatea de
pentru a face acest lucru prin punerea în aplicare a ceva numit
un fișier, o structură care, practic, reprezintă un fișier pe care le-ar dubla
click pe computerul dumneavoastră, dacă sunteți folosit într-un mediu grafic de utilizator.
În general, atunci când se lucrează cu C, suntem de fapt
va fi de lucru cu indicii pentru a files-- fișier stars--
cu excepția un pic atunci când vorbim despre un cuplu
a funcțiilor pe care lucra cu indicii de fișiere.
Nu aveți nevoie să fi săpat într-adevăr prea adânc în indicii înțelegerea
înșiși.
Există un pic Teeny unde vom vorbi despre ele,
dar, în general, și indicii fișier indicii, în timp ce interdependente,
nu sunt exact acelasi lucru.
>> Acum, ce vreau sa spun, atunci când Eu spun de date persistente?
Ce este de date persistente?
De ce nu ne pasă de asta?
Spune, de exemplu, că rulați un program de
sau le-ați rescris o program care este un joc,
si doriti să urmăriți de toate de miscari ale utilizatorului
astfel că poate dacă ceva nu merge bine, puteți consulta fișierul după meci.
Asta e ceea ce ne referim atunci când ne vorbim despre date persistente.
>> În cursul de a rula dvs. Programul, se creează un fișier.
Iar atunci când programul a oprit de funcționare,
acel fișier încă mai există pe sistemul dumneavoastră.
Si ne putem uita la ea și să examineze o.
Și astfel încât program ar fi setat la au creat unele date persistente,
Există date după programul a terminat de funcționare.
>> Acum toate aceste funcții care lucrează cu crearea de fișiere și manipularea
le în diverse moduri trăiesc în io.h standard
care este un fișier header care ai fost probabil lira
inclusiv la partea de sus a destul mult toate programele
deoarece conține una dintre cele mai cele mai multe funcții utile pentru noi,
printf, care vă permite, de asemenea, locuiește în io.h. standardul
Deci, tu nu trebuie să includă lira orice fișiere suplimentare, probabil,
în scopul de a lucra cu indicii de fișiere.
>> Acum, fiecare funcție fișier pointer, sau fiecare fișier I / O, ieșire de intrare
funcție, acceptă ca unul de parametrii sau intrările sale
un fișier cu excepția pointer-- pentru unul, fopen, care
este ceea ce se utilizează pentru a obține fișierul pointer în primul rând.
Dar după ce ați deschis fișier și veți obține indicii de fișiere,
atunci puteți trece-le ca argumente la diversele funcții
vom vorbi despre astăzi, precum și multe altele
astfel încât să puteți lucra cu fișiere.
>> Deci, există șase destul de cele de bază comune
că vom vorbi despre ziua de azi.
fopen și însoțitorul acestuia Funcția fclose, fgetc
și fputc funcția sa de companie, și fread și funcția sa de companie,
fwrite.
Așa că hai să-l direct in.
>> fopen-- ce face?
Ei bine, se deschide un fișier și îl vă oferă un pointer fișier pentru,
astfel încât să puteți folosi apoi că fișier pointer ca argument
la oricare dintre celelalte funcții I / O dosar.
Cel mai important lucru să-și amintească cu fopen
este că după ce ați deschis fișier sau făcut un apel ca cea de aici,
aveți nevoie pentru a verifica pentru a vă asigura că indicatorul care te-ai întors
nu este egal cu null.
Dacă nu ați vizionat video de pe indicii, acest lucru ar putea să nu aibă sens.
Dar dacă încerci și dereference o rechemare pointer nul,
probabil programul va avea de suferit o segmentare [neauzit].
Vrem să ne asigurăm că a primit un pointer înapoi legitim.
Marea majoritate a timpului vom au ajuns un pointer legitim înapoi
și nu va fi o problemă.
>> Deci, cum putem face un apel la fopen?
Se pare destul de mult ca aceasta.
Stele fișier ptr-- ptr a fi un generic nume pentru fișier pointer-- fopen
și trecem în două lucruri, un nume de fișier și o operațiune vrem să întreprindă.
Deci, am putea avea un apel care arata ca astea-- stele fișier ptr 1 este egal cu fopen
file1.txt.
Și funcționarea am ales este r.
>> Deci, ce crezi că r este aici?
Care sunt tipurile de lucruri pe care le ar putea fi capabil să facă la fișiere?
Deci r este operația pe care le alege atunci când doriți să citiți un fișier.
Deci, ne-ar, practic, atunci când vom face un apel ca aceasta
fi obtinerea noi înșine un indicator fișier astfel încât am putea citi informații atunci
din file1.txt.
>> În mod similar, am putea deschide fișierul 2.txt pentru scris și astfel încât să putem trece ptr2,
indicatorul de fișier am creat aici, ca un argument la orice funcție care
scrie informații într-un fișier.
Și similar cu scris, nu e de asemenea, opțiunea de a adăuga, a.
Diferența dintre scris și adăugarea
fiind că, atunci când scrie într-un fișier, dacă faci un apel la fopen pentru scris
și că fișierul există deja, e O să suprascrie întregul dosar.
O să înceapă de la bun început,
ștergerea toate informațiile care este deja acolo.
>> Întrucât, dacă îl deschideți pentru adăugarea, se va merge la sfârșitul fișierului
dacă nu există deja în textul sau informații în ea,
și va începe apoi scris de acolo.
Deci nu va pierdeti nici unul din informațiile pe care le-ai facut inainte.
Fie că doriți să scrie sau adăuga un fel de depinde de situația.
Dar veți probabil știți ce operațiune drept este atunci când vine momentul.
Așa că e fopen.
>> Ce despre fclose?
Ei bine, destul de simplu, fclose doar acceptă indicatorul de fișier.
Și, după cum s-ar putea aștepta, se închide acel fișier.
Și odată ce am închis un fișier, nu putem efectua mai fișier funcții I / O,
citește sau scrie, pe acel fisier.
Trebuie să re-deschideți fișier altă dată pentru
să continue să lucreze cu l folosind funcțiile I / O.
Înseamnă atât de fclose am terminat de lucru cu acest fișier.
Și tot ce ne trebuie pentru a trece în este numele unui pointer fișier.
Deci, pe un cuplu alunecă în urmă, am fopened fișier 1 punct text pentru citire
și am alocat că fișier pointer la ptr1.
Acum ne-am decis că suntem terminat de citit din acel fișier.
Noi nu trebuie să facem mai cu ea.
Putem ptr1 doar fclose.
În mod similar și, am putea fclose celelalte.
In regula.
Deci care este de deschidere și închidere.
Acestea sunt cele două de bază începerea operațiunilor.
>> Acum vrem să de fapt, face unele lucruri interesante,
și prima funcția pe care o vom vedea că va face acest lucru este fgetc--
depune obține un caracter.
Asta e ceea ce, în general, fgetc s-ar traduce la.
Scopul său în viață este să citiți următorul caracter,
sau în cazul în care acest lucru este foarte dvs. Primul apel la fgetc
pentru un anumit fișier, primul caracter.
Dar apoi, după care, veți obține următoarea,
chiar următorul caracter din dosar, și o stochează într-o variabilă caracter.
Așa cum am făcut aici, char ch egal fgetc,
trece în numele unui pointer fișier.
Din nou, este foarte important să ne amintim
că, pentru a avea această operațiune reuși,
în sine indicatorul de fișier Cred că fost deschis pentru citire.
Noi nu putem citi un caracter dintr-un fișier pointer că am deschis pentru scriere.
Deci asta e una dintre cele mai limitări de fopen, nu?
Trebuie să restricționeze ne doar la efectuarea
o singură operație cu un singur indicator fișier.
Dacă ne-am dorit să citească și scrie din același fișier,
am avea deschise două separate, indicii de fișiere la același file--
unul pentru citire, una pentru scris.
>> Deci, din nou, singurul motiv Aduc că acum este
pentru că dacă vom face un apel la fgetc, că Probabil fișier pointer
fost deschis pentru citire.
Și apoi destul de simplu, tot ce trebuie să facem
este trece în numele indicatorul fișierului.
Deci, ch char egal ptr1 fgetc.
>> Asta ne va lua character-- următor
sau, din nou, în cazul în care acest lucru este primul timp am făcut acest apel,
prima character-- indiferent fișier este indicat de ptr1.
Amintiti-va ca asta a fost fișiere 1 punct text.
Va primi primul caracter de care și vom păstra în CH variabilă.
Destul de simplu.
Deci ne-am uitat doar la trei funcții și deja am
poate face ceva destul de elegant.
>> Deci, dacă luăm această capacitate de a obține un caracter
si noi bucla it-- așa că am continua pentru a obține de caractere
dintr-un fișier de peste si peste si over-- acum ne
poate citi fiecare Caracterul unui fișier.
Și dacă ne imprima fiecare caracter imediat după am citit,
am citit acum dintr-un fișier și tipărite conținutul său la ecranul.
Am concatenate în mod eficient că fișier de pe ecran.
Și asta e ceea ce Linux cat comandă face.
>> Dacă tastați pisica în numele fișierului aceasta, va imprima întregul conținut
a fișierului în fereastra terminal.
Și așa această mică buclă aici, doar trei linii de cod,
dar duplicate în mod eficient pisica comanda Linux.
Deci, această sintaxă ar putea uite un pic ciudat,
dar aici e ceea ce se întâmplă aici.
În timp ce ch egal fgetc, ptr nu este egală cu EOF-- este un întreg îmbucătură,
dar să-l rupe în jos doar asa ca e clar cu privire la sintaxa.
Am consolidat de dragul de spațiu,
deși este un pic sintactic dificil.
>> Deci, această parte în drept verde acum, ceea ce o face?
Ei bine, asta e doar apelul nostru fgetc, nu?
Am mai văzut asta înainte.
Se obține o caracter din fișierul.
Apoi ne-am compara pe care Caracterul împotriva EOF.
EOF este o valoare specială care este definite în io.h standard care
este sfârșitul de caracter fișier.
Deci, practic ce se va întâmpla este această buclă vor citi un caracter,
compara-l la EOF, The sfârșitul de caracter fișier.
În cazul în care nu se potrivesc, asa ca nu avem ajuns la sfârșitul fișierului,
vom imprima caracterul afară.
Apoi ne întoarcem la începând din bucla din nou.
Vom primi un caracter, verificați împotriva EOF, imprima afară, și așa mai departe
și așa mai departe și așa mai departe, looping prin în acest fel
până am ajuns la sfârșitul fișierului.
Și apoi de către acel moment, vom avea imprimat
din întregul conținut al fișierului.
Deci, din nou, am văzut numai fopen, fclose, și fgetc
si deja putem duplica o comandă terminal de Linux.
>> Așa cum am spus la început, am avut fgetc și fputc,
și fputc a fost partenerul în funcție de fgetc.
Și astfel, după cum s-ar putea imagina, aceasta este echivalentul scris.
Acesta ne permite să scrie un caracter singur într-un fișier.
>> Din nou, avertismentul fiind, doar cum a fost cu fgetc, fișierul
că suntem scris trebuie să fi fost deschis pentru scris sau pentru adăugarea.
Dacă încercăm și de a folosi fputc pe un fișier că am deschis pentru citire,
vom suferi un pic de o greșeală.
Dar apelul este destul de simplu.
capitalul fputc Un ptr2, toate care va face este că e
de gând să scrie scrisoarea în Un fișier în 2 puncte
text, care a fost numele fișier pe care am deschis și sunt încadrate
indicatorul de ptr2.
Deci vom scrie de capital de la A la dosar 2 Textul punct.
Și vom scrie o exclamație punctul de a depune 3 dot
text, care a fost indicat de către ptr3.
Deci, din nou, destul de simplă aici.
>> Dar acum putem face un alt lucru.
Avem acest exemplu am fost doar de gând peste
despre a fi capabil de a reproduce pisica Comandă Linux, cel care imprimă
la ecranul.
Ei bine, acum că avem capacitatea de pentru a citi caractere de la fișiere
și scrie caractere la fișiere, de ce nu ne-am înlocui că
apel pentru a printf cu un apel la fputc.
>> Și acum am duplicat cp, o comandă foarte de bază Linux
despre care am vorbit drum lung acum în Linux comenzi video.
Avem în mod eficient duplicat că aici.
Suntem citirea unui caracter și apoi suntem scris că caracter un alt fișier.
Citirea dintr-un fișier, scris la altul, peste si peste
si peste din nou, până când am lovit EOF.
Avem la sfârșitul fișier încercăm să copieze de la.
Si de care ne vom scris toate dintre personaje care avem nevoie la dosar
că suntem scris.
Astfel încât acesta este cp, comanda de copiere Linux.
>> Chiar de la începutul acest film, am avut avertismentul
care ne-ar vorbi o pic despre indicii.
Aici este în mod special în cazul în care suntem vorbi despre indicii
în plus la dosar indicii.
Deci, această funcție pare un fel de înfricoșător.
Are mai mulți parametri.
Există o mulțime întâmplă aici.
Există o mulțime de diferite culori și texte.
Dar, de fapt, e doar versiune generic de fgetc
care ne permite pentru a obține orice cantitate de informații.
Acesta poate fi un pic ineficient dacă suntem obtinerea caracterele unul la un moment dat,
iterarea prin fișierul un caracter la un moment dat.
Nu ar fi mai frumos pentru a obține 100 la un moment dat sau de 500 la un moment dat?
>> Ei bine, fread și funcția sa de companie fwrite, care vom vorbi despre
într-o a doua, ne permit să facem doar asta.
Putem citi o sumă arbitrară de informații dintr-un fișier
si l-am stoca undeva temporar.
În loc de a fi capabil de a doar se potrivesc într-o singură variabilă,
s-ar putea nevoie pentru a stoca într-o matrice.
Și astfel, trecem în patru argumente pentru fread-- un pointer
la locul unde suntem va pentru a stoca informații,
cât de mare fiecare unitate de informații va fi, cât de multe unități de informații
vrem să achiziționeze, și de la care fișierul vrem să le obține.
Probabil cel mai bine ilustrat cu un exemplu aici.
Deci, haideți să spunem că ne-am declara o serie de 10 numere întregi.
Tocmai am declarat cu privire la stiva arbitrar int arr 10.
Așa că e destul de simplu.
Acum ceea ce facem, deși este frecall este ne citesc dimensiunea Int
ori 10 octeți de informații.
Mărimea Int ființei four-- asta e mărimea un număr întreg în c.
>> Deci ceea ce facem e că sunteți de lectură 40 bytes valoare de informații
din fișierul indicat de ptr.
Si suntem stocarea celor 40 bytes undeva
în cazul în care ne-am pus deoparte 40 bytes în valoare a memoriei.
Din fericire, ne-am făcut deja că, prin declarând ARR, că matrice acolo.
Că este capabil să mențină 10 unități de patru-byte.
Deci, în total, poate deține 40 bytes valoare de informații.
Și noi suntem acum citesc 40 de bytes de informații din dosar,
si suntem o stocarea în arr.
>> Amintiți de video pe indicii care numele unui tablou, cum ar fi ARR,
este de fapt doar un pointer la primul element.
Asa ca atunci cand vom trece în ARR acolo, ne-am sunt, de fapt, trecerea într-un pointer.
>> În mod similar putem face asta: noi nu neapărat
nevoie pentru a salva tampon nostru pe stiva.
De asemenea, am putea aloca dinamic un tampon ca aceasta, folosind malloc.
Amintiți-vă, atunci când am aloca dinamic memorie,
suntem o economisire cu privire la morman, nu stiva.
Dar este încă un tampon.
>> Încă, în acest caz, este deține 640 octeți de informații
pentru că o dublă preia opt bytes.
Și noi cerem de 80 dintre ele.
Vrem să dispună de un spațiu să dețină 80 de camere duble.
Deci, de 80 de ori 8 informații 640 bytes.
Și care apel la fread este colectarea de informații 640 bytes
din fișierul indicat de ptr și stocarea acum în arr2.
>> Acum putem trata, de asemenea, fread la fel ca o chemare la fgetc.
În acest caz, suntem doar încercarea de a obține un caracter din fișierul.
Și nu avem nevoie de o matrice de a deține un caracter.
Putem doar stoca în o variabilă caracter.
>> Captura, însă, este faptul că atunci când avem doar o variabilă,
avem nevoie pentru a pasa ce adresa acelei variabile
deoarece Reamintim că Primul argument pentru fread
este un pointer la locul și memoria în cazul în care ne-o dorim pentru a stoca informația.
Din nou, numele unui matrice este un pointer.
Așa că nu trebuie să faci matrice ampersand.
Dar C, caracterul c aici, nu este o matrice.
E doar o variabilă.
Și așa am nevoie pentru a trece o ampersand C pentru a indica
că este adresa la care ne-o dorim pentru a stoca această un octet de informații,
acest personaj care unul suntem colectarea de ptr.
Fwrite-- Voi trece prin acest un pic mai mult
quickly-- este destul de mult echivalent exact al fread
cu excepția e pentru scris în loc de lectură, doar
ca other-- am avut deschis și aproape, pentru a primi un caracter,
scrie un caracter.
Acum e obține arbitrară cantitate de informații,
cantitate arbitrară drept de informații.
Deci, la fel ca înainte, putem au o serie de 10 numere întregi
în cazul în care avem deja informațiile stocate, poate.
>> Acesta a fost, probabil, unele linii de cod că ar trebui să meargă între aceste două
unde am umple cu arr ceva semnificativ.
Am umple cu 10 numere întregi diferite.
Și în loc, ceea ce eu sunt face este scris de la arr
și colectarea informațiilor de la ARR.
Și eu iau această informație și punerea în fișierul.
>> Deci, în loc de a fi de la fișierul în tampon,
ne acum merge de la tamponul la dosar.
Deci e doar invers.
Deci, din nou, la fel ca înainte, putem au, de asemenea, o bucată grămadă de memorie
care le-am dinamic alocate și citit de la care
și scrie că la dosar.
>> Și avem, de asemenea, o singură variabilă capabil să mențină un octet
de informații, cum ar fi un personaj.
Dar, din nou, avem nevoie pentru a trece în adresa de pe care variabile
atunci când doriți să citiți de la ea.
Deci, putem scrie informația găsim la acea adresă
pentru indicatorul de fișiere, ptr.
>> Există o mulțime de alte mare de fișiere funcții I / O
care fac diverse lucruri în afară de cele pe care le-am vorbit despre ziua de azi.
Un cuplu a celor s-ar putea găsi utile
sunt fgets și fputs, care sunt echivalente
de fgetc și fputc dar pentru citirea un singur șir dintr-un fișier.
În loc de un singur caracter, se va citi un întreg șir.
fprintf, care permite practic să utilizați printf pentru a scrie pentru a depune.
Deci, la fel ca tine poate face substituție variabilă utilizând
substituenții la sută I și sută d, și așa mai departe, cu printf
Puteți lua în mod similar șir printf și imprimare ceva
așa într-un fișier.
>> fseek-- dacă aveți un DVD player este analogia obicei folosesc here--
este un fel de a utiliza înapoi și fast forward
butoane pentru a vă deplasa în jurul valorii de film.
În mod similar, vă puteți deplasa fișierul.
Unul dintre lucrurile din interiorul ca structura de fișiere
care c creează pentru tine este un indicator de unde vă aflați în fișierul.
Sunteti la foarte începând, la octet zero,?
Esti la octet 100, octet 1000, și așa mai departe?
Puteți folosi pentru a muta arbitrar fseek că indicatorul înainte sau înapoi.
>> Și ftell, din nou similar cu un DVD player,
este ca un mic ceas care spune vă cât de multe minute și secunde
sunt într-o anumită film.
În mod similar, ftell tine cum spune mai multe bytes sunteți în fișierul.
feof este o versiune diferită de a detecta dacă ați
a ajuns la sfârșitul fișierului.
Și ferror este o funcție care le puteți utiliza
pentru a detecta dacă ceva are căzut de lucru in neregula cu un fișier.
Din nou, aceasta este doar zgârierea suprafeței.
Există încă o multime mai multe fișiere I / O funcții în io.h. standardul
Dar acest lucru, probabil, va te a început să lucreze cu indicii de fișiere.
Sunt Doug Lloyd.
Acest lucru este CS50.