>> [MUSIQUE JEU]
>> ZAMYLA CHAN: Abordons récupérer.
Récupérer est probablement mon préféré PSET, et surtout parce que je pense que c'est
vraiment, vraiment cool.
Fondamentalement, vous êtes donné une mémoire fichier de cartes dans lequel
photos ont été supprimées.
Mais ce que vous allez faire est de récupérer tous.
>> OK.
Il est donc très intéressant, mais peut-être un peu intimidant, parce que vous êtes
donné un fichier vide et C vous devez remplir po
OK, donc nous allons briser ce en parties gérables.
Vous souhaitez ouvrir le fichier de la carte mémoire.
Cela semble assez simple.
Ensuite, trouver le début d'une image JPG.
Tous les fichiers sur cette mémoire carte vont être JPG.
Puis, une fois que vous trouvez le début, vous allez ouvrir un nouveau JPG, que
est, comme, créez un fichier JPG, et écrire 512 octet à la fois jusqu'à ce qu'une nouvelle JPG est
trouvé, et mettre fin au programme, une fois vous détectez la fin du fichier.
>> Ainsi premières étapes est d'abord d'ouvrir le fichier de la carte mémoire.
Mais vous le savez déjà, et il n'y a une fonction d'E / S de fichier qui va
s'avérer très utile.
OK.
Alors, quelles sont les JPG?
Parce que nous avons besoin au début il.
Eh bien, JPG, tout comme les cartes de bits, ne sont que des séquences d'octets.
Heureusement, tous les JPG commence par soit 0xff, 0xD8, 0xff, 0xe0, une séquence
d'octets, ou un autre séquence d'octets.
>> Donc, ces quatre octets indiquent le début d'un fichier JPG.
Rien d'autre que ces deux combinaisons de quatre octets.
Et heureusement pour nous, un autre fait que nous peuvent profiter de est que chaque
JPG sont stockées côte-à-côte sur la carte mémoire.
J'ai représenté la structure d'un carte mémoire schématiquement sur cette
glisser ici.
Ici, chaque place, chaque rectangle, représente 512 octets, et il commence
avec un gris en ce que nous ne faisons pas vraiment un JPG.
>> Mais nous avons finalement touché un bloc avec une étoile.
Cela signifie que les quatre premiers octets sur 512 de ceux qui sont l'un des deux
à partir des séquences d'un JPG.
Et nous allons à partir de là, et puis une fois un JPG se termine, la suivante commence.
Nous n'avons jamais n'avons pas plus espace gris entre les deux.
>> Mais comment pouvons-nous effectivement lu cela, et lire les 512 octets de sorte que nous pouvons faire
la comparaison de la première place?
Eh bien, revenons à fread, qui prend dans la structure qui contiendra
les octets que vous lisez.
Donc, vous allez mettre ceux là -
la taille, le nombre, puis inpointer que vous lisez à partir.
Maintenant, nous voulons lire 512 à la fois, et l'on veut stocker dans un tampon présent,
Je vais l'appeler.
>> Fondamentalement, nous allons tenir sur ces 512 octets et faire
choses avec elle, non?
Nous allons comparer soit le premier quatre octets, ou nous allons
lire dans, OK?
Alors le pointeur de données sera alors servira de tampon, et le
inpointer, eh bien, c'est juste aller être votre carte mémoire.
>> Retour à notre schéma de la carte mémoire.
Nous allons lire 512 octets à la fois, stocker chaque bloc de 512 octets
dans une mémoire tampon, se tenant sur les tampon, les 512 octets, jusqu'à ce que nous savons
exactement ce qu'il faut les faire.
Ainsi, le début n'est pas rien, alors nous lisons le tampon, compare, et
nous n'aurons pas besoin de faire quelque chose avec elle.
Et puis, nous avons finalement touché une étoile bloc, ce qui signifie que nous avons
trouvé notre première JPG.
Ainsi, le tampon détiennent maintenant octets de cette JPG.
>> La prochaine fois que 512 octets, parce qu'ils sont pas un bloc en étoile, sont également
partie de cette JPG.
Et JPG sont continues à partir de là dans, jusqu'à ce que nous avons touché la prochaine JPG.
Et puis le tampon tient alors 512 octets pour que JPG, et
ainsi de suite, et ainsi de suite.
OK.
>> Donc, une fois que vous frappez le premier étoilé bloc, le premier JPG, comment vous faites
effectivement, bien, l'ouvrir?
Faisons une nouvelle JPG.
Les noms de fichier pour un fichier JPG vont être dans le format, le nombre, le nombre,
number.jpg, en ce qu'ils sont nommés dans l'ordre dans lequel ils se trouvent,
à partir de 0.
>> Donc, la première JPG vous que trouver seront 000.jpg.
Donc, probablement une bonne idée de garder une trace combien de JPG que vous avez trouvé à ce jour.
Donc, c'est le nom du fichier.
Mais comment voulez-vous réellement faire cela?
Eh bien, nous allons utiliser une fonction appelée sprintf.
Un peu similaire à printf, où vous pouvez utiliser des espaces réservés pour les chaînes,
sauf que dans ce cas, sprintf imprimera le fichier sur dans le courant
répertoire, et non dans le terminal.
>> OK.
Donc, ici, nous voyons que nous avons le titre, un tableau de caractères qui va stocker le
chaîne résultante, et nous passons à l' titre de la chaîne réelle avec un
espace réservé, tout comme nous avons appris à faire avec printf.
Mais ce code que j'ai ici donnera 2.jpg, pas 002.jpg.
Je m'en tiendrai donc à vous de trouver comment modifier l'espace réservé de faire la
nom correct.
>> OK.
Donc, une fois que vous avez sprintf'd alors vous pouvez ouvrir ce fichier, car il existe dans
votre répertoire, avec fopen, en utilisant la titre, puis quelque mode que vous voulez
pour ouvrir ce fichier po
Alors, maintenant que nous avons ouvert un nouveau fichier JPG, maintenant nous pouvons écrire 512 octets à la
temps, jusqu'à ce qu'une nouvelle JPG est trouvée.
Alors prenons un autre regard à la syntaxe de fwrite.
>> Je sais que je montre cette diapositive une beaucoup, mais je veux juste m'assurer que
vous les gars ne soyez pas trop confus, parce Je sais que c'est très facile à
mélanger le premier et le dernier l'argument, en particulier.
Mais n'oubliez pas que vous avez écrit de votre tampon dans les images de fichiers sur.
>> Maintenant que vous savez comment la radiation 512 octets dans votre fichier JPG que vous avez
créé, ainsi, nous voulons mettre fin à cette processus une fois que nous avons atteint la fin de
notre carte, car il ne sera pas des images plus être trouvés.
Donc, revenons à fread une fois de plus, je te le promets.
fread retourne le nombre d'éléments de taille, taille, étaient prêts à succès.
Idéalement, cela va être quelque vous passez pour le nombre, non?
Parce que vous essayez de lire nombre des éléments de taille, la taille.
Mais si fread n'est pas capable de lire que certain nombre d'éléments, il reviendra
quel que soit le nombre le lire avec succès.
>> Maintenant, une chose importante à noter est que si vous utilisez un autre fichier I / O
fonction comme fgetc, il va également revenir combien d'articles il lu avec succès.
Ce qui est utile sur cette fonction est que si vous utilisez des fonctions à l'intérieur d'un
état, il va lui-même exécuter tout déterminer cette condition, qui est
vraiment utile.
Donc si vous avez ces conditions, disons, si le tampon fread CHIEN sizeof, 2,
pointeur, est égal à égal à 1, que signifie que je voudrais lire
2 chiens à la fois.
Mais si fread retourne 1 au lieu de 2 comme prévu, ce qui signifie qu'il ya 2
chiens laissés dans mon dossier, mais plutôt 1.
Mais si elle retourne 2, alors je dois encore ces deux chiens à l'intérieur de mon tampon.
>> Alors, maintenant que vous donne une idée de la façon de vérifier la fin du fichier, mais
Passons maintenant à travers la logique.
Comment pouvons-nous réellement piece Tout de ces éléments entre eux?
Une fois nous avons atteint notre premier JPG, depuis nous savons que les fichiers JPG sont stockés
contiguë, nous allons écrire jusqu'à ce que nous arrivons à la fin du fichier de la carte.
Mais nous ne voulons pas d'écrire rien jusque-là.
Donc, c'est important, non seulement que nous sommes à le début d'une nouvelle JPG, mais si
nous avons déjà trouvé un JPG ou pas.
>> Si c'est le début d'une nouvelle JPG, nous allons vouloir fermer notre fichier JPG en cours si
nous avons un ouvert, et ouvert un nouveau écrire dans.
Si ce n'est pas le début de la nouvelle JPG, cependant, nous allons garder le même fichier JPG
ouvrir et écrire dedans.
Nous écrirons notre tampon dans n'importe quel JPG nous avons ouvert, à condition que
nous avons une ouverte, bien sûr.
Si nous n'avons pas trouvé notre première JPG encore, nous n'écrivons pas n'importe quoi.
Et ce processus se poursuit jusqu'à ce que vous atteindre la fin du fichier de carte.
>> Et enfin, vous aurez envie de faire Assurez-vous tout fFerme
les fichiers que vous avez fopened.
Une fois que vous êtes à l'aise avec le concepts, jetez un oeil à certains
pseudo, que j'ai inclus ici.
D'abord, vous voulez ouvrir le fichier de la carte, et puis répétez le processus suivant
jusqu'à ce que vous avez atteint le extrémité de la carte.
Vous voulez lire 512 octets dans un tampon.
En utilisant cette mémoire tampon, vous aurez envie de consulter si vous êtes au début d'une
nouvelle JPG ou pas.
Et la réponse à cette question sera affecter votre gestion de fichiers -
les fichiers que vous ouvrez, qui ceux ne vous fermez.
>> Alors, avez-vous déjà trouvé un JPG?
Comment avez-vous été tenue piste de cela?
Ensuite, en fonction de cela, vous aurez soit écrire dans le JPG courant que vous
ont ouvert, ou ne pas écrire du tout, parce que vous n'avez pas encore trouvé un JPG.
Enfin, une fois que vous avez atteint la fin de le fichier, vous aurez envie de fermer tout
les fichiers que vous avez ouverts restant.
Nous voulons être en ordre ici.
>> Et avec cela, vous avez récupéré tous les fichiers manquants à partir de la mémoire
carte, ce qui est un exploit assez incroyable.
Donc vous tape dans le dos.
Mais, il ya un élément de plus à le PSET, qui est le concours.
Vous verrez que toutes les images que vous avez récupéré êtes réellement
photos du personnel de CS50.
Donc, si vous êtes sur le campus ou ailleurs près, alors vous pouvez prendre des photos avec
le personnel, et la section qui a le la plupart des photos avec les membres du personnel
de leurs fichiers récupérés obtenir un prix impressionnant.
Avec cela, vous avez terminé le PSET récupérer.
Mon nom est Zamyla, et c'est CS50.