>> [MUSIC SPIEL]
>> ZAMYLA CHAN: Packen wir erholen.
Recover ist wahrscheinlich mein Lieblings PSET, und vor allem, weil ich denke, es ist
wirklich, wirklich cool.
Grundsätzlich sind Sie eine Speicher gegeben Kartendatei, in der
Bilder wurden gelöscht.
Aber was du zu gehen zu tun ist, erholen sie alle.
>> OK.
So ist es wirklich spannend, aber vielleicht ein wenig einschüchternd, weil Sie
gegeben eine leere Datei und C Sie müssen es ausfüllen
OK, also lassen Sie brechen diese in überschaubare Teile.
Sie öffnen möchten die Speicherkartendatei.
Das scheint einfach genug.
Dann finden Sie den Anfang einer JPG-Bild.
Alle Dateien, die auf dieser Speicher Karte gehen zu JPGs sein.
Dann, sobald Sie den Anfang zu finden, Sie gehen, um ein neues JPG zu öffnen, dass
wird, wie, erstellen eine JPG-, und schreiben 512 Byte zu einer Zeit, bis ein neues JPG ist
gefunden werden, und das Programm endet, sobald Sie das Ende der Datei zu erkennen.
>> So ist zunächst die ersten Schritte zu öffnen die Speicherkarte Datei.
Aber Sie wissen schon, und es gibt eine Datei I / O-Funktion, die los ist
als sehr nützlich erweisen.
OK.
Also, was sind JPGs?
Da müssen wir den Anfang ist es.
Nun, JPGs, genau wie Bitmaps, sind nur Sequenzen von Bytes.
Glücklicherweise beginnt jeder JPG entweder mit 0xff, 0xd8, 0xff, 0xe0, eine Sequenz
Byte oder eine andere Bytefolge.
>> Also diese vier Bytes geben der Beginn einer JPG.
Keine andere als diese beiden Kombinationen von vier Bytes.
Und zum Glück für uns, eine weitere Tatsache, dass wir nutzen können, ist, dass jeder
JPG gespeichert Seite-an-Seite auf der Speicherkarte.
Ich habe die Struktur eines vertreten Speicherkarte schematisch auf diese
gleiten Sie hier.
Hier wird jeder Platz, jedes Rechteck, stellt 512 Bytes, und es beginnt
mit einem grauen, dass wir nicht wirklich eine JPG.
>> Aber dann haben wir endlich getroffen ein Block mit einem Stern.
Das bedeutet, dass die ersten vier Bytes aus von denen 512 sind einer dieser beiden
Ausgangssequenzen eines JPG.
Und wir einmal gehen von dort, und dann ein JPG endet, der nächste beginnt.
Wir haben nicht immer mehr haben grauen Raum dazwischen.
>> Aber wie können wir tatsächlich lesen das, und lesen Sie die 512 Bytes, so dass wir machen können
der Vergleich der erste Platz?
Nun, gehen wir zurück zu fread, die nimmt in der Struktur, die enthalten wird
die Bytes, die Sie gerade lesen.
So wirst du zu setzen die dort -
Die Größe, die Anzahl, und dann inpointer dass Sie aus lesen.
Jetzt wollen wir zu einer Zeit gelesen 512 und wir dies in einem Puffer gespeichert werden soll,
Ich werde es nennen.
>> Grundsätzlich werden wir halten auf jene 512 Bytes und tun
Dinge mit ihm, oder?
Wir sind entweder zu den ersten Vergleichen vier Bytes, oder wir gehen zu
lesen Sie es in, OK?
So dann wird der Datenzeiger dann dienen als Puffer und die
inpointer, gut, das ist nur los auf die Speicherkarte sein.
>> Zurück zu unserem Speicherkarte schematisch.
Wir werden 512 Bytes auf einmal lesen, Speichern jedes 512-Byte-Block
in einen Puffer, hielt sich an die puffern, diese 512 Byte, bis wir wissen,
genau das, was sie zu tun.
Also der Anfang ist nicht alles, so wir werden die Puffer zu lesen, zu vergleichen, und
wir müssen nichts tun.
Und dann haben wir endlich auf einen Stern blockieren, was bedeutet, dass wir
fand unsere erste JPG.
So, jetzt die Puffer halten Bytes aus diesem JPG.
>> Das nächste Mal, 512 Bytes, weil sie kein Star-Block sind auch
Teil dieser JPG.
Und JPGs sind kontinuierlich von dort rein, bis wir die nächste JPG.
Und dann, dann hält der Puffer 512 Bytes für die JPG und
so weiter und so fort.
OK.
>> Also, wenn Sie das erste Sterne-Hit Block, der erste JPG, wie wollen Sie
eigentlich, na ja, es öffnen?
Lassen Sie uns eine neue JPG.
Die Dateinamen für eine JPG sind los werden in dem Format, Nummer, Anzahl,
number.jpg, dass sie im Namen die Reihenfolge, in denen sie gefunden werden,
bei 0 beginnt.
>> Also die erste JPG, die Sie finden wird 000.jpg werden.
Also, wahrscheinlich eine gute Idee, den Überblick zu behalten wie viele JPGs Sie bisher gefunden haben.
Also das ist der Name der Datei.
Aber wie wollen Sie eigentlich machen, dass?
Nun, wir werden sich für eine sprintf-Funktion aufgerufen.
Ein bisschen ähnlich wie printf, wo Sie können Platzhalter für Strings zu verwenden,
außer in diesem Fall wird sprintf drucken die Datei in die aktuelle
Verzeichnis und nicht in das Terminal.
>> OK.
So, hier sehen wir, dass wir Titel, ein char-Array, gespeichert werden die
resultierenden String, und wir sind in dem Pass Titel der eigentliche String mit einem
Platzhalter, wir haben nur gelernt, mit printf zu tun.
Aber dieser Code, den ich hier habe, 2.jpg wird, nicht 002.jpg geben.
Also werde ich dich verlassen, um herauszufinden, wie man Ändern Sie den Platzhalter, um die
richtigen Namen.
>> OK.
Also, wenn Sie dann sprintf'd haben können Öffnen Sie die Datei, denn es existiert in
Ihr Verzeichnis, mit fopen, mit Hilfe der Titel, und was auch immer Sie den gewünschten Modus
, um die Datei zu öffnen in.
So, jetzt haben wir die neue JPG-Datei geöffnet wird, jetzt können wir auf eine 512 Byte schreiben
Zeit, bis ein neues JPG gefunden.
Werfen wir also einen Blick an der Syntax von fwrite.
>> Ich weiß, dass ich zeige diese Folie eine viel, aber ich will nur sicherstellen, dass
euch nicht zu sehr verwirrt, weil Ich weiß, dass es sehr einfach ist,
mischen den ersten und letzten Argument, im Besonderen.
Aber denken Sie daran, dass Sie vom Schreiben Ihre Puffer in die Datei aus Bildern.
>> Nun, da Sie wissen, wie der Schreib 512 Bytes in Ihren JPG-Datei, die Sie haben
erstellt, nun, das stoppen wollen wir Prozess einmal haben wir das Ende erreicht
unsere Karte, denn es wird nicht noch mehr Bilder zu finden.
So gehen wir zurück zu fread einmal mehr, versprochen.
fread liefert, wie viele Artikel von Größe, Größe, bereit waren erfolgreich.
Idealerweise sollte diese sein wird, was auch immer Sie übergeben für die Nummer, oder?
Weil Sie versuchen, Anzahl lesen sind von Elementen der Größe, Größen.
Aber wenn fread ist nicht in der Lage, das zu lesen Anzahl der Elemente, dann werden es zurückgeben
was Nummer sie erfolgreich gelesen.
>> Nun, das ist eine wichtige Sache zu beachten dass, wenn Sie eine andere Datei-I / O
Funktion wie fgetc, wird es auch zurück wie viele Artikel es erfolgreich gelesen.
Was ist nützlich zu dieser Funktion ist dass, wenn Sie Funktionen innerhalb eines verwenden
Zustand, es wird sich während ausführen Bestimmung, dass Zustand, der ist
nur wirklich nützlich.
Also, wenn Sie diese Bedingungen haben, sagen wir, wenn fread Puffer, sizeof DOG, 2,
Zeiger, gleich gleich 1 ist, dass bedeutet, dass würde ich gerne lesen
2 Hunde an der Zeit.
Aber wenn fread liefert 1 statt 2, wie erwartet, bedeutet, dass es 2
Hunde links in meiner Akte, sondern ein.
Aber wenn es zwei gibt, dann habe ich immer noch diese 2 Hunde Innenseite meiner Puffer.
>> So, jetzt gibt Ihnen ein Gefühl, wie man erfragen Ende der Datei, aber
Lassen Sie uns jetzt durch die Logik zu gehen.
Wie kommen wir eigentlich alle Stück dieser Elemente zusammen?
Nachdem wir unseren ersten Hit JPG, da wir wissen, dass JPGs gespeichert sind
zusammenhängend, wir werden bis zum Schreiben erreichen wir das Ende der Karte Datei.
Aber wir wollen nicht zu schreiben nichts, bis dann.
So ist es wichtig, nicht nur, dass wir gerade sind der Beginn einer neuen JPG, sondern ob
wir haben bereits eine JPG-oder nicht gefunden.
>> Wenn es der Beginn einer neuen JPG, wir wollen unsere aktuellen JPG-Datei, wenn in der Nähe
wir eine offene und geöffnet haben eine neue, in zu schreiben.
Wenn es nicht der Beginn der neuen JPG, obwohl, wir werden das gleiche JPG-Datei zu halten
öffnen und zu schreiben, in die.
Wir werden unser Puffer, in welch auch immer schreiben JPG-Datei haben wir offen, vorausgesetzt, dass
wir haben einen offenen, selbstverständlich.
Wenn wir nicht gefunden haben unseren ersten JPG Noch haben wir nicht alles schreiben.
Und dieser Prozess wird fortgesetzt, bis Sie erreichen das Ende der Karte Datei.
>> Und schließlich, werden Sie machen wollen sicher, dass Sie jede fclose
Dateien, die Sie fopened habe.
Sobald Sie bequem mit der Konzepte, werfen Sie einen Blick auf einige
Pseudocode, die ich hier nicht enthalten.
Erstens, um die Karte Datei zu öffnen wollen, und wiederholen Sie dann den folgenden Prozess
bis Sie erreicht haben, die Ende der Karte.
Sie wollen 512 Bytes lesen in einen Puffer.
Mit diesen Puffer, werden Sie überprüfen möchten ob Sie zu Beginn eine sind
neue JPG oder nicht.
Und die Antwort auf diese Frage wird Einfluss auf Ihre Datei-Management -
welche Dateien Sie öffnen, die denen Sie zu schließen.
>> Dann haben Sie bereits eine JPG gefunden?
Wie haben Sie schon halten Spur davon?
Dann, je nachdem, dass, werden Sie entweder schreiben in den aktuellen JPG, die Sie
geöffnet, oder nicht schreiben, es überhaupt, weil Sie eine JPG noch nicht gefunden haben.
Schließlich, wenn Sie das Ende erreicht haben die Datei, Sie wollen zu einem in der Nähe
verbleibenden Dateien, die Sie geöffnet haben.
Wir wollen hier ordentlich zu sein.
>> Und damit Sie alle erholt haben die fehlenden Dateien aus dem Speicher
Karte, die eine erstaunliche Leistung ist.
So klopfen Sie sich selbst auf der Rückseite.
Aber, es gibt ein weiteres Element, um die PSET, die der Wettbewerb.
Sie finden, dass alle Bilder dass Sie gewonnen haben, sind tatsächlich
Bilder der Mitarbeiter des CS50.
Also, wenn Sie auf dem Campus oder irgendwo sind in der Nähe, dann können Sie Bilder mit zu nehmen
das Personal und der Abschnitt, der hat die meisten Bilder mit Mitarbeitern
aus ihrer wiederhergestellten Dateien werden bekommen einen tollen Preis.
Damit dann beendet haben die erholen PSET.
Mein Name ist Zamyla, und dies ist CS50.