>> [Παίζει μουσική]
>> ZAMYLA CHAN: Ας αντιμετωπίσουμε ανακάμψει.
Ανάκτηση είναι ίσως το αγαπημένο μου PSET, και κυρίως γιατί πιστεύω ότι είναι
πραγματικά, πραγματικά δροσερό.
Βασικά, σας δίνεται μια μνήμη αρχείο κάρτα στην οποία
Οι φωτογραφίες έχουν διαγραφεί.
Αλλά αυτό που πρόκειται να κάνουμε είναι να ανακτήσει όλα αυτά.
>> OK.
Έτσι, είναι πραγματικά συναρπαστικό, αλλά ίσως λίγο εκφοβιστικό, επειδή είστε
δίνεται ένα άδειο αρχείο C και θα πρέπει να συμπληρώσετε in
Εντάξει, ας σπάσει αυτό σε διαχειρίσιμα τμήματα.
Θα θέλετε να ανοίξετε το αρχείων της κάρτας μνήμης.
Αυτό φαίνεται αρκετά απλό.
Στη συνέχεια, βρείτε την αρχή μιας εικόνας JPG.
Όλα τα αρχεία σε αυτή τη μνήμη κάρτα πρόκειται να είναι JPGs.
Στη συνέχεια, τη στιγμή που θα βρείτε την αρχή, θα πάμε να ανοίξει ένα νέο JPG, ότι
είναι, όπως, να δημιουργήσετε ένα JPG, και να γράψει 512 byte κάθε φορά μέχρι ένα νέο JPG είναι
βρέθηκε, και τελειώνει το πρόγραμμα, τη στιγμή που εντοπίσετε το τέλος του αρχείου.
>> Έτσι, τα πρώτα βήματα πρώτη είναι να ανοίξετε το αρχείο της κάρτας μνήμης.
Αλλά ξέρετε ήδη αυτό, και υπάρχει ένα αρχείο λειτουργία I / O που πρόκειται να
να αποδειχθεί πολύ χρήσιμο.
OK.
Λοιπόν, τι είναι JPGs;
Επειδή χρειαζόμαστε στην αρχή αυτή.
Λοιπόν, JPGs, ακριβώς όπως χάρτες bit, είναι μόνο ακολουθίες από bytes.
Ευτυχώς, κάθε JPG ξεκινά είτε με 0xff, 0xd8, 0xff, 0xE0, μία αλληλουχία
των bytes, ή άλλο ακολουθία των bytes.
>> Έτσι, αυτά τα τέσσερα bytes δείχνουν η αρχή μιας JPG.
Κανένας, εκτός από αυτές τις δύο συνδυασμοί τεσσάρων bytes.
Και ευτυχώς για μας, ένα άλλο γεγονός ότι μπορούν να επωφεληθούν από είναι ότι κάθε
JPG αποθηκεύεται side-by-side στην κάρτα μνήμης.
Έχω εκπροσώπησε την δομή ενός κάρτα μνήμης σχηματικά σε αυτό
σύρετε εδώ.
Εδώ, κάθε πλατεία, κάθε ορθογώνιο, αντιπροσωπεύει 512 bytes, και αρχίζει
με γκρι στο ότι εμείς δεν κάνουμε πραγματικά έχουν JPG.
>> Στη συνέχεια, όμως τελικά χτύπησε την ένα μπλοκ με ένα αστέρι.
Αυτό σημαίνει ότι τα τέσσερα πρώτα bytes έξω από αυτούς 512 είναι ένα από τα δύο
ξεκινώντας ακολουθίες της JPG.
Και πάμε από εκεί, και στη συνέχεια μία φορά ένα JPG τελειώνει, αρχίζει η άλλη.
Δεν έχουμε ποτέ πια γκρίζο χώρο στο ενδιάμεσο.
>> Αλλά πώς μπορούμε να διαβάσει πραγματικά αυτό, και διαβάστε τις 512 bytes έτσι ώστε να μπορούμε να κάνουμε
η σύγκριση την πρώτη θέση;
Λοιπόν, ας πάμε πίσω στο fread, η οποία παίρνει στο struct που θα περιέχει
τα bytes που διαβάζετε.
Έτσι θα πάμε να θέσει εκείνες εκεί -
το μέγεθος, τον αριθμό και, στη συνέχεια inpointer ότι είστε ανάγνωση από.
Τώρα, θέλουμε να διαβάσει 512 σε έναν χρόνο, και θέλουμε να αποθηκεύσουμε αυτή σε ένα ρυθμιστικό,
Πάω να το ονομάσουμε.
>> Βασικά, θα πάμε να κρατήσει σε αυτά τα 512 bytes και να κάνει
πράγματα με αυτό, έτσι δεν είναι;
Είμαστε είτε πρόκειται να συγκρίνει το πρώτο τέσσερα bytes, ή θα πάμε να
διαβάστε το, εντάξει;
Έτσι, τότε ο δείκτης δεδομένα στη συνέχεια θα χρησιμεύσει ως ρυθμιστικό σας, και η
inpointer, καλά, αυτό ακριβώς πρόκειται να είναι κάρτα μνήμης σας.
>> Back to our σχηματική κάρτα μνήμης.
Εμείς πάμε για να διαβάσει 512 byte σε μια στιγμή, αποθήκευση κάθε μπλοκ 512-byte
σε ένα buffer, κρατώντας επάνω σε αυτούς που buffer, αυτά τα 512 bytes, μέχρι να μάθουμε
ακριβώς τι να τους κάνουμε.
Έτσι, η αρχή δεν είναι τίποτα, έτσι θα διαβάσει το ρυθμιστικό, το συγκρίνετε, και
δεν θα χρειαστεί να κάνετε τίποτα με αυτό.
Και τότε, χτύπησε τελικά ένα αστέρι μπλοκ, πράγμα που σημαίνει ότι έχουμε
βρέθηκε για πρώτη φορά μας JPG.
Έτσι, το ρυθμιστικό κατέχει τώρα bytes από την εν λόγω JPG.
>> Την επόμενη φορά 512 bytes, επειδή είναι και όχι ένα εμπόδιο αστέρι, είναι επίσης
μέρος αυτής JPG.
Και JPGs είναι συνεχείς από εκεί μέσα, μέχρι να χτυπήσει το επόμενο JPG.
Και στη συνέχεια το ρυθμιστικό διάλυμα, στη συνέχεια, κατέχει 512 bytes για το συγκεκριμένο JPG, και
ούτω καθεξής, και ούτω καθεξής.
OK.
>> Έτσι, τη στιγμή που θα χτυπήσει το πρώτο αστέρι μπλοκ, η πρώτη JPG, πώς το κάνεις
στην πραγματικότητα, καλά, να το ανοίξετε;
Ας κάνουμε μια νέα JPG.
Τα ονόματα των αρχείων για JPG πρόκειται να να είναι στη μορφή, τον αριθμό, τον αριθμό,
number.jpg, δεδομένου ότι είναι το όνομά του σε η σειρά με την οποία βρίσκονται,
ξεκινώντας από 0.
>> Έτσι, το πρώτο που θα JPG θα βρείτε 000.jpg.
Έτσι, ίσως μια καλή ιδέα να παρακολουθείτε πόσα JPGs έχετε βρει μέχρι τώρα.
Έτσι, αυτό είναι το όνομα του αρχείου.
Αλλά πώς κάνετε πραγματικά αυτό;
Λοιπόν, θα πάμε να χρησιμοποιήσετε ένα λειτουργία που ονομάζεται sprintf.
Ένα μικρό κομμάτι παρόμοιο με printf, όπου μπορείτε να χρησιμοποιήσετε σύμβολα κράτησης θέσης για έγχορδα,
εκτός στην περίπτωση αυτή, sprintf θα εκτυπώσει το αρχείο έξω στην τρέχουσα
κατάλογο, όχι μέσα στο τερματικό.
>> OK.
Έτσι, εδώ βλέπουμε ότι έχουμε τον τίτλο, μια χαρα πίνακα που θα αποθηκεύει το
προκύπτουσα σειρά, και περνάμε στην τον τίτλο του πραγματικού συμβολοσειράς με
κράτησης θέσης, όπως και εμείς απλά έχουμε μάθει να κάνει με την printf.
Αλλά αυτός ο κώδικας που έχω εδώ θα δώσει 2.jpg, δεν 002.jpg.
Έτσι, θα αφήσω σε εσάς να μάθετε πώς να τροποποιήσετε το σύμβολο κράτησης θέσης για να κάνει το
σωστό όνομα.
>> OK.
Έτσι, αφού έχετε sprintf'd τότε μπορείτε να ανοίξετε το αρχείο, επειδή υπάρχει σε
σας κατάλογο, με fopen, χρησιμοποιώντας το τίτλο, και στη συνέχεια, ανεξάρτητα από τον τρόπο που θέλετε
να ανοίξετε το αρχείο μέσα
Έτσι, τώρα που έχουμε ανοίξει ένα νέο αρχείο JPG, τώρα μπορούμε να γράψουμε 512 bytes σε ένα
ώρα, μέχρι να βρεθεί μια νέα JPG.
Έτσι, ας ρίξουμε μια άλλη ματιά κατά τη σύνταξη του fwrite.
>> Ξέρω ότι δείχνω αυτήν τη διαφάνεια α πολλά, αλλά θέλω μόνο να βεβαιωθείτε ότι
εσείς δεν παίρνουν πάρα πολύ σύγχυση, επειδή Ξέρω ότι είναι πολύ εύκολο να
ανακατεύουμε μέχρι το πρώτο και το τελευταίο επιχείρημα, ειδικότερα.
Αλλά να θυμάστε ότι είστε γραπτώς από buffer σας σε εικόνες από το αρχείο.
>> Τώρα που ξέρετε πώς η εγγραφή 512 bytes στο αρχείο JPG σας ότι έχετε
δημιουργήθηκε, καλά, θέλουμε να το σταματήσουμε αυτό διαδικασία από τη στιγμή που έχουμε φτάσει στο τέλος της
κάρτα μας, γιατί δεν θα υπάρξει οποιεσδήποτε άλλες εικόνες για να βρεθεί.
Οπότε ας πάμε πίσω στο fread για μια ακόμη φορά, το υπόσχομαι.
fread επιστρέφει το πλήθος των στοιχείων του μεγέθους, μέγεθος, ήσαν έτοιμοι με επιτυχία.
Ιδανικά, αυτό θα είναι ό, τι θα περάσει για τον αριθμό, έτσι δεν είναι;
Επειδή είστε προσπαθεί να διαβάσει τον αριθμό των στοιχείων του μεγέθους, το μέγεθος.
Αλλά αν fread δεν είναι σε θέση να διαβάσει ότι αριθμό των στοιχείων, τότε θα επιστρέψει
ό αριθμός διάβασε.
>> Τώρα, ένα σημαντικό πράγμα που πρέπει να σημειωθεί είναι ότι εάν χρησιμοποιείτε ένα άλλο αρχείο I / O
λειτουργούν σαν fgetc, θα επιστρέψει επίσης πόσα στοιχεία το διαβάσετε με επιτυχία.
Τι είναι χρήσιμο για αυτή τη λειτουργία είναι ότι εάν χρησιμοποιείτε τις λειτουργίες μέσα από ένα
κατάσταση, θα εκτελέσει η ίδια, ενώ καθορισμού του εν λόγω κατάσταση, η οποία είναι
μόνο πραγματικά χρήσιμο.
Έτσι, αν έχετε αυτό προϋποθέσεις, ας πούμε, αν fread buffer, sizeof DOG, 2,
δείκτη, ισούται ισούται με 1, η σημαίνει ότι θα ήθελα να διαβάσετε
2 σκύλοι κατά τον χρόνο.
Αλλά αν fread επιστρέφει 1 αντί του 2 ως Αναμένεται, αυτό σημαίνει ότι υπάρχουν 2
σκύλοι αριστερά στο αρχείο μου, αλλά 1.
Αλλά αν επιστρέψει 2, τότε έχω ακόμα αυτά τα 2 σκυλιά στο εσωτερικό του ρυθμιστικού μου.
>> Έτσι τώρα που σας δίνει μια αίσθηση για το πώς να ελέγξτε για το τέλος του αρχείου, αλλά
ας περάσουν τώρα τη λογική.
Πώς μπορούμε πραγματικά κομμάτι όλων από αυτά τα στοιχεία μαζί;
Μόλις χτυπήσει το πρώτο μας JPG, δεδομένου γνωρίζουμε ότι JPGs αποθηκεύονται
συνεχόμενα, θα πρέπει να γράφει μέχρι φτάνουμε στο τέλος του αρχείου της κάρτας.
Αλλά δεν θέλετε να γράψετε τίποτα μέχρι τότε.
Γι 'αυτό έχει σημασία, όχι μόνο ότι είμαστε στο η αρχή μιας νέας JPG, αλλά αν
έχουμε ήδη βρει ένα αρχείο JPG ή όχι.
>> Αν Είναι η αρχή μιας νέας JPG, θα θέλετε να κλείσετε το τρέχον αρχείο JPG μας, αν
έχουμε μία ανοικτή και ανοικτή ένα νέο να γράψετε στο.
Αν δεν είναι η αρχή της νέας JPG, όμως, θα συνεχίσουμε το ίδιο αρχείο JPG
ανοίξετε και να γράψετε σε αυτό.
Θα γράψω ρυθμιστικό μας σε οποιαδήποτε JPG αρχείο έχουμε ανοιχτά, με την προϋπόθεση ότι
έχουμε μία ανοικτή, φυσικά.
Αν δεν έχουμε βρει την πρώτη μας JPG όμως, δεν γράφουμε τίποτα.
Και αυτή η διαδικασία συνεχίζεται μέχρι να φτάσει στο τέλος του αρχείου της κάρτας.
>> Και τέλος, θα θελήσετε να κάνετε βεβαιωθείτε ότι έχετε οποιαδήποτε fclose
αρχεία που έχετε fopened.
Μόλις είστε άνετοι με το έννοιες, ρίξτε μια ματιά σε μερικά
ψευδοκώδικα, που έχω περιλαμβάνονται εδώ.
Κατ 'αρχάς, θέλετε να ανοίξετε το αρχείο της κάρτας, και στη συνέχεια επαναλάβετε την ακόλουθη διαδικασία
μέχρι να έχετε φτάσει το άκρο της κάρτας.
Θέλετε να διαβάσετε 512 bytes σε ένα ρυθμιστικό διάλυμα.
Χρησιμοποιώντας αυτό το ρυθμιστικό, θα θελήσετε να ελέγξετε αν είστε στην αρχή ενός
νέα JPG ή όχι.
Και η απάντηση στο ερώτημα αυτό θα επηρεάζουν τη διαχείριση των αρχείων σας -
το οποίο τα αρχεία που ανοίγετε, η οποία αυτά που δεν μπορείτε να κλείσετε.
>> Στη συνέχεια, έχετε ήδη βρει ένα JPG;
Πώς έχετε διατηρώντας παρακολουθείτε αυτό;
Στη συνέχεια, ανάλογα με αυτό, είτε θα γράφουν στην τρέχουσα JPG που θα
έχουν ανοικτές, ή να μην το γράψω καθόλου, επειδή δεν έχετε βρει ένα JPG ακόμα.
Τέλος, αφού έχετε φτάσει στο τέλος της το αρχείο, θα θελήσετε να κλείσετε τυχόν
υπόλοιπα αρχεία που έχετε ανοίξει.
Θέλουμε να είναι τακτοποιημένο εδώ.
>> Και με αυτό, έχετε ανακτηθεί το σύνολο των τα αρχεία που λείπουν από αυτήν τη μνήμη
κάρτα, η οποία είναι ένα καταπληκτικό κατόρθωμα.
Έτσι εαυτό σας ελαφρύ κτύπημα στην πλάτη.
Αλλά, υπάρχει ένα ακόμη στοιχείο που πρέπει να η PSET, που είναι ο διαγωνισμός.
Θα διαπιστώσετε ότι όλες οι εικόνες ότι έχετε ανακτηθεί είναι στην πραγματικότητα
φωτογραφίες από το προσωπικό του CS50.
Έτσι, εάν είστε στην πανεπιστημιούπολη ή κάπου κοντά, τότε μπορείτε να τραβήξετε φωτογραφίες με
το προσωπικό, καθώς και το τμήμα που έχει η περισσότερες φωτογραφίες με τα μέλη του προσωπικού
από τα ανακτημένα αρχεία τους θα πάρετε ένα φοβερό βραβείο.
Με αυτό, τότε έχετε τελειώσει η PSET ανακάμψει.
Το όνομά μου είναι Zamyla, και αυτό είναι CS50.