[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.