>> [REPRODUCCIÓ DE MÚSICA]
>> ZAMYLA CHAN: Anem a tractar de recuperar-se.
Recover és probablement la meva favorita PSET, i sobretot perquè crec que és
molt, molt cool.
Bàsicament, et donen una memòria arxius de la targeta en què
s'han eliminat les imatges.
Però, què vas a fer és recuperar tots ells.
>> D'acord.
Així que és realment emocionant, però potser un mica intimidatori, perquè ets
donat un arxiu C buida i vostè ha de omplir polz
OK, així que anem a trencar aquest en parts manejables.
Vostè voldrà obrir el arxiu de la targeta de memòria.
Això sembla bastant simple.
A continuació, cerqueu el principi d'una imatge JPG.
Tots els arxius d'aquesta memòria targetes seran arxius JPG.
Després, una vegada que trobi el principi, vostè va a obrir una nova JPG, que
està, com, crear un arxiu JPG, i escriure 512 byte a la vegada fins que un nou JPG és
trobat, i que acaba el programa, un cop detecta el final de l'arxiu.
>> Així que els primers passos primer és obrir l'arxiu de la targeta de memòria.
Però vostè ja sap això, i no hi ha una funció d'E / S d'arxiu que va a
resultar molt útil.
D'acord.
Quins són arxius JPG?
Perquè necessitem un principi.
Bé, arxius JPG, igual que els mapes de bits, són només les seqüències de bytes.
Per sort, cada JPG comença amb qualsevol 0xFF, 0xd8, 0xFF, 0xe0, una seqüència
de bytes, o una altra seqüència de bytes.
>> Així que els quatre bytes indiquen l'inici d'un arxiu JPG.
Ni més ni menys que aquestes dues combinacions de quatre bytes.
I per sort per a nosaltres, un altre fet que ens poden aprofitar és que cada
JPG s'emmagatzema de banda a banda a la targeta de memòria.
He representat a l'estructura d'un targeta de memòria esquemàticament en aquesta
llisqui aquí.
Aquí, cada plaça, cada rectangle, representa 512 bytes, i s'inicia
amb un color gris en el qual nosaltres no realment tenen un JPG.
>> Però llavors ens colpegem un bloc amb una estrella.
Això significa que els primers quatre bytes fora dels quals 512 són un dels dos
a partir de seqüències d'un arxiu JPG.
I anem a partir d'allí, i després un cop 01:00 JPG acaba, comença el següent.
Nosaltres no sempre tenim més espai gris en el medi.
>> Però, com podem llegir això, i llegir els 512 bytes de manera que puguem fer
la comparació el primer lloc?
Bé, tornem a fread, que pren en l'estructura que contindrà
els bytes que vostè està llegint.
Així que vas a posar els d'allà -
la mida, el nombre i, a continuació, inpointer que vostè està llegint.
Ara, volem llegir 512 alhora, i volem guardar això en un buffer,
Vaig a dir-.
>> Bàsicament, anem a celebrar en aquests 512 bytes i fer
coses amb ella, oi?
O bé anem a comparar la primera 04:00 bytes, o anem a
llegir-lo en, OK?
Amb això, el punter de dades serà llavors servirà com buffer, i la
inpointer, bé, això només va per ser la targeta de memòria.
>> De tornada al nostre esquema de targeta de memòria.
Anem a llegir 512 bytes alhora, emmagatzematge de cada bloc de 512 bytes
en un memòria intermèdia, la celebració en els esmorteir, els 512 bytes, fins que sapiguem
exactament què fer ells.
Així que al principi no és res, així anem a llegir el buffer, comparem, i
no haurem de fer alguna cosa amb ella.
I llavors, per fi colpegem un estel bloc, el que significa que hem
trobat la nostra primera JPG.
Així el tampó ara tenen bytes d'aquesta JPG.
>> La propera vegada que 512 bytes, perquè són no és un bloc de l'estrella, són també
part d'aquest JPG.
I els arxius JPG són contínues des d'allà des d'ara, fins que arribem a la següent JPG.
I a continuació, el tampó manté llavors 512 bytes perquè JPG, i
així successivament, i així successivament.
D'acord.
>> Així que una vegada que es prem el primer estrellat bloc, la primera JPG, com
en realitat, bé, obrir-lo?
Anem a fer un nou JPG.
Els noms d'arxiu per a un arxiu JPG van a estar en el format, nombre, nombre,
number.jpg, en què estan nomenats en l'ordre en què es troben,
a partir de 0.
>> Així que el primer que vostè JPG trobar seran 000.jpg.
Per tant, probablement és una bona idea per portar un registre de quants arxius JPG has trobat fins ara.
Així que aquest és el nom del fitxer.
Però, com realment fer això?
Bé, anem a utilitzar una funció sprintf flama.
Una mica similar a printf, on pot utilitzar marcadors de posició per a les cadenes,
excepte en aquest cas, sprintf imprimirà l'arxiu de sortida en el corrent
directori, no en el terminal.
>> D'acord.
Així que aquí veiem que tenim el títol, una matriu de caràcters que emmagatzemarà la
cadena resultant, i que passem a l' Títol de la cadena real amb un
marcador de posició, igual que hem après a veure amb printf.
Però el codi que tinc aquí donarà 2.jpg, no 002.jpg.
Així que vaig a deixar a vostè per esbrinar com modificar el marcador de posició perquè el
nom correcte.
>> D'acord.
Així que una vegada que has sprintf'd llavors es pot obrir aquest arxiu, perquè existeix en
seu directori, amb fopen, utilitzant la títol, i després el que sigui la manera que desitja
per obrir aquest arxiu polz
Així que ara que hem obert un nou arxiu JPG, Ara podem escriure 512 bytes en una
temps, fins que es trobi un nou JPG.
Així que anem a fer un altre cop d'ull en la sintaxi de fwrite.
>> Sé que estic mostrant aquesta diapositiva 1 molt, però jo només vull assegurar-me que
vostès no es posen massa confús, perquè Sé que és molt fàcil d'
barrejar la primera i l'última argument, en particular.
Però recordeu que vostè està escrivint des la memòria intermèdia en les imatges d'arxiu de sortida.
>> Ara que ja sap com el d'escriptura 512 bytes al fitxer JPG que vostè té
creat, així, volem deixar que procés un cop hem arribat al final de
la nostra targeta, ja que no serà més imatges que es troben.
Així que anem a tornar a fread un cop més, t'ho prometo.
fread retorna el nombre d'elements de mida, mida, estaven llests en èxit.
L'ideal és que això serà el es passa pel nombre, no?
Com que vostè està tractant de llegir el nombre d'elements de mida, la mida.
Però si fread no és capaç de llegir que nombre d'elements, llavors tornarà
qualsevol que sigui el nombre que va llegir correctament.
>> Ara bé, una cosa important a tenir en compte és que si s'utilitza un altre arxiu d'E / S
funcionen com fgetc, també tornarà quants articles es llegeix correctament.
El que és útil sobre aquesta funció és que si utilitza les funcions a l'interior d'un
condicions, que va a executar per si mateix mentre la determinació que la condició, que és
només realment útil.
Així que si vostè té aquestes condicions, per exemple, si memòria intermèdia fread, GOS sizeof, 2,
punter, és igual a és igual a 1, que vol dir que m'agradaria llegir
2 gossos a la vegada.
Però si fread retorna 1 en lloc de 2 com era d'esperar, que significa que hi ha 2
gossos deixen en el meu arxiu, però en lloc d'1.
Però si torna 2, llavors encara tinc aquests 2 gossos a l'interior de la meva memòria intermèdia.
>> Així que ara que et dóna una idea de com comprovar el final de l'arxiu, però
anem a passar per ara la lògica.
Com podem realment piece Tots d'aquests elements junts?
Quan vam arribar a la nostra primera JPG, ja sabem que els arxius JPG s'emmagatzemen
contiguament, estarem escrivint fins arribem al final de l'arxiu de targeta.
Però nosaltres no volem escriure res fins llavors.
Així que és important, no només que estem en l'inici d'una nova JPG, però si
que ja hem trobat un arxiu JPG o no.
>> Si avui és el començament d'una nova JPG, anem a vull tancar el nostre fitxer JPG actual si
comptem amb una oberta, i oberta un de nou per a escriure en.
Si no és el començament de la nova JPG, però, seguirem el mateix arxiu JPG
obrir i escriure-hi.
Escriurem el nostre buffer en què sigui Arxiu JPG que tenim oberta, sempre que
en tenim un obert, és clar.
Si no hem trobat la nostra primera JPG però, no escrivim res.
I aquest procés continua fins que arribar al final de l'arxiu de targeta.
>> I, finalment, vostè voldrà assegurar-se assegurar-se que qualsevol fclose
arxius que has fopened.
Una vegada que se sent còmode amb la conceptes, fer una ullada a alguns
pseudocodi, que he inclòs aquí.
En primer lloc, que vol obrir l'arxiu de la targeta, i després repetir el procés següent
fins que hagi assolit la extrem de la targeta.
Vols llegir 512 bytes en un memòria intermèdia.
L'ús d'aquest memòria intermèdia, vostè voldrà comprovar si vostè està en l'inici d'una
nova JPG o no.
I la resposta a aquesta pregunta es afectar la seva gestió d'arxius -
que els arxius que s'obrin, que els que no es tanquen.
>> Llavors, ja ha trobat un JPG?
Com has estat al corrent un registre d'això?
Després, en funció d'això, ja sigui que vostè escriure al JPG actual que
tenir oberta, o no escriure en absolut, perquè no ha trobat un JPG encara.
Finalment, una vegada que hagi arribat al final de l'arxiu, vostè voldrà tancar qualsevol
restants arxius que tingui oberts.
Volem ser ordenat aquí.
>> I amb això, que s'hagi recuperat tots els arxius que falten des d'aquesta memòria
targeta, que és una gesta bastant sorprenent.
Així que doneu un copet a l'esquena.
Però hi ha un element més a la PSET, que és el concurs.
Trobareu que totes les fotos que t'hagis recuperat estigui
fotos del personal del CS50.
Així que si estàs a l'escola o en algun lloc prop, llavors vostè pot fer fotos amb
el personal, i la secció que té el la majoria de les imatges amb els membres del personal
dels seus arxius recuperats es aconseguir un premi impressionant.
Amb això, llavors que hagi acabat la PSET recuperar-se.
El meu nom és Zamyla, i això és CS50.