>> [GIOCO MUSICA]
>> ZAMYLA CHAN: Affrontiamo recuperare.
Recuperare è probabilmente il mio preferito PSET, e soprattutto perché penso che sia
davvero, davvero cool.
In sostanza, si è dato un ricordo file di carte in cui
le immagini sono state cancellate.
Ma che cosa avete intenzione di fare è recuperare tutti.
>> OK.
Quindi è davvero emozionante, ma forse un po 'intimidatorio, perché sei
dato un file C vuota e devi riempire dentro
Ok, quindi cerchiamo di rompere questo in parti gestibili.
Avrai voglia di aprire il file della scheda di memoria.
Che sembra abbastanza semplice.
Quindi, individuare l'inizio di un'immagine JPG.
Tutti i file presenti in questa memoria carta stanno per essere JPG.
Poi, una volta trovato l'inizio, si sta andando ad aprire un nuovo JPG, che
è, come creare un file JPG, e scrivere 512 byte alla volta fino a quando un nuovo JPG è
trovato, e termina il programma, una volta si rileva la fine del file.
>> Così i primi passi prima è di aprire il file della scheda di memoria.
Ma si conosce già questo, e non c'è una funzione di I / O di file che sta per
rivelarsi molto utile.
OK.
Quindi quali sono JPG?
Perché abbiamo bisogno di principio esso.
Beh, JPG, proprio come le mappe di bit, sono solo sequenze di byte.
Per fortuna, ogni JPG inizia con uno 0xFF, 0xd8, 0xFF, 0xe0, una sequenza
di byte o un'altra sequenza di byte.
>> Così quei quattro byte indicano l'inizio di un JPG.
Niente meno che queste due combinazioni di quattro byte.
E fortunatamente per noi, un altro fatto che ci possono trarre vantaggio è che ogni
JPG viene memorizzato side-by-side sulla scheda di memoria.
Ho rappresentato la struttura di un scheda di memoria schematicamente su questo
far scorrere qui.
Qui, ogni piazza, ogni rettangolo, rappresenta 512 byte, e si inizia
con un grigio che non lo facciamo davvero un JPG.
>> Ma poi abbiamo finalmente raggiunto un blocco con una stella.
Ciò significa che i primi quattro byte su di questi 512 sono uno di questi due
partendo sequenze di un JPG.
E andiamo da lì, e poi una volta una JPG termina, il successivo inizia.
Noi non abbiamo mai più spazio grigio in-between.
>> Ma come possiamo effettivamente leggiamo questo, e leggere i 512 byte in modo che possiamo fare
il confronto primo luogo?
Bene, torniamo a fread, che prende nella struttura che conterrà
i byte che stai leggendo.
Quindi stai andando a mettere quelli in là -
la dimensione, il numero, e poi inpointer che stai leggendo da.
Ora, vogliamo leggere 512 alla volta, e vogliamo conservare questo in un buffer,
Ho intenzione di chiamarlo.
>> In sostanza, stiamo andando a tenere su quei 512 byte e da fare
cose con esso, giusto?
Stiamo sia andando a confrontare il primo quattro byte, o stiamo per
leggerlo in, OK?
Allora il puntatore dati sarà poi servire come buffer, e il
inpointer, bene, questo è solo andare per essere la scheda di memoria.
>> Torna alla nostra schematica scheda di memoria.
Stiamo andando a leggere 512 byte alla volta, memorizzare ogni blocco di 512 byte
in un buffer, trattenendo quelle tampone, questi 512 byte, finché non sapremo
esattamente cosa fare di loro.
Così l'inizio non è niente, quindi ci leggiamo il buffer, confrontiamo, e
non avremo bisogno di fare qualsiasi cosa con esso.
E poi, abbiamo finalmente raggiunto una stella blocchiamo, il che significa che abbiamo
trovato il nostro primo JPG.
Così il buffer detengono ormai byte da quel JPG.
>> La prossima volta 512 byte, perché sono Non un blocco stella, sono anche
parte di quel JPG.
E JPG sono continue da lì dentro, fino a quando abbiamo raggiunto il prossimo JPG.
E poi il buffer contiene poi 512 byte per quel JPG, e
così via, e così via.
OK.
>> Quindi, una volta colpito il primo stellato blocco, la prima JPG, come si fa
in realtà, beh, aprirlo?
Facciamo un nuovo JPG.
I nomi dei file per un JPG stanno per essere nel formato, numero, numero,
number.jpg, in che stanno nominati in l'ordine in cui si trovano,
partendo da 0.
>> Quindi la prima JPG che si trovare saranno 000.jpg.
Quindi, probabilmente una buona idea per tenere traccia di quante JPG hai trovato finora.
Ecco, questo è il nome del file.
Ma come si fa effettivamente fare che?
Beh, stiamo andando a utilizzare un funzione chiamata sprintf.
Un po 'simile a printf, dove è possibile utilizzare segnaposto per archi,
tranne che in questo caso, sprintf stamperà il file nella corrente
Elenco, non nel terminale.
>> OK.
Quindi qui si vede che abbiamo titolo, un array di char che memorizzerà l'
stringa risultante, e passiamo in titolo della stringa effettiva con
segnaposto, proprio come abbiamo imparato a fare con printf.
Ma questo codice che ho qui darà 2.jpg, non 002.jpg.
Quindi lascio a voi scoprire come modificare il segnaposto per rendere l'
nome corretto.
>> OK.
Quindi, una volta che hai sprintf'd allora potete aprire il file, perché esiste in
la directory, con fopen, utilizzando il titolo, e quindi tutto ciò modalità che si desidera
per aprire quel file dentro
Quindi, ora che abbiamo aperto un nuovo file JPG, Ora possiamo scrivere 512 byte a
tempo, fino a quando viene trovato un nuovo JPG.
Quindi diamo un altro sguardo alla sintassi di fwrite.
>> So che sto mostrando questa diapositiva un lotto, ma voglio solo fare in modo che
voi ragazzi non siate troppo confuso, perché So che è molto facile da
mescolare il primo e l'ultimo argomento, in particolare.
Ma ricordate che si sta scrivendo da il buffer nelle immagini di file fuori.
>> Ora che sapete come la scrittura 512 byte nel file JPG che hai
creato, bene, vogliamo fermare che processo una volta che abbiamo raggiunto la fine del
nostra carta, perché non ci sarà altre immagini da trovare.
Quindi torniamo a fread ancora una volta, lo prometto.
fread restituisce il numero di elementi di dimensioni, dimensioni, erano pronti a successo.
Idealmente, questo sta per essere qualunque si passa per numero, giusto?
Perché si sta cercando di leggere il numero di elementi di formato, formato.
Ma se fread non è in grado di leggere che numero di elementi, poi tornerà
qualunque numero si leggeva correttamente.
>> Ora, una cosa importante da notare è che se si utilizza un altro file I / O
funzionano come fgetc, sarà anche di ritorno quanti articoli si leggeva correttamente.
Cosa c'è di utile su questa funzione è che se si utilizzano funzioni all'interno di un
condizioni, sarà eseguire se stesso mentre determinazione di tale condizione,
basta veramente utile.
Quindi, se avete queste condizioni, diciamo, se il buffer fread, DOG sizeof, 2,
puntatore, uguale uguale a 1, che vuol dire che mi piacerebbe leggere
2 cani al momento.
Ma se fread restituisce 1 invece di 2 come previsto, il che significa che ci sono 2
cani lasciati nel mio file, ma piuttosto 1.
Ma se restituisce 2, quindi ho ancora quei 2 cani all'interno del mio tampone.
>> Quindi, ora che ti dà un senso di come verificare la fine del file, ma
andiamo ora attraverso la logica.
Come abbiamo effettivamente pezzo tutto di questi elementi insieme?
Una volta che abbiamo raggiunto il nostro primo JPG, dal momento che sappiamo che JPGs vengono memorizzati
contiguo, saremo scrivendo fino si raggiunge la fine del file carta.
Ma noi non vogliamo scrivere nulla fino ad allora.
Quindi è importante, non solo che siamo al l'inizio di un nuovo JPG, ma se
abbiamo già trovato un JPG o meno.
>> Se E 'l'inizio di una nuova JPG, faremo voler chiudere il nostro file JPG corrente se
abbiamo uno aperto, e aperto uno nuovo di scrivere in.
Se non è l'inizio del nuovo JPG, però, ci terremo lo stesso file JPG
aprire e scrivere in quella.
Ti scriviamo il nostro tampone in qualsiasi JPG abbiamo aperto, a condizione che
abbiamo uno aperto, naturalmente.
Se non abbiamo trovato il nostro primo JPG tuttavia, non scriviamo niente.
E questo processo continua finché non si raggiungere la fine del file carta.
>> E, infine, si vuole fare Assicurarsi che si fclose qualsiasi
i file che hai fopened.
Una volta che sei a tuo agio con la concetti, date un'occhiata ad alcuni
pseudocodice, che ho incluso qui.
In primo luogo, si desidera aprire il file della carta, e poi ripetere il processo seguente
fino a quando hai raggiunto l' estremità della scheda.
Si desidera leggere 512 byte in un buffer.
Utilizzando questo buffer, ti consigliamo di controllare se siete all'inizio di una
nuovo JPG o meno.
E la risposta a questa domanda sarà influenzare la gestione dei file -
quali file si apre, che quelli che non si chiudono.
>> Allora, avete già trovato un JPG?
Come siete stati mantenendo traccia di questo?
Poi, a seconda che, ti sia scrivere in JPG corrente che si
hanno aperto, o non scrivere affatto, perché non avete ancora trovato un JPG.
Infine, una volta che hai raggiunto la fine del il file, ti consigliamo di chiudere qualsiasi
restando i file che avete aperto.
Vogliamo essere ordinato qui.
>> E con questo, di aver recuperato tutti i file mancanti da quella memoria
carta, che è un piuttosto sorprendente feat.
Quindi datevi una pacca sulla schiena.
Ma, c'è un altro elemento il PSET, che è il concorso.
Troverete che tutte le immagini che hai recuperato sono in realtà
foto del personale del CS50.
Quindi, se siete nel campus o in qualche vicino, quindi è possibile scattare foto con
il personale, e la sezione che ha la la maggior parte delle foto con i membri del personale
dalle loro file recuperati saranno ottenere un premio impressionante.
Con questo, allora avete finito il PSET recuperare.
Il mio nome è Zamyla, e questo è CS50.