>> ALTAVEU: Fins al moment, el més probable que la majoria dels seus programes
han estat una mica efímer.
Executar un programa com Mario o cobdiciós.
Ho fa alguna cosa, potser li demana l'usuari alguna informació,
imprimir alguna sortida a la pantalla, però després quan el programa ha acabat,
no hi ha realment cap evidència existeix Alguna vegada s'ha executat en el primer lloc.
Vull dir, és clar, que podria haver deixat s'obre a la finestra de terminal,
però si s'esborra la pantalla, hi ha Realment no hi ha evidència que va existir.
No tenim un mitjà d'emmagatzematge informació persistent, la informació
que hi ha després de la nostra programa ha deixat de funcionar,
o nosaltres no tenim fins a aquest punt.
Afortunadament, però, fa c ens proporcionen la capacitat
per fer-ho mitjançant la implementació cosa que es diu
un arxiu, una estructura que bàsicament representa un arxiu que vols duplicar
feu clic en l'equip, si estàs utilitzat per a un entorn gràfic d'usuari.
Generalment quan es treballa amb c, en realitat estem
va a estar treballant amb punters a archivos-- arxiu stars--
a excepció d'una mica quan parlem d'un parell
de les funcions que treballar amb punters d'arxius.
No ha de realment han cavat massa profund en la comprensió dels punters
si mateixos.
Hi ha una mica de petitíssima on parlarem d'ells,
però generalment presentar punters i punters, mentre que estan relacionats entre si,
no són exactament el mateix.
>> Ara, què vull dir quan Dic dades persistents?
Què són les dades persistents?
Per què ens importa això?
Dir, per exemple, que s'està executant un programa de
o que hagi reescrit 1 programa que és un joc,
i vol fer un seguiment de tots els moviments de l'usuari
de manera que potser si alguna cosa surt malament, pot revisar l'arxiu després del partit.
Això és el que volem dir quan parlar de dades persistents.
>> En el curs de l'execució del seu programa, es crea un arxiu.
I quan el seu programa ha deixat de funcionar,
aquest arxiu encara existeix en el sistema.
I podem veure-ho i examinar-lo.
I perquè el programa s'estableix en han creat algunes dades persistents,
existeixen dades després del programa ha acabat de executar-se.
>> Ara totes aquestes funcions que treballen amb la creació d'arxius i la manipulació
de diverses formes viure en io.h estàndard,
que és un arxiu de capçalera que probablement has estat lliures
incloent en la part superior de prou molt tots els teus programes
perquè conté una de les la majoria de funcions útils per a nosaltres,
printf, que també permet viu en io.h. estàndard
Així que vostè no ha de colpejar inclou els fitxers, probablement,
per tal de treballar amb els punters d'arxius.
>> Ara, cada funció de punter sol arxiu, o d'E / S, la sortida d'entrada cada arxiu que he
funció, accepta com un dels seus paràmetres o entrades
1 pointer-- arxiu excepte per un, fopen, que
és el que s'utilitza per a descarregar el fitxer punter en el primer lloc.
Però després d'haver obert la arxiva i s'obté apuntadors d'arxiu,
a continuació, pot passar a ells com arguments a les diverses funcions
anem a parlar sobre Avui en dia, així com molts altres
perquè pugui treballar amb arxius.
>> Així que hi ha sis bonica els bàsics comuns
que parlarem avui.
fopen i la seva companya funció fclose, fgetc
i la seva funció company fputc, i fread i la seva funció company,
fwrite.
Així que tindrem dret.
>> fopen-- què fa?
Bé, s'obre un arxiu i li dóna un apuntador d'arxiu a la mateixa,
de manera que vostè pot utilitzar aquest presentar punter com a argument
a qualsevol de les altres funcions d'E / S d'arxius.
El més important per recordar amb fopen
és que després d'haver obert la presentar o fet una crida com el que aquí,
cal comprovar per assegurar- que el punter que vas tornar
no és igual a null.
Si no has vist el vídeo en punters, això podria no tenir sentit.
Però si vostè tracta d'eliminar la referència un retir de punter nul,
el seu programa probablement patiran una segmentació [inaudible].
Volem assegurar-nos que ens van donar una volta punter legítim.
La gran majoria de les vegades ho farem han aconseguit un punter legítima volta
i no serà un problema.
>> Llavors, com fem una crida a fopen?
Es veu molt semblant a això.
Estrella Arxiu ptr-- ptr és un genèric nom de fitxer pointer-- fopen
i es passa a dues coses, un nom de fitxer i una operació que volem dur a terme.
Així que pot ser que tinguem una trucada que s'assembla a esto-- ptr estrella arxiu 1 és igual a fopen
file1.txt.
I l'operació que he triat és r.
>> Llavors, què creu vostè que r és aquí?
Quins són els tipus de coses que podria ser capaç de fer als arxius?
Així que r és l'operació que ens triar quan volem llegir un arxiu.
Així que, bàsicament, quan fem una crida com aquesta
estar rebent nosaltres un apuntador d'arxiu de tal manera que poguéssim després llegir la informació
des file1.txt.
>> De la mateixa manera, podríem obrir el fitxer 2.txt per escriure i perquè puguem passar ptr2,
el punter de l'arxiu que he creat aquí, com a argument per a qualsevol funció que
escriu informació en un arxiu.
I igual que l'escriptura, hi ha També l'opció d'annexar, a.
La diferència entre escriptura i afegint
és que quan s'escriu en un arxiu, si vostè fa una crida a fopen per a l'escriptura
i ja hi ha aquest arxiu, que és va a sobreescriure l'arxiu complet.
Això va a començar des del principi,
esborrant tota la informació això és ja allà.
>> Mentre que si l'obres per annexar, anirà a la final de l'arxiu
si ja hi ha text en o la informació en ell,
i continuació, s'iniciarà escriure des d'allà.
Així que vostè no perdrà cap dels la informació que has fet abans.
Tant si voleu escriure o annexar tipus de depèn de la situació.
Però vostè probablement sap el que el el funcionament adequat és quan arribi el moment.
Així que això és fopen.
>> Què passa amb fclose?
Bé, bastant simple, fclose Només accepta el punter d'arxiu.
I com era d'esperar, que tanqui aquest arxiu.
I una vegada que hem tancat un arxiu, no podem realitzar més funcions d'arxiu d'E / S,
llegir o escriure, en aquest arxiu.
Hem de tornar a obrir la presentar una altra vegada per tal
seguir treballant amb usant les funcions d'E / S.
Mitjans Així fclose hem acabat treballar amb aquest arxiu.
I tot el que necessitem per passar a és el nom d'un apuntador d'arxiu.
Així que en un parell fa llisca, ens fopened arxiu de text 1 punt per a la lectura
i assignem que presentar punter a ptr1.
Ara hem decidit que estem fet la lectura d'aquest arxiu.
Nosaltres no hem de fer res més amb ella.
Podem ptr1 simplement fclose.
I de manera similar, que podria fclose els altres.
Tot bé.
Així que ha d'obrir i tancar.
Aquests són els dos bàsica iniciar operacions.
>> Ara volem realitat fer algunes coses interessants,
i la primera funció que anem a veure que va a fer és fgetc--
presentar obtenir un caràcter.
Això és el que fgetc general es traduiria en.
El seu objectiu en la vida és llegir el següent caràcter,
o si aquest és el seu molt primera crida a fgetc
per a un arxiu en particular, el primer caràcter.
Però llavors després d'això, s'obté la següent,
el següent caràcter d'aquest arxiu, i l'emmagatzema en una variable de caràcter.
Com ho hem fet aquí, char ch equival fgetc,
Va esdevenir en el nom d'un apuntador d'arxiu.
Un cop més, és molt important aquí recordar
que per tal de tenir aquesta operació tingui èxit,
el punter del propi arxiu haver d'haver ha obert per lectura.
No podem llegir un personatge d'un arxiu punter que vam obrir per a l'escriptura.
Així que aquesta és una de les limitacions de fopen, oi?
Hem de restringir nosaltres mateixos només per fer
una operació amb un punter d'arxiu.
Si volguéssim llegir i escriure des del mateix arxiu,
tindríem obert sengles apuntadors d'arxiu a la mateixa file--
un per a la lectura, un per a l'escriptura.
>> Així que de nou, l'única raó Porto que fins ara és
perquè si anem a fer una trucada a fgetc, que deu haver apuntador d'arxiu
ha obert per lectura.
I llavors bastant simple, tot el que necessitem fer
és passar en el nom del fitxer apuntat.
Així char ch equival ptr1 fgetc.
>> Això va a treure'ns la següent character--
o de nou, si aquest és el primer el temps que hem fet aquesta crida,
la primera character-- de qualsevol arxiu està apuntat per ptr1.
Recordem que aquest era l'arxiu de text 1 punt.
Va a arribar el primer caràcter d'aquesta i nosaltres l'emmagatzemem a la ch variable.
Bastant senzill.
Així que només hem vist a les tres funcions i ja tenim
pot fer alguna cosa amb bona pinta.
>> Així que si tenim aquesta capacitat d'aconseguir un personatge
i bucle it-- així que continuar rebent caràcters
des d'un arxiu d'una i 1 i over-- ara
pot llegir cada caràcter d'un arxiu.
I si imprimim tots els personatges immediatament després de la llegim,
ara hem llegit d'un arxiu i impresa seu contingut a la pantalla.
Hem concatenats amb eficàcia aquest arxiu a la pantalla.
I això és el que el Linux comanda cat fa.
>> Si escriu gat al nom d'arxiu, imprimirà tot el contingut
de l'arxiu a la finestra del terminal.
I així, aquest petit bucle d'aquí, només tres línies de codi,
però duplica efectivament el gat de comandaments de Linux.
Així que aquesta sintaxi podria mirar una mica estrany,
però això és el que està passant aquí.
Mentre ch equival fgetc, ptr no és igual a EOF-- és tot un mos,
però anem a trencar just pel que és clar en la sintaxi.
He consolidar pel bé d'espai,
encara que és una mica sintàcticament complicat.
>> Així que aquesta part de la dreta verda ara, què està fent?
Bé, això és només la nostra crida fgetc, oi?
Hem vist això abans.
És l'obtenció d'un caràcter de l'arxiu.
Després comparem que caràcter contra EOF.
EOF és un valor especial que és es defineix en io.h estàndard, que
és el caràcter de fi d'arxiu.
Així que bàsicament el que passarà aquest bucle es llegirà un personatge,
comparar-lo amb EF, el caràcter de fi d'arxiu.
Si no coincideixen, de manera que no tenim arribat al final del fitxer,
anem a publicar aquell caràcter a terme.
Llavors anirem de nou a la principi del bucle de nou.
Anem a arribar a un personatge, comprovem contra EOF, imprimir-lo, etc.
i així successivament i així successivament, bucle a través d'aquesta manera
fins que hem arribat al final del fitxer.
I llavors en aquest moment, haurem impresa
a terme la totalitat del contingut de l'arxiu.
Així que de nou, només hem vist fopen, fclose i fgetc
i ja podem duplicar una ordre de terminal de Linux.
>> Com he dit al principi, vam tenir fgetc i fputc,
i fputc era el company funció de fgetc.
I així, com es pot imaginar, és l'escriptura equivalent.
Se'ns permet escriure una sol caràcter en un arxiu.
>> Un cop més, sent l'excepció, just com ho va ser amb fgetc, l'arxiu
que estem escrivint a ha d'haver estat obert per a escriure o per annexar.
Si tractem i utilitzem fputc en un arxiu que hem obert per a la lectura,
patirem una mica d'un error.
Però la trucada és bastant simple.
el capital fputc Un ptr2, tot que va a fer és que és
va a escriure la carta a A en un arxiu de 2 punts
text, que era el nom de la arxiu que vam obrir i assignem
el punter a PTR2.
Així que anem a escriure una A majúscula a l'arxiu de text 2 punts.
I anem a escriure una exclamació apuntar a presentar 3 punts
text, que va ser apuntat per ptr3.
Així que de nou, bastant senzill aquí.
>> Però ara podem fer una altra cosa.
Tenim aquest exemple només ens anàvem més
sobre ser capaç de replicar el gat Comandaments de Linux, la qual imprimeix
a la pantalla.
Bé, ara que tenim la capacitat llegir caràcters de fitxers
i escriure caràcters en arxius, ¿Per què no simplement substituïm que
trucar a printf amb una crida a fputc.
>> I ara que hem dupliquem cp, una ordre molt bàsic Linux
que hem parlat llarg camí Fa al Linux comandes vídeo.
Tenim efectivament duplicat que aquí.
Estem llegint un personatge i després estem escriure aquest personatge a un altre arxiu.
La lectura d'un arxiu, l'escriptura a un altre, una i altra
i una altra fins que colpegem EOF.
Tenim fins al final de la presentar estem tractant de copiar.
I amb això haurem escrit tot dels personatges necessitem l'arxiu
que estem escrivint a.
Així que això és cp, la comanda de còpia de Linux.
>> En el començament de aquest vídeo, jo tenia l'advertència
que anàvem a parlar una poc sobre els punters.
Aquí està específicament on som parlarem de punters
a més de presentar punters.
Així que aquesta funció es veu una mica de por.
Té diversos paràmetres.
Hi ha molt per fer aquí.
Hi ha un munt de diferents colors i textos.
Però, en realitat, és només el versió genèrica de fgetc
que ens permet obtenir qualsevol quantitat d'informació.
Pot ser una mica ineficient si som obtenir caràcters d'un en un,
iteració a través de l'arxiu un caràcter alhora.
¿No seria millor per aconseguir 100 a la vegada o 500 a la vegada?
>> Bé, fread i la seva funció company fwrite, el que anem a parlar de
en un segon, ens permeten fer precisament això.
Podem llegir una quantitat arbitrària d'informació d'un arxiu
i el emmagatzemem en algun lloc temporalment.
En lloc de ser capaç de simplement encaixar en una sola variable,
que podríem necessitar per emmagatzemar-lo en una matriu.
Així, es passa de cada quatre arguments per fread-- un punter
a la ubicació on som va a emmagatzemar la informació,
el gran que cada unitat d'informació serà, quantes unitats d'informació
volem adquirir, i des quin arxiu volem aconseguir-los.
Probablement el millor il·lustrat amb un exemple aquí.
Així que diguem que declarem un arranjament de 10 punts.
Ens hem declarat en la apilar arbitràriament int arr 10.
Així que això és bastant senzill.
Ara el que estem fent, encara que és el frecall és que estem mida de int llegint
temps de 10 bytes d'informació.
Mida de int ser four-- això és la mida d'un nombre enter al c.
>> Així que el que estem fent és que estem llegint 40 bytes per valor de la informació
des de l'arxiu apuntat per ptr.
I estem emmagatzemant els 40 bytes en algun lloc
on hem reservat 40 bytes per valor de la memòria.
Afortunadament, ja hem fet això per declarant arr, aquesta matriu allà mateix.
Això és capaç de mantenir 10 unitats de quatre bytes.
Així que en total, que pot contenir 40 bytes valor de la informació.
I ara estem llegint 40 bytes de la informació de l'arxiu,
i estem emmagatzemar-lo en arr.
>> Recordem el vídeo en punters que el nom d'una matriu, com arr,
és en realitat un punter al seu primer element.
Així que quan vam passar a arr allà, són, de fet, passant en un punter.
>> De la mateixa manera que podem fer esto-- No necessàriament
haurà de guardar el nostre buffer a la pila.
També podríem assignar dinàmicament un tampó com aquest, usant malloc.
Recordeu, quan assignar dinàmicament memòria,
estem estalviant en el munt, no la pila.
Però segueix sent un memòria intermèdia.
>> Encara, en aquest cas, és la celebració de 640 bytes d'informació
perquè una doble presa fins a vuit bytes.
I estem demanant 80 d'ells.
Volem tenir espai per celebrar 80 dobles.
Així que 80 vegades 8 és informació de 640 bytes.
I aquesta crida a fread és recollida de 640 bytes d'informació
des de l'arxiu apuntat per ptr i emmagatzemar ara en ARR2.
>> Ara també podem tractar fread igual que una crida a fgetc.
En aquest cas, només estem tractant de tenir un caràcter de l'arxiu.
I no necessitem un matriu per sostenir un personatge.
Només podem emmagatzemar-la en una variable de caràcter.
>> La captura, però, és que quan només tenim una variable,
hem de passar al direcció d'aquesta variable
perquè recordo que el primer argument de fread
és un punter a la ubicació i la memòria on volem emmagatzemar la informació.
Un cop més, el nom d'una array és un punter.
Així que no hem de fer arsenal signe.
Però c, el caràcter c aquí, no és una matriu.
És només una variable.
I així hem de passar un c ampersand per indicar
que aquesta és la direcció en la qual volem per emmagatzemar aquest un byte d'informació,
aquest caràcter que estem recollint el ptr.
Fwrite-- vaig a anar a través això una mica més
quickly-- és més o menys la equivalent exacte de fread
excepte que és per a l'escriptura en lloc de llegir, simplement
com l'altre-- que hem tingut oberta i prop, rebre un caràcter,
escriure un personatge.
Ara és aconseguir arbitrària quantitat d'informació,
quantitat arbitrària dret d'informació.
Així que igual que abans, podem tenir un arranjament de 10 sencers
on ja tenim la informació emmagatzemada, potser.
>> Va ser probablement algunes línies de codi que ha d'anar entre aquests dos
on ple jo arr amb alguna cosa significativa.
Ple amb 10 punts diferents.
I en el seu lloc, el que estic fent és escriure des arr
i la recol·lecció de la informació de arr.
I jo vaig a portar aquesta informació i posar-lo a l'arxiu.
>> Així que en lloc que sigui de l'arxiu a la memòria intermèdia,
ara estem passant de el buffer a l'arxiu.
Així que és just el contrari.
Així que de nou, igual que abans, podem també tenen un tros munt de memòria
que hem dinàmicament assignat i llegir a partir d'aquest
i escriure que a l'arxiu.
>> I també tenim una sola variable capaç de contenir un byte
de la informació, tal com un caràcter.
Però, de nou, hem de passar la direcció d'aquesta variable
quan volem llegir d'ell.
Així que podem escriure la informació ens trobem en aquesta direcció
al punter d'arxiu, ptr.
>> Hi ha un munt d'altres funcions de gran arxiu d'E / S
que fan diverses coses a més els que han parlat de l'actualitat.
Un parell dels que poden interessar
són fgets i fputs, que són l'equivalent
de fgetc i fputc però per a la lectura una única cadena d'un arxiu.
En lloc d'un sol caràcter, llegirà una cadena sencera.
fprintf, el que permet, bàsicament, utilitzar printf per escriure a l'arxiu.
Així que igual que vostè pot fer el la substitució de variables utilitzant
Els marcadors de posició per cent ii d cent, i així successivament, amb printf
pot igualment prendre la cadena printf i imprimir alguna cosa
de la mateixa manera que en un arxiu.
>> fseek-- si vostè té un reproductor de DVD és l'analogia que solen utilitzar aquí--
és una cosa així com l'ús de la seva rebobinat i avanç ràpid
per moure al voltant de la pel·lícula.
De la mateixa manera, pots moure't per l'arxiu.
Una de les coses a l'interior que l'estructura d'arxius
que c crea per a vostè és un indicador d'on es troba a l'arxiu.
Està vostè en el mateix començant, al byte zero?
Està vostè en el byte 100, byte de 1000, i així successivament?
Podeu utilitzar fseek moure arbitràriament aquest indicador cap endavant o cap enrere.
>> I ftell, de nou similar a un reproductor de DVD,
és com un petit rellotge que li diu quants minuts i segons li
estan en una pel·lícula en particular.
De la mateixa manera, ftell li diu com molts bytes que són a l'arxiu.
feof és una versió diferent de detectar si vostè té
arribat al final de l'arxiu.
I és una funció ferror que es pot utilitzar
per detectar si alguna cosa té anat de treball mal amb un arxiu.
Un cop més, això és només esgarrapar la superfície.
Encara hi ha molts més arxius d'E / S funcions en l'estàndard io.h.
Però això probablement aconseguir- començat a treballar amb punters d'arxius.
Sóc Doug Lloyd.
Això és CS50.