[Powered by Google Translate] [Walkthrough - Σετ Πρόβλημα 4] [Zamyla Chan - Πανεπιστήμιο του Χάρβαρντ] [Αυτό είναι CS50. - CS50.TV] Εντάξει. Γεια σας, όλοι, και καλωσορίζουμε στο Walkthrough 4. Σήμερα PSET μας είναι ιατροδικαστικών. Ιατροδικαστικών είναι ένα πραγματικά διασκεδαστικό PSET που συνεπάγεται επαφή με τα αρχεία bitmap να ανακαλύψουν που διέπραξαν ένα έγκλημα. Στη συνέχεια θα πάμε για να αλλάξετε το μέγεθος κάποια αρχεία bitmap, τότε είμαστε, επίσης, πρόκειται να ασχοληθεί με ένα πραγματικά διασκεδαστικό μέρος που ονομάζεται Ανάκτηση, στην οποία είμαστε ουσιαστικά παρέδωσε μια κάρτα μνήμης στην οποία κάποιος έχει διαγραφεί κατά λάθος όλα τα αρχεία τους, και θα σας ζητηθεί να ανακτήσει αυτά τα αρχεία. Αλλά πρώτα, πριν φτάσουμε στο PSET, εγώ πραγματικά θέλουν απλά να συγχαρώ όλους. Είμαστε περίπου στο μέσο του μαθήματος. Quiz 0 είναι πίσω μας, και είμαστε σε pset4, τόσο ουσιαστικά, είμαστε στα μισά του δρόμου. Έχουμε διανύσει πολύ δρόμο, αν κοιτάξουμε πίσω στο psets σας, pset0 και pset1, έτσι τον εαυτό σας συγχαρώ γι 'αυτό, και θα πάμε να μπει σε κάποια πραγματικά διασκεδαστικό πράγματα. Έτσι εργαλειοθήκη μας για αυτό το PSET, πάλι, αντί να τρέχει sudo yum-y update, είμαστε σε θέση να τρέξει μόνο update50 αν είστε στην έκδοση 17,3 και πάνω από τη συσκευή. Έτσι να είστε βέβαιος να τρέξει update50 - είναι πολύ πιο εύκολο, μερικές λιγότερο χαρακτήρες - για να βεβαιωθείτε ότι είστε στην τελευταία έκδοση της συσκευής. Ιδιαίτερα σημαντικό είναι να update50 όταν αρχίσετε να χρησιμοποιείτε CS50 Έλεγχος. Έτσι, βεβαιωθείτε ότι έχετε κάνει αυτό. Για όλα τα τμήματα αυτής PSET, θα πάμε να ασχολούνται με εισόδους και εξόδους αρχείο, το αρχείο I / O. Εμείς πάμε για να πηγαίνει πέρα ​​από πολλά προγράμματα που ασχολούνται με συστοιχίες δείχνουν σε αρχεία και τέτοια πράγματα, έτσι θέλετε να βεβαιωθείτε ότι είμαστε πραγματικά οικεία και άνετα που ασχολούνται με το πώς να εισόδου και εξόδου σε αρχεία. Στον κώδικα της διανομής για αυτό το PSET είναι ένα αρχείο που ονομάζεται copy.c, και αυτό είναι που θα πάμε να βρούμε πρόκειται να είναι πραγματικά χρήσιμο να μας επειδή θα πάμε να καταλήξετε στην πραγματικότητα αντιγραφή του αρχείου copy.c και αλλάζοντας απλώς ελαφρά για να είναι σε θέση να επιτύχει τα πρώτα 2 μέρη του σετ προβλήματος. Και έτσι στη συνέχεια, όπως ανέφερα και πριν, έχουμε να κάνουμε με εικόνες bitmap, καθώς και JPEG. Έτσι, πραγματικά κατανόηση της δομής του πώς οργανώνονται τα αρχεία, πώς μπορούμε να μετατρέψουμε πραγματικά την 0s και 1s σε structs και πράγματα που μπορούμε πραγματικά να κατανοήσουν και να ερμηνεύσουν και να επεξεργαστείτε, αυτό θα είναι πολύ σημαντικό, ώστε να υπεισέλθω σε JPEG και αρχεία bitmap και την κατανόηση της δομής αυτών. Pset4, ως συνήθως, ξεκινά με ένα τμήμα των ερωτήσεων. Εκείνοι που θα ασχοληθούν με το αρχείο I / O και να σας συνηθίσει σε αυτό. Στη συνέχεια, μέρος 1 είναι Whodunit, στο οποίο σας δίνεται ένα αρχείο bitmap που μοιάζει κάτι σαν κόκκινα στίγματα πάνω από όλα. Και τότε ουσιαστικά αυτό που πάμε να κάνουμε είναι να πάρετε αυτό το αρχείο και απλά να το επεξεργαστείτε λίγο σε μια εκδοχή που μπορεί να διαβάσει. Ουσιαστικά, μόλις τελειώσουμε, θα έχουμε το ίδιο αρχείο, εκτός θα είναι σε θέση να δείτε το κρυμμένο μήνυμα που είναι κρυμμένο από όλες αυτές τις κόκκινες κουκίδες. Στη συνέχεια Resize είναι ένα πρόγραμμα που, δεδομένης ένα αρχείο και στη συνέχεια δίνεται το όνομα του αρχείου που εξάγει και στη συνέχεια δίνεται ένας αριθμός, καθώς, Θα αλλάξετε το μέγεθος πραγματικά ότι bitmap από το εν λόγω ακέραια τιμή. Στη συνέχεια, τέλος, έχουμε την PSET Ανάκτηση. Μας δίνεται μια κάρτα μνήμης και στη συνέχεια να ανακτήσει όλες τις φωτογραφίες που έχουν διαγραφεί κατά λάθος, αλλά, όπως θα μάθουμε, στην πραγματικότητα δεν διαγράφονται και αφαιρείται από το αρχείο? έχουμε ακριβώς το είδος των χαμένων όπου ήταν το αρχείο, αλλά θα πάμε για να ανακτήσει αυτό. Μεγάλη. Έτσι, πηγαίνει στο αρχείο I / O Συγκεκριμένα, πρόκειται για μια ολόκληρη λίστα με τις λειτουργίες που θα χρησιμοποιείτε. Έχετε ήδη δει ένα μικρό κομμάτι από τα βασικά fopen, fread, και fwrite, αλλά εμείς πάμε να δούμε περαιτέρω σε κάποιο αρχείο I / O λειτουργίες όπως fputc, στην οποία μπορείτε να γράψετε μόνο ένα χαρακτήρα σε ένα χρόνο, να fseek, όπου κατά κάποιο τρόπο να μετακινήσετε το δείκτη θέσης αρχείου προς τα εμπρός και προς τα πίσω, και στη συνέχεια κάποιοι άλλοι. Αλλά θα πάμε σε ότι λίγο αργότερα, κατά τη διάρκεια της PSET. Έτσι, η πρώτη, μόνο και μόνο για να μπει στο αρχείο I / O πριν πάμε στο PSET, για να ανοίξετε ένα αρχείο, για παράδειγμα, αυτό που έχετε να κάνετε είναι να ρυθμίσετε πραγματικά ένα δείκτη σε αυτό το αρχείο. Έτσι έχουμε ένα δείκτη FILE *. Σε αυτή την περίπτωση, είμαι καλώντας το ένα στο δείκτη, διότι αυτό πρόκειται να είναι infile μου. Και έτσι είμαι πρόκειται να χρησιμοποιήσετε τη συνάρτηση fopen και στη συνέχεια το όνομα του αρχείου και στη συνέχεια ο τρόπος με τον οποίο Πάω να ασχολούνται με το αρχείο. Έτσι υπάρχει "r" στη συγκεκριμένη περίπτωση για την ανάγνωση, "w" για το γράψιμο, και στη συνέχεια "α" για προσάρτηση. Για παράδειγμα, όταν έχουμε να κάνουμε με μια infile και το μόνο που θέλετε να κάνετε είναι να διαβάσετε τα bits και bytes αποθηκεύονται εκεί, τότε πρόκειται πιθανώς να θέλετε να χρησιμοποιήσετε "r" ως τρόπος σας. Όταν θέλετε πραγματικά να γράφουν, το είδος του κάνει ένα νέο αρχείο, τότε τι θα πάμε να κάνουμε είναι να πάμε για να ανοίξετε το νέο αρχείο και να χρησιμοποιήσετε το "w" λειτουργία για το γράψιμο. Έτσι, στη συνέχεια, όταν είστε πραγματικά ανάγνωση σε αρχεία, η δομή έχει ως εξής. Πρώτα θα περιλαμβάνουν το δείκτη στο struct που θα περιέχει τα bytes που διαβάζετε. Έτσι, αυτό πρόκειται να είναι η θέση τέλος των bytes που διαβάζετε. Είσαι τότε θα δείχνουν το μέγεθος, όπως και βασικά πόσα bytes το πρόγραμμά σας θα πρέπει να διαβάζονται στο αρχείο, το μέγεθος ουσιαστικά είναι ένα στοιχείο, και στη συνέχεια θα πάμε για να καθορίσετε πόσα στοιχεία που θέλετε να διαβάσετε. Και τελικά, θα πρέπει να ξέρετε πού διαβάζετε από, έτσι ώστε να πρόκειται να είναι στο δείκτη σας. I χρωματικό κώδικα αυτά επειδή fread είναι επίσης πολύ παρόμοια με fwrite, εκτός από εσάς θέλετε να βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή σειρά, βεβαιωθείτε ότι είστε πραγματικά γράφει ή διαβάζει από το αρχείο δεξιά. Έτσι στη συνέχεια όπως και πριν, αν έχουμε το μέγεθος του στοιχείου, καθώς και τον αριθμό των στοιχείων, τότε μπορούμε να παίξουμε γύρω εδώ λίγο. Πείτε Έχω ένα struct DOG και έτσι τότε θα θέλετε να διαβάσετε δύο σκυλιά σε ένα χρόνο. Τι θα μπορούσα να κάνω είναι να πω το μέγεθος ενός στοιχείου θα είναι το μέγεθος ενός DOG και Πάω να διαβάσετε στην πραγματικότητα δύο από αυτούς. Εναλλακτικά, τι θα μπορούσα να κάνω είναι να πω ότι είμαι απλώς πρόκειται να διαβάσετε ένα στοιχείο και ότι ένα στοιχείο πρόκειται να είναι το μέγεθος των δύο σκυλιά. Έτσι, αυτό είναι ανάλογο με το πώς μπορείτε να το είδος του παιχνιδιού γύρω με το μέγεθος και τον αριθμό ανάλογα με το τι είναι πιο διαισθητικό σε σας. Εντάξει. Έτσι τώρα έχουμε την ευκαιρία να τα αρχεία γραπτώς. Όταν θέλετε να γράψετε ένα αρχείο, το πρώτο επιχείρημα είναι πραγματικά όπου είστε ανάγνωση από. Έτσι, αυτό είναι βασικά τα δεδομένα που θα έχετε την ευκαιρία να γράψει στο αρχείο, η οποία είναι η έξω δείκτη στο τέλος. Έτσι, όταν έχουμε να κάνουμε με την PSET, φροντίστε να μην μπερδευτείτε. Ίσως να έχουν την πλευρά τους ορισμούς από την πλευρά. Μπορείτε να τραβάτε μέχρι τους ορισμούς στο εγχειρίδιο πληκτρολογώντας τον άνθρωπο και στη συνέχεια fwrite, για παράδειγμα, στον τερματικό σταθμό, ή μπορείτε να ανατρέχετε σε αυτό το slide και βεβαιωθείτε ότι χρησιμοποιείτε το σωστό. Έτσι, και πάλι, για fwrite, όταν έχετε ένα αρχείο που θέλετε να γράψετε σε, που πρόκειται να είναι το τελευταίο επιχείρημα και ότι πρόκειται να είναι ένας δείκτης σε αυτό το αρχείο. Έτσι, τότε αυτό είναι το πώς θα αντιμετωπίσουμε με το γράψιμο ίσως αρκετά bytes κάθε φορά, αλλά ας πούμε ότι θέλετε να γράψετε μόνο σε μία και μόνο χαρακτήρα. Όπως θα δούμε αργότερα σε αυτό το παράδειγμα, στις εικόνες bitmap θα πρέπει να χρησιμοποιήσετε αυτό. Αυτό είναι όταν μπορούμε να χρησιμοποιήσουμε fputc, βάζοντας ουσιαστικά μόνο ένα χαρακτήρα τη φορά, chr, στο δείκτη αρχείου, και ότι είναι ο δείκτης μας εκεί έξω. Έτσι λοιπόν κάθε φορά που ζητούν ή γράφουν σε ένα αρχείο, το αρχείο παρακολούθηση του πού βρισκόμαστε. Γι 'αυτό είναι ένα είδος του δρομέα, ο δείκτης θέσης αρχείου. Και έτσι κάθε φορά που γράφουν ή να διαβάζουν και πάλι σε ένα αρχείο, το αρχείο θυμάται πραγματικότητα όπου είναι, και έτσι συνεχίζει από όπου βρίσκεται ο δρομέας. Αυτό μπορεί να είναι ευεργετική, όταν θέλετε να, ας πούμε, σε ένα ορισμένο ποσό για να κάνει κάτι και στη συνέχεια σε συνδυασμό με το ακόλουθο ποσό, αλλά μερικές φορές μπορεί να θέλετε να πάτε πίσω ή στην πραγματικότητα ξεκινούν από μια συγκεκριμένη τιμή αναφοράς. Έτσι λοιπόν η λειτουργία fseek, αυτό που κάνει είναι να μας επιτρέπει να μετακινήσετε το δρομέα σε ένα συγκεκριμένο αρχείο ένας ορισμένος αριθμός των bytes. Και τότε αυτό που έχουμε να κάνουμε είναι να καθορίσετε όπου η τιμή αναφοράς είναι. Έτσι, είτε κινείται προς τα εμπρός ή προς τα πίσω, από όπου ο δρομέας είναι επί του παρόντος, ή μπορούμε να δηλώσουμε ότι θα πρέπει να προχωρήσουμε σε μόλις από την αρχή του αρχείου ή από το τέλος του αρχείου. Και έτσι μπορείτε να περάσετε σε αρνητικές ή θετικές τιμές για το ποσό, και ότι θα το είδος της μετακινήσετε το δρομέα προς τα εμπρός ή προς τα πίσω. Πριν φτάσουμε στις άλλες psets, οποιεσδήποτε ερωτήσεις σχετικά με το αρχείο I / O; Εντάξει. Όπως έχουμε μπει σε περισσότερα παραδείγματα, μην διστάσετε να με σταματήσει για ερωτήσεις. Έτσι, σε Whodunit, είστε παρέδωσε ένα αρχείο bitmap παρόμοιο με αυτό κόκκινο στη διαφάνεια, και μοιάζει με αυτό - ένα μάτσο κόκκινα στίγματα - και εσείς δεν ξέρει πραγματικά τι είναι γραμμένο. Αν στραβισμός, μπορείτε να είστε σε θέση να δείτε μια μικρή μπλε χρώμα μέσα στη μέση. Ουσιαστικά, αυτό είναι όπου το κείμενο είναι αποθηκευμένο. Υπήρξε μια δολοφονία που συνέβη, και πρέπει να βρούμε ποιος το έκανε. Για να το κάνουμε αυτό, θα πρέπει να μετατρέψετε το είδος της αυτή την εικόνα σε αναγνώσιμη μορφή. Αν έχετε παιδιά που αντιμετωπίζουν ποτέ αυτό, μερικές φορές θα υπάρξει μικρή κιτ όπου θα έχετε ένα μεγεθυντικό φακό με ένα κόκκινο ταινία. Όποιος; Ναι. Έτσι, θα είναι σε χέρια κάτι τέτοιο, θα έχετε ένα μεγεθυντικό φακό με την κόκκινη ταινία πάνω του, θα το θέσω πάνω από την εικόνα, και θα είναι σε θέση να δείτε το μήνυμα που είναι κρυμμένο σ 'αυτό. Δεν έχουμε ένα μεγεθυντικό φακό με κόκκινο ταινία, έτσι ώστε αντί να πάμε να το είδος του δημιουργήσουν τα δικά μας σε αυτή PSET. Και έτσι ο χρήστης θα αστυνομικό θεατρικό έργο εισόδου, τότε η ένδειξη,. Bmp, έτσι ώστε να είναι η infile, που είναι η κόκκινη κουκκίδα μήνυμα, και στη συνέχεια να λένε verdict.bmp πρόκειται να είναι outfile μας. Έτσι, πρόκειται να δημιουργηθεί μια νέα εικόνα bitmap παρόμοια με την ιδέα ενός εκτός σε αναγνώσιμη μορφή, όπου μπορούμε να δούμε το κρυμμένο μήνυμα. Από τη στιγμή που πάμε να ασχολείται με την επεξεργασία και το χειρισμό των bitmaps κάποιου είδους, θα πάμε να το είδος της κατάδυσης σε στη δομή αυτών των αρχείων bitmap. Πήγαμε πάνω από αυτά λίγο σε διάλεξη, αλλά ας ρίξουμε μια ματιά σε αυτά λίγο περισσότερο. Bitmaps είναι ουσιαστικά μόνο μια διάταξη των bytes όπου έχουμε ορίζεται bytes το οποίο σημαίνει τι. Έτσι, εδώ είναι κάτι σαν ένα χάρτη της εικόνα bitmap λέγοντας ότι αρχίζει με ορισμένα αρχεία κεφαλίδας, ξεκινά με κάποιες πληροφορίες εκεί. Βλέπετε ότι σε περίπου αριθμό 14 byte το μέγεθος υποδεικνύεται από την εικόνα bitmap, και συνεχίζεται. Αλλά τότε τι είμαστε πραγματικά ενδιαφέρει εδώ είναι που αρχίζει γύρω byte αριθμό 54. Έχουμε αυτές τις τριάδες RGB. Τι το οποίο πρόκειται να κάνουμε είναι να περιέχει τα πραγματικά pixels, οι τιμές χρώματος. Τα πάντα πάνω από ότι στην κεφαλίδα είναι μερικές πληροφορίες που αντιστοιχεί στο μέγεθος της εικόνας, το πλάτος της εικόνας, και το ύψος. Όταν πάμε σε padding αργότερα, θα δούμε γιατί το μέγεθος της εικόνας θα μπορούσε να είναι διαφορετικό από το πλάτος ή το ύψος του. Έτσι, στη συνέχεια, να εκπροσωπούν αυτές - οι bitmap εικόνες είναι ακολουθίες από bytes - τι θα μπορούσαμε να κάνουμε είναι να πω εντάξει, θα πάω να θυμόμαστε ότι στο δείκτη 14, αυτό είναι όπου το μέγεθος είναι, για παράδειγμα, αλλά τι θα πάμε να κάνουμε για να κάνουν αυτό το πιο εύκολο είναι αυτό εγκλεισμό σε ένα struct. Και έτσι έχουμε δύο structs γίνονται για εμάς, μια BITMAPFILEHEADER και ένα BITMAPINFOHEADER, και έτσι κάθε φορά που διαβάζουμε σε σε αυτό το αρχείο, από προεπιλογή πρόκειται να πηγαίνουν σε τάξη, και έτσι ώστε να είναι, επίσης, πρόκειται να συμπληρώσετε σε μεταβλητές όπως biWidth και biSize. Και τελικά, κάθε pixel αντιπροσωπεύεται από τρία bytes. Η πρώτη είναι η ποσότητα του μπλε του εικονοστοιχείου, η δεύτερη είναι η ποσότητα του πράσινου, και τέλος, η ποσότητα του κόκκινου, όπου το 0 είναι ουσιαστικά όχι μπλε ή καθόλου πράσινο ή όχι κόκκινο και στη συνέχεια ff είναι η μέγιστη τιμή. Αυτά είναι δεκαεξαδικές τιμές. Έτσι λοιπόν, αν έχουμε ff0000, στη συνέχεια, ότι αντιστοιχεί στο μέγιστο ποσό των μπλε και στη συνέχεια, δεν υπάρχει κανένα πράσινο και κόκκινο χρώμα, έτσι τότε αυτό θα μας δώσει μια μπλε pixel. Στη συνέχεια, αν έχουμε όλα τα ff του σε όλους τους τομείς, τότε αυτό σημαίνει ότι έχουμε ένα λευκό pixel. Αυτό είναι το είδος της απέναντι συνήθως όταν λέμε RGB. Είναι πρόκειται πραγματικά BGR. Έτσι, αν θέλουμε πραγματικά να κοιτάξουμε σε ένα παράδειγμα από μια εικόνα bitmap - επιτρέψτε μου ένα τραβήξει μέχρι εδώ. Είναι λίγο μικρό. Είμαι μεγέθυνση, και μπορούμε να δούμε ότι είναι pixelated. Μοιάζει με μπλοκ του χρώματος. Έχετε λευκό μπλοκ και στη συνέχεια κόκκινο μπλοκ. Αν παίζετε στη Ζωγραφική της Microsoft, για παράδειγμα, θα μπορούσατε να κάνετε κάτι τέτοιο με βασικά ζωγραφική μόνο κάποια τετράγωνα σε μια συγκεκριμένη σειρά. Και τότε τι αυτό μεταφράζεται στο bitmap έχει ως εξής. Εδώ έχουμε πρώτα λευκά pixels, ότι όλες οι 6 είναι της f, και τότε θα έχουμε κόκκινα εικονοστοιχεία, υποδεικνύεται από 0000FF. Και έτσι η ακολουθία των bytes που έχουμε δείχνουν πως η εικόνα bitmap πρόκειται να δούμε. Έτσι, ό, τι έχω κάνει εδώ ακριβώς είναι γραμμένο από όλα αυτά τα bytes και στη συνέχεια χρώμα στο κόκκινο ώστε να μπορείτε να δείτε το είδος του, αν στραβισμός λίγο, πώς αυτό το είδος του δείχνει ένα χαμογελαστό πρόσωπο. Ο τρόπος που bitmap εικόνες είναι έργο μου οραματίζονται ουσιαστικά ως ένα πλέγμα. Και έτσι από προεπιλογή, κάθε γραμμή του πλέγματος πρέπει να είναι πολλαπλάσιο του 4 bytes. Αν κοιτάξουμε σε μια εικόνα bitmap, είστε συμπληρώνοντας κάθε αξία. Για παράδειγμα, μπορεί να έχετε ένα κόκκινο, ένα πράσινο εδώ εδώ, ένα μπλε εδώ, αλλά θα πρέπει να βεβαιωθείτε ότι η εικόνα συμπληρώνεται με ένα πολλαπλάσιο του τέσσερα bytes. Έτσι, αν θέλω να μου εικόνα είναι τρία τετράγωνα ευρύ, τότε θα πρέπει να βάλετε μια κενή τιμή στο τελευταίο να καταστεί ένα πολλαπλάσιο των τεσσάρων. Έτσι λοιπόν θα ήθελα να προσθέσω κάτι στο οποίο είμαστε καλώντας padding. Είμαι ακριβώς πρόκειται να δείξει ότι υπάρχουν με x. Τώρα λέμε ότι θέλουμε μια εικόνα που είναι 7 pixels καιρό, για παράδειγμα. Έχουμε 1, 2, 3, 4, 5, 6, 7, και όλα αυτά είναι γεμάτη με χρώμα. Ο τρόπος που λειτουργεί bitmap εικόνες είναι ότι χρειαζόμαστε μια 8ο. Αυτή τη στιγμή έχουμε 1, 2, 3, 4, 5, 6, 7. Χρειαζόμαστε 8 θέσεις για την εικόνα bitmap να διαβάσει σωστά. Και τότε τι θα πρέπει να κάνετε είναι να προσθέσετε σε μόλις ένα κομμάτι του padding για να βεβαιωθείτε ότι όλα τα πλάτη είναι ενιαίες και ότι όλα τα πλάτη είναι πολλαπλάσιο του 4. Και γι 'αυτό αναφέρθηκε προηγουμένως, ως γεμίσει x ή μια κυματιστή γραμμή, αλλά στις πραγματικές εικόνες bitmap το παραγέμισμα υποδεικνύεται από ένα δεκαεξαδικό 0. Έτσι, αυτό θα ήταν ένα μεμονωμένο χαρακτήρα, 0. Τι θα μπορούσε να έρθει σε πρακτικό είναι το xxd εντολή. Αυτό που κάνει είναι πραγματικά σας δείχνει, όπως και παρόμοιο με αυτό που έκανα πριν με το smiley Εγώ πραγματικά όταν εκτυπώνεται κάθε τι χρώμα θα είναι για το pixel και στη συνέχεια το χρωματικό κώδικα, όταν εκτελείτε xxd με τις ακόλουθες εντολές, τότε θα είναι πραγματικά ό, τι εκτυπώσετε τα χρώματα είναι για τις pixels. Τι έχετε να κάνετε είναι πάνω από εδώ μου δείχνουν, όπως το s-54 λέει ότι είμαι πρόκειται να ξεκινήσει στην 54η byte γιατί πριν από αυτό, να θυμάστε, αν κοιτάξουμε πίσω στο χάρτη των bitmaps, Αυτό είναι όλες οι πληροφορίες κεφαλίδας και τέτοια πράγματα. Αλλά αυτό που πραγματικά νοιάζονται για τα πραγματικά είναι εικονοστοιχεία που δείχνουν το χρώμα. Έτσι, με την προσθήκη σε αυτή τη σημαία, s-54, τότε θα είστε σε θέση να δείτε τις τιμές χρώματος. Και μην ανησυχείτε για τις περίπλοκες σημαίες και τέτοια πράγματα. Στο σύνολο spec πρόβλημα, θα έχετε οδηγίες για το πώς να χρησιμοποιήσετε xxd να εμφανίσετε τα pixels. Έτσι, αν δείτε εδώ, αυτό το είδος της μοιάζει με ένα πράσινο κουτί, αυτό το μικρό πράγμα. Έχω χρωματικό κώδικα της 00FF00 ως βασικά λέγοντας ότι δεν μπλε, πολύ πράσινο, κόκκινο και καμία. Έτσι που αντιστοιχεί στο πράσινο. Όπως μπορείτε να δείτε εδώ, βλέπουμε ένα πράσινο ορθογώνιο. Αυτό το πράσινο ορθογώνιο είναι μόνο 3 pixels πλάτος, έτσι τότε τι πρέπει να κάνουμε για να βεβαιωθείτε ότι η εικόνα είναι πολλαπλάσιο του 4 είναι να προσθέσετε πλάτος στο επιπλέον padding. Και έτσι στη συνέχεια, αυτό είναι το πώς βλέπετε αυτά τα 0s εδώ. Αυτό θα είναι πράγματι το αποτέλεσμα της PSET Resize σας, λαμβάνοντας κατ 'ουσίαν το μικρό bitmap και στη συνέχεια υπέβαλε διευρύνοντας 4. Και έτσι αυτό που βλέπουμε είναι ότι στην πραγματικότητα η εικόνα αυτή είναι 12 pixels πλάτος, αλλά 12 είναι πολλαπλάσιο του 4, και γι 'αυτό πραγματικά δεν βλέπω καμία 0s στο τέλος, επειδή δεν χρειάζεται να προσθέσετε οποιοδήποτε επειδή είναι πλήρως παραγεμισμένο. Δεν έχει πια δωμάτιο. Εντάξει. Οποιεσδήποτε ερωτήσεις σχετικά με την επένδυση; Εντάξει. Cool. Όπως ανέφερα και πριν, οι εικόνες bitmap είναι μόνο μια ακολουθία από bytes. Και έτσι αυτό που έχουμε είναι αντί να χρειάζεται να παρακολουθείτε ποια ακριβώς τον αριθμό των byte αντιστοιχεί σε ένα συγκεκριμένο στοιχείο, που πραγματικά έχουν δημιουργήσει ένα struct που να εκπροσωπεί. Έτσι, αυτό που έχουμε είναι μια RGBTRIPLE struct. Κάθε φορά που έχετε ένα παράδειγμα από μία τριάδα RGB, διότι αυτό είναι ένα είδος καθορίζουν struct, τότε μπορείτε να αποκτήσετε πρόσβαση στο rgbtBlue μεταβλητή, ομοίως το πράσινο και το κόκκινο μεταβλητές, οι οποίες θα καταδεικνύουν πόσο μπλε, πράσινο και κόκκινο, αντίστοιχα, έχετε. Έτσι, αν έχουμε το μπλε σύνολο μεταβλητών στο 0, το πράσινο σύνολο σε ff, η οποία είναι η μέγιστη τιμή που μπορείτε να έχετε, και στη συνέχεια η κόκκινη μεταβλητή οριστεί σε 0, τότε τι χρώμα θα ήταν η συγκεκριμένη τριάδα RGB αντιπροσωπεύουν; >> [Φοιτητής] Πράσινο. Πράσινο. Ακριβώς. Είναι πρόκειται να είναι χρήσιμο να γνωρίζουμε ότι κάθε φορά που έχετε ένα παράδειγμα από μία τριάδα RGB, μπορείτε να έχετε πρόσβαση στην πραγματικότητα την ποσότητα του χρώματος - μπλε, πράσινο, κόκκινο και - ξεχωριστά. Τώρα που έχουμε μιλήσει για τη δομή του ότι, ας ρίξουμε μια ματιά στο αρχείο BMP. Αυτά είναι structs για εσάς. Εδώ έχουμε ένα struct BITMAPFILEHEADER. Του ενδιαφέροντος είναι το μέγεθος. Αργότερα, έχουμε την κεφαλίδα πληροφορίες, το οποίο έχει μερικά περισσότερα πράγματα που έχουν ενδιαφέρον για μας, δηλαδή το μέγεθος, το πλάτος και το ύψος. Όπως θα πάμε σε αργότερα, όταν έχετε διαβάσει μέσα στο αρχείο, διαβάζει αυτόματα γιατί έχουμε ορίσετε τη σειρά να είναι το ίδιο. Έτσι, η biSize θα περιέχει τις σωστές bytes που αντιστοιχούν στο πραγματικό μέγεθος της εικόνας. Και στη συνέχεια, εδώ, τέλος, όπως έχουμε μιλήσει, έχουμε την RGBTRIPLE typedef struct. Έχουμε μια rgbtBlue, πράσινο, κόκκινο και να σχετίζεται με αυτήν. Μεγάλη. Εντάξει. Τώρα που καταλαβαίνουμε bitmaps λίγο, να καταλάβουν ότι έχουμε μια κεφαλίδα του αρχείου και μια κεφαλίδα πληροφορίες που συνδέονται με αυτό και στη συνέχεια, μετά από αυτό, έχουμε την ενδιαφέροντα πράγματα των χρωμάτων, και τα χρώματα εκπροσωπούνται από RGBTRIPLE structs, και εκείνες, με τη σειρά τους, έχουν τρεις τιμές που σχετίζονται με το μπλε, το πράσινο, το κόκκινο και. Μέχρι τώρα, μπορούμε να το είδος των σκέφτονται Ανάκτηση για λίγο. Λυπάμαι. Σκεφτείτε Whodunit. Όταν έχουμε ιδέα μας αρχείο, τότε αυτό που θέλουμε να κάνουμε είναι να διαβάσει για να το pixel προς pixel και στη συνέχεια να αλλάξετε με κάποιο τρόπο τα pixels, έτσι ώστε να μπορούμε να το εξάγει σε αναγνώσιμη μορφή. Και έτσι για να εξάγει, θα πάμε να γράψω pixel προς pixel στο αρχείο verdict.bmp. Αυτό είναι το είδος της μια πολλά να κάνουμε. Αντιλαμβανόμαστε ότι. Έτσι, αυτό που έχουμε κάνει είναι ότι έχουμε την προϋπόθεση ότι έχετε πραγματικά με copy.c. Τι copy.c κάνει είναι απλά κάνει ένα ακριβές αντίγραφο ενός αρχείου bitmap και στη συνέχεια, εξάγει το. Έτσι, αυτό ανοίγει ήδη το αρχείο για εσάς, αναφέρει σε pixel προς pixel, και γράφει στη συνέχεια σε σε ένα αρχείο εξόδου. Ας ρίξουμε μια ματιά σε αυτό. Αυτή είναι η εξασφάλιση της ορθής χρήσης, να πάρει τα ονόματα εδώ. Αυτό που κάνει είναι να θέτει το αρχείο εισόδου να είναι ό, τι έχουμε περάσει μέσα στο infile εδώ, το οποίο είναι το δεύτερο όρισμα της γραμμής εντολών μας. Έλεγχοι για να βεβαιωθείτε ότι μπορούμε να ανοίξουμε το αρχείο. Έλεγχοι για να βεβαιωθείτε ότι μπορούμε να κάνουμε μια νέα outfile εδώ. Τότε τι κάνει αυτό εδώ, απλά ουσιαστικά ξεκινά την ανάγνωση του αρχείου bitmap από την αρχή. Η αρχή, όπως γνωρίζουμε, περιέχει το BITMAPFILEHEADER, και έτσι οι ακολουθίες των bits άμεσα θα συμπληρώσουν το BITMAPFILEHEADER. Έτσι, αυτό που έχουμε εδώ λέει ότι BITMAPFILEHEADER bf - ότι είναι νέα μεταβλητή μας BITMAPFILEHEADER του τύπου - θα πάμε να βάλουμε μέσα bf τι διαβάζουμε από το δείκτη, η οποία είναι infile μας. Πόσο μπορώ να διαβάζουμε; Διαβάζουμε σε πόσα bytes πρέπει να περιέχουν το σύνολο BITMAPFILEHEADER. Ομοίως, αυτό είναι που κάνουμε για την κεφαλίδα πληροφορίες. Έτσι είμαστε συνεχίζει κατά μήκος αρχείο μας στην infile, και είμαστε ανάγνωση των bits και bytes, και εμείς να τους συνδέσετε απευθείας σε σε αυτές τις περιπτώσεις από τις μεταβλητές που φτιάχνουμε. Εδώ είμαστε απλώς να διασφαλίσουμε ότι το bitmap είναι ένα bitmap. Τώρα έχουμε μια outfile, έτσι δεν είναι; Έτσι ως έχει, όταν το δημιουργείτε, αυτό είναι ουσιαστικά άδειο. Γι 'αυτό πρέπει να δημιουργήσουμε ουσιαστικά ένα νέο bitmap από το μηδέν. Αυτό που κάνουμε είναι ότι πρέπει να βεβαιωθείτε ότι θα αντιγράψει στην κεφαλίδα του αρχείου και η επικεφαλίδα πληροφορίες ακριβώς όπως το έχει infile. Αυτό που κάνουμε είναι να γράφουμε - και να θυμάστε ότι bf είναι η μεταβλητή BITMAPFILEHEADER του τύπου, έτσι ώστε αυτό που κάνουμε είναι να χρησιμοποιήσουμε ακριβώς αυτό το περιεχόμενο να γράψετε στο outfile. Εδώ, θυμηθείτε μιλήσαμε για επένδυση, τρόπο με τον οποίο είναι σημαντικό να βεβαιωθείτε ότι το ποσό των pixel που έχουμε είναι πολλαπλάσιο του 4. Αυτό είναι ένα πολύ χρήσιμο τύπο για να υπολογίσει πόσο έχετε γεμίσει δίνεται το πλάτος του αρχείου σας. Θέλω εσείς να θυμάστε ότι σε copy.c έχουμε μια φόρμουλα για τον υπολογισμό padding. Εντάξει; Έτσι, να θυμάστε ότι ο καθένας. Μεγάλη. Και τότε τι κάνει copy.c επόμενο είναι επαναλαμβάνεται σε όλες τις scanlines. Στη συνέχεια μέσα από τις γραμμές και στη συνέχεια αποθηκεύει κάθε τριπλή ότι διαβάζει και το γράφει στη συνέχεια στο outfile. Μέχρι τότε εδώ είμαστε ανάγνωση μόνο ένα τριπλό RGB σε ένα χρόνο και στη συνέχεια τη θέση ότι η ίδια τριπλή στο outfile. Το δύσκολο μέρος είναι ότι η επένδυση δεν είναι ένα τριπλό RGB, και γι 'αυτό δεν μπορεί να διαβάσει μόνο το ποσό της συμπλήρωσης τριάδες RGB. Αυτό που έχουμε να κάνουμε είναι να προχωρήσουμε στην πραγματικότητα μόνο το αρχείο δείκτης μας θέση, μετακινήστε τον κέρσορα μας, το είδος της παραλείψετε πάνω από όλα την επένδυση ώστε να είμαστε στην επόμενη σειρά. Και τότε τι είναι αυτό που κάνει είναι αντίγραφο που δείχνει πώς μπορεί να θέλετε να προσθέσετε το παραγέμισμα. Έτσι έχουμε υπολογιστεί πόση πλήρωση χρειαζόμαστε, έτσι αυτό σημαίνει ότι χρειαζόμαστε τον αριθμό συμπλήρωσης των 0s. Αυτό που κάνει είναι για το βρόχο που βάζει τον αριθμό συμπλήρωσης των 0s σε outfile μας. Και τελικά, να κλείσετε και τα δύο αρχεία. Θα κλείσει το infile καθώς και την outfile. Έτσι, αυτό είναι το πώς copy.c έργα, και ότι πρόκειται να είναι αρκετά χρήσιμο. Αντί ακριβώς στην πραγματικότητα απευθείας αντιγραφή και επικόλληση ή απλά κοιτάζοντας το και πληκτρολογώντας σε ό, τι θέλετε, ίσως απλά θέλετε να εκτελέσετε αυτή την εντολή στο τερματικό, cp copy.c whodunit.c, η οποία θα δημιουργήσει ένα νέο αρχείο, whodunit.c, που περιέχει ακριβώς το ίδιο περιεχόμενο με αντίγραφο κάνει. Έτσι, τότε τι μπορούμε να κάνουμε είναι να χρησιμοποιήσουμε αυτό ως ένα πλαίσιο πάνω στο οποίο θα χτίσει και να επεξεργαστείτε για το αρχείο αστυνομικό θεατρικό έργο μας. Αυτά είναι για μας-dos για να κάνετε Whodunit, αλλά τι κάνει copy.c είναι παίρνει πραγματικά τη φροντίδα του τα περισσότερα από αυτά για μας. Έτσι, το μόνο που χρειάζεται να κάνετε στη συνέχεια είναι να αλλάξει τα pixels, όπως απαιτείται πραγματικά να κάνει το αρχείο αναγνώσιμο. Να θυμάστε ότι για ένα δεδομένο pixel τρίκλινα, έτσι για μια δεδομένη μεταβλητή του τύπου RGBTRIPLE, μπορείτε να έχετε πρόσβαση στα μπλε, πράσινο, κόκκινο και αξίες. Αυτό πρόκειται να έρθει σε πρακτικό, διότι αν μπορείτε να έχετε πρόσβαση, αυτό σημαίνει ότι μπορείτε να ελέγξετε τους επίσης, και αυτό σημαίνει ότι μπορείτε να αλλάξετε τους επίσης. Έτσι, όταν πήγαμε πίσω στο κόκκινο παράδειγμα ποτήρι μας φακό, βασικά, που δρούσε ως ένα είδος φίλτρου για εμάς. Έτσι, αυτό που θέλουμε να κάνουμε είναι να θέλουμε να φιλτράρει όλες τις τριάδες που έρχονται in Υπάρχουν αρκετοί διαφορετικοί τρόποι να γίνει αυτό. Βασικά, μπορείτε να έχετε ό, τι τύπο του φίλτρου που θέλετε. Ίσως θέλετε να αλλάξετε όλα τα κόκκινα εικονοστοιχεία ή ίσως θέλετε να αλλάξετε ένα διαφορετικό χρώμα pixel σε ένα διαφορετικό χρώμα. Αυτό είναι στο χέρι σας. Να θυμάστε ότι μπορείτε να ελέγξετε τι χρώμα είναι το pixel και στη συνέχεια μπορείτε να αλλάξετε επίσης ως περνάτε. Εντάξει. Έτσι, αυτό είναι Whodunit. Αφού εκτελέσετε Whodunit, θα ξέρετε ποιος είναι ο ένοχος του εγκλήματος ήταν. Τώρα θα πάμε για να πάει στο Αλλαγή μεγέθους. Εμείς πάμε για να συνεχίσουν να ασχολούνται με bitmap. Τι θα πάμε να κάνουμε είναι θα πάμε να έχουν ένα bitmap εισόδου και στη συνέχεια θα πάμε να περάσει σε μια σειρά και στη συνέχεια να πάρει ένα outfile bitmap όπου αυτό είναι βασικά infile μας κλιμακώνεται από n. Πείτε το αρχείο μου ήταν μόνο ένα μεγάλο pixel. Στη συνέχεια, αν n μου ήταν 3, κλιμάκωση από 3, τότε θα ήθελα να επαναλάβω ότι pixel n φορές, έτσι 3 φορές, και στη συνέχεια, κλιμάκωση επίσης κάτω από 3 φορές, καθώς και. Βλέπετε λοιπόν ότι είμαι κλιμάκωση κάθετα όσο και οριζόντια. Και τότε εδώ είναι ένα παράδειγμα. Αν έχετε n = 2, θα δείτε ότι η πρώτη μπλε pixel επαναλαμβάνεται δύο φορές οριζόντια όσο και κάθετα δύο φορές. Και τότε αυτό συνεχίζεται, και έτσι έχετε άμεση κλιμάκωση της αρχικής εικόνας από δύο. Έτσι λοιπόν, αν ήμασταν στη λεπτομέρεια τον ψευδοκώδικα για αυτό, θέλουμε να ανοίξετε το αρχείο. Και στη συνέχεια, γνωρίζοντας ότι αν πάμε πίσω εδώ, βλέπουμε ότι το πλάτος για την outfile πρόκειται να είναι διαφορετική από ό, τι το πλάτος του εσώτερου αρχείου. Τι σημαίνει αυτό; Αυτό σημαίνει ότι πληροφορίες κεφαλίδας μας πρόκειται να αλλάξει. Και έτσι αυτό που θα θελήσετε να κάνετε είναι να ενημερώσετε τις πληροφορίες κεφαλίδας, γνωρίζοντας ότι όταν διαβάζουμε στα αρχεία αν λειτουργούν στο πλαίσιο copy.c, έχουμε ήδη μια μεταβλητή που δείχνει ποιο είναι το μέγεθος και τέτοια πράγματα. Έτσι, μόλις έχετε ότι, ό, τι μπορεί να θέλετε να κάνετε είναι να αλλάξετε αυτές τις συγκεκριμένες μεταβλητές. Να θυμάστε, αν έχετε ένα struct, πώς θα αποκτήσετε πρόσβαση στις μεταβλητές μέσα σε αυτό. Μπορείτε να χρησιμοποιήσετε τον τελεστή τελεία, έτσι δεν είναι; Έτσι, στη συνέχεια, χρησιμοποιώντας ότι, ξέρετε ότι θα πρέπει να αλλάξετε τις πληροφορίες κεφαλίδας. Έτσι, εδώ είναι μόνο μια λίστα των πραγματικών στοιχείων που πρόκειται να αλλάζει στο αρχείο σας. Το μέγεθος αρχείου πρόκειται να αλλάζει, η εικόνα, καθώς και το πλάτος και το ύψος. Έτσι, στη συνέχεια πηγαίνει πίσω στο χάρτη των bitmaps, εξετάσει κατά πόσον είναι η κεφαλίδα του αρχείου ή η επικεφαλίδα πληροφορίες που περιέχει τις πληροφορίες και στη συνέχεια να αλλάξετε ανάλογα με τις ανάγκες. Και πάλι, λένε cp copy.c resize.c. Αυτό σημαίνει ότι τώρα resize.c περιέχει όλα όσα περιέχονται μέσα σε αντίγραφο επειδή μας παρέχει αντίγραφο έναν τρόπο ανάγνωσης σε κάθε pixel προς pixel scanline. Μόνο που τώρα, όχι μόνο την αλλαγή των τιμών, όπως κάναμε σε Whodunit, αυτό που θέλουμε να κάνουμε είναι να θέλουμε να γράψουμε σε πολλές pixels εφ 'όσον το η μας είναι μεγαλύτερος από 1. Στη συνέχεια, αυτό που θέλουμε να κάνουμε είναι να θέλουμε να τεντώσει από n οριζόντια, καθώς και τεντώστε ως κάθετα με το n. Πώς να το κάνουμε αυτό; Πείτε ν σας είναι 2 και έχετε αυτό το δεδομένο infile. Ο δρομέας πρόκειται να ξεκινήσει στο πρώτο, και τι θέλετε να κάνετε, αν n είναι 2, που θέλετε να εκτυπώσετε σε 2 από αυτά. Έτσι, εκτυπώνετε σε 2 από αυτά. Στη συνέχεια, ο δρομέας πρόκειται να προχωρήσουμε στο επόμενο pixel, η οποία είναι η κόκκινη, και πρόκειται να εκτυπώσετε 2 των εν λόγω κόκκινα, προσαρτώντας το σε ό, τι έχει κάνει στο παρελθόν. Στη συνέχεια, ο κέρσορας θα μετακινηθεί στο επόμενο pixel και σχεδιάστε σε 2 από αυτά. Αν κοιτάξουμε πίσω στο copy.c πλαίσιο, τι κάνει αυτό το δικαίωμα εδώ είναι ότι δημιουργεί ένα νέο στιγμιότυπο του μία τριάδα RGB, μια νέα μεταβλητή που ονομάζεται τριπλό. Και εδώ όταν διαβάζει σε αυτό, διαβάζει από το infile 1 RGBTRIPLE και αποθηκεύει στο εσωτερικό της εν λόγω τριπλής μεταβλητής. Έτσι, τότε έχετε πραγματικά μια μεταβλητή που αντιπροσωπεύει το συγκεκριμένο pixel. Στη συνέχεια, όταν γράφετε, τι μπορεί να θέλετε να κάνετε είναι να περιβάλλουν την fwrite δήλωση σε ένα for loop που γράφει σε outfile σας όσες φορές χρειάζεται. Αυτό είναι αρκετά απλό. Απλώς επαναλαμβάνουν ουσιαστικά τη διαδικασία γραφής n αριθμός των φορές να την περιορίσουμε σε οριζόντια θέση. Αλλά τότε θα πρέπει να θυμόμαστε ότι η επένδυση μας πρόκειται να αλλάξει. Προηγουμένως, είχαμε πει κάτι μήκους 3. Στη συνέχεια θα προσθέσω μόνο στο πόσο επένδυση; Απλά ένα περισσότερο για να κάνουν ένα πολλαπλάσιο του 4. Αλλά πούμε ότι είμαστε κλιμάκωση αυτή τη συγκεκριμένη εικόνα από n = 2. Έτσι λοιπόν πόσα μπλε pixels θα έχουμε στο τέλος; Θα είχαμε 6. 1, 2, 3, 4, 5, 6. Εντάξει. 6 δεν είναι πολλαπλάσιο του 4. Ποιο είναι το πλησιέστερο πολλαπλάσιο του 4; Αυτό πρόκειται να είναι 8. Έτσι, είμαστε πραγματικά πρόκειται να έχουν 2 χαρακτήρες του padding εκεί. Θυμάται κανείς αν έχουμε μια φόρμουλα για τον υπολογισμό padding και όπου αυτό θα μπορούσε να είναι; [Ακούγεται ανταπόκριση των φοιτητών] >> Ναι, copy.c. Δεξιά. Υπάρχει ένας τύπος σε copy.c να υπολογίσετε πόσο έχετε γεμίσει δίνεται ένα συγκεκριμένο πλάτος του bitmap εικόνας. Έτσι, τότε αυτό πρόκειται να είναι χρήσιμο όταν θέλετε να προσθέσετε σε ένα ορισμένο ποσό των padding πραγματικά να καταλάβω πόσο επένδυση θα πρέπει να προσθέσετε. Αλλά ένα σημείωμα, όμως, είναι ότι θέλετε να βεβαιωθείτε ότι χρησιμοποιείτε το σωστό μέγεθος. Απλά να είστε προσεκτικοί, γιατί είστε ουσιαστικά πρόκειται να ασχολούνται με δύο εικόνων bitmap. Θέλετε να βεβαιωθείτε ότι χρησιμοποιείτε το σωστό. Όταν τον υπολογισμό του padding για την outfile, θέλετε να χρησιμοποιήσετε το πλάτος του outfile και όχι το πλάτος της προηγούμενης. Μεγάλη. Αυτό το είδος της φροντίζει εκτείνεται σε ολόκληρη την εικόνα bitmap σε οριζόντια θέση. Αλλά αυτό που θέλουμε να κάνουμε είναι να τεντώσει πραγματικά κατακόρυφα, καθώς και. Αυτό πρόκειται να είναι λίγο πιο περίπλοκη, διότι όταν έχουμε τελειώσει την αντιγραφή μιας γραμμής και εγγράφως ότι η σειρά, δρομέας μας θα είναι στο τέλος. Έτσι, αν διαβάσετε ξανά, τότε αυτό είναι ακριβώς πρόκειται να διαβάζονται στην επόμενη γραμμή. Έτσι, αυτό που θέλουμε να κάνουμε είναι το είδος του βρει κάποιο τρόπο για την αντιγραφή αυτών των γραμμών και πάλι ή ακριβώς το είδος λήψη της εν λόγω γραμμής και στη συνέχεια να το ξαναγράψουν πάλι. Όπως το είδος του αναφέρθηκα, υπάρχουν διάφοροι τρόποι για να γίνει αυτό. Τι θα μπορούσατε να κάνετε είναι ως περνάτε και την ανάγνωση μέσα από το συγκεκριμένο scanline και αλλάζοντας ως αναγκαίο, στη συνέχεια το είδος του καταστήματος όλα αυτά τα εικονοστοιχεία σε μία συστοιχία. Στη συνέχεια, αργότερα ξέρετε ότι θα πρέπει να εκτυπώσετε και πάλι αυτού του πίνακα, και έτσι μπορείτε να χρησιμοποιήσετε μόνο αυτού του πίνακα για να το κάνουμε αυτό. Ένας άλλος τρόπος για να το κάνετε είναι να μπορείτε να αντιγράψετε τα κάτω κατά μία γραμμή, κατανοήσουν ότι θα πρέπει να αντιγράψετε ότι και πάλι, έτσι ώστε να μετακινήσετε τον κέρσορα στην πραγματικότητα, και ότι πρόκειται να χρησιμοποιεί τη μέθοδο fseek. Μπορείτε να μετακινήσετε το δρομέα σας όλος ο τρόπος πίσω και στη συνέχεια επαναλάβετε τη διαδικασία αντιγραφής και πάλι. Έτσι, εάν ο αριθμός κλιμάκωσης μας είναι n, τότε πόσες φορές θα πρέπει να πάμε πίσω και να ξαναγράψει μια γραμμή; >> [Φοιτητής] n - 1. >> Ναι, τέλεια. ν - 1. Έχουμε κάνει ήδη μια φορά, οπότε τότε θα θελήσετε να επαναλάβετε τη διαδικασία πηγαίνει πίσω n - 1 το ποσό των φορές. Εντάξει. Έτσι εκεί έχετε τη λειτουργία αλλαγής μεγέθους σας. Τώρα, μπορούμε να φτάσουμε σε ένα πραγματικά διασκεδαστικό μέρος, το αγαπημένο μου PSET, η οποία είναι Ανάκτηση. Αντί bitmaps, αυτή τη φορά έχουμε να κάνουμε με αρχεία JPEG. Είμαστε στην πραγματικότητα δεν έδωσε μόνο ένα αρχείο από αρχεία JPEG, μας δίνεται ουσιαστικά μια ακατέργαστη μορφή κάρτας μνήμης. Και έτσι αυτό περιέχει ένα κομμάτι του πληροφορίες και τα σκουπίδια αξίες στην αρχή, και τότε αρχίζει και έχει μια δέσμη των αρχείων JPEG. Ωστόσο, είμαστε παρέδωσε μια κάρτα που έχουμε διαγράψει τις φωτογραφίες? ουσιαστικά, έχουμε ξεχάσει, όπου οι φωτογραφίες που βρίσκονται μέσα στην κάρτα. Έτσι λοιπόν το καθήκον μας στο Ανάκτηση είναι να περάσει από αυτή τη μορφή κάρτας και να βρει ξανά αυτές τις εικόνες. Ευτυχώς, η δομή των αρχείων JPEG και το αρχείο της κάρτας είναι λίγο χρήσιμη. Σίγουρα θα μπορούσε να ήταν λίγο πιο περίπλοκη, αν δεν ήταν στη συγκεκριμένη μορφή. Κάθε αρχείο JPEG ξεκινά στην πραγματικότητα με δύο πιθανές ακολουθίες, που αναφέρονται παραπάνω. Βασικά, κάθε φορά που έχετε ένα νέο αρχείο JPEG, ξεκινά είτε με την αλληλουχία ffd8 ffe0 ή ο άλλος, ffd8 ffe1. Ένα άλλο χρήσιμο πράγμα που πρέπει να ξέρετε είναι ότι αρχεία JPEG αποθηκεύονται συνεχόμενα. Έτσι, κάθε φορά που ένα αρχείο JPEG τελειώνει, η άλλη ξεκινά. Έτσι, δεν υπάρχει κανενός είδους σε-μεταξύ των τιμών εκεί. Μόλις χτυπήσει την έναρξη μιας JPEG, αν έχετε ήδη την ανάγνωση ενός JPEG, ξέρετε ότι έχετε χτυπήσει το τέλος της προηγούμενης και την αρχή της επόμενης. Για να απεικονίσει το είδος αυτό, έκανα μια σχηματική. Ένα άλλο πράγμα για αρχεία JPEG είναι ότι μπορούμε να τα διαβάσετε σε ακολουθίες από 512 bytes σε ένα χρόνο, παρομοίως με την έναρξη της κάρτας. Δεν χρειάζεται να ελέγχουν κάθε byte μόνο γιατί αυτό θα πιπιλίζουν. Έτσι, αντ 'αυτού, αυτό που μπορούμε να κάνουμε είναι στην πραγματικότητα απλά διαβάστε το 512 bytes σε ένα χρόνο και, στη συνέχεια, αντί να το check-in μεταξύ εκείνων σε αυτά τα μικροσκοπικά φετάκια, μπορούμε να ελέγξουμε είναι μόνο η αρχή των 512 bytes. Ουσιαστικά, σε αυτή την εικόνα, αυτό που βλέπετε είναι στην αρχή της κάρτας, έχετε αξίες που δεν είναι πραγματικά σχετικό με τα πραγματικά αρχεία JPEG τους. Στη συνέχεια, όμως αυτό που έχω είναι ένα αστέρι για να δείξει μία από τις δύο σειρές εκκίνησης για ένα JPEG. Έτσι, κάθε φορά που βλέπετε ένα αστέρι, ξέρετε ότι έχετε ένα αρχείο JPEG. Και στη συνέχεια, κάθε αρχείο JPEG πρόκειται να είναι κάποιο πολλαπλάσιο των 512 bytes αλλά όχι απαραίτητα το ίδιο πολλαπλάσιο. Ο τρόπος που ξέρετε ότι έχετε χτυπήσει ένα άλλο JPEG είναι αν χτυπήσει ένα άλλο αστέρι, άλλο ξεκινώντας ακολουθία από bytes. Στη συνέχεια, αυτό που έχουμε εδώ είναι που έχουν το κόκκινο JPEG αρχείο συνεχίζοντας μέχρι να χτυπήσει ένα αστέρι, η οποία υποδεικνύεται με ένα νέο χρώμα. Θα συνεχίσει και στη συνέχεια να χτυπήσει ένα άλλο αστέρι, να χτυπήσει ένα άλλο JPEG, θα συνεχίσει σε όλη τη διαδρομή μέχρι το τέλος. Είσαι στην τελευταία εικόνα εδώ, το ροζ ένα. Μπορείτε να πάτε μέχρι το τέλος, μέχρι να χτυπήσει το τέλος του αρχείου χαρακτήρα. Αυτό πρόκειται να είναι πραγματικά χρήσιμο. Μερικές βασικές takeaways εδώ: Το αρχείο της κάρτας δεν ξεκινά με ένα JPEG, αλλά άπαξ και αρχίσει ένα JPEG, όλα τα αρχεία JPEG αποθηκεύονται παράπλευρα ο ένας στον άλλο. Μερικά ψευδοκώδικα για την Ανάκτηση. Κατ 'αρχάς, θα πάμε για να ανοίξετε το αρχείο της κάρτας μας, και ότι πρόκειται να χρησιμοποιεί το αρχείο μας λειτουργίες I / O. Εμείς πάμε για να επαναλάβετε την ακόλουθη διαδικασία μέχρι να έχουμε φτάσει στο τέλος του αρχείου. Εμείς πάμε για να διαβάσει 512 byte σε μια στιγμή. Και αυτό που είπα εδώ είναι θα πάμε να το αποθηκεύσετε σε ένα ρυθμιστικό, τόσο βασικά για να κρατήσει αυτές τις 512 bytes μέχρι να μάθουμε ακριβώς τι να κάνει με αυτούς. Στη συνέχεια, αυτό που θέλουμε να κάνουμε είναι να θέλουμε να ελέγξουμε αν έχουμε χτυπήσει ένα αστέρι ή όχι. Αν έχουμε χτυπήσει ένα αστέρι, αν έχουμε χτυπήσει ένα από τα αρχικά ακολουθίες, τότε ξέρουμε ότι έχουμε χτυπήσει ένα νέο αρχείο JPEG. Αυτό που θα θελήσετε να κάνετε είναι να πάμε να θέλετε να δημιουργήσετε ένα νέο αρχείο στο κατάλογο μας pset4 να συνεχίσει να κάνει αυτό το αρχείο. Αλλά επίσης, αν έχουμε κάνει ήδη πριν από JPEG, τότε θέλουμε να τελειώσει αυτό το αρχείο και πιέστε το στο pset4 φάκελο, όπου θα έχουμε αυτό το αρχείο αποθηκεύεται γιατί αν δεν διευκρινίζουν ότι έχουμε κατέληξε ότι το αρχείο JPEG, τότε θα έχουμε ουσιαστικά ένα απροσδιόριστο ποσό. Τα αρχεία JPEG δεν θα τελειώσει ποτέ. Έτσι, θέλετε να βεβαιωθείτε ότι όταν είμαστε σε ανάγνωση σε ένα αρχείο JPEG και εγγράφως ότι, θέλουμε να κλείσουμε συγκεκριμένα ότι, προκειμένου να ανοίξει το επόμενο. Θα θελήσετε να ελέγξετε διάφορα πράγματα. Θέλουμε να ελέγξετε αν είμαστε στην αρχή μιας νέας JPEG με ρυθμιστικό μας και επίσης αν ήδη έχουν βρει ένα JPEG πριν επειδή αυτό θα αλλάξει τη διαδικασία σας ελαφρώς. Έτσι, στη συνέχεια, αφού περάσουν από όλα τον τρόπο και χτυπάτε το τέλος του αρχείου, τότε τι θα θέλετε να κάνετε είναι θα θελήσετε να κλείσετε όλα τα αρχεία που είναι ανοιχτές. Αυτό θα είναι πιθανότατα το τελευταίο αρχείο JPEG που έχετε, καθώς και το αρχείο της κάρτας που έχετε ήδη ασχολούνται με. Το τελευταίο εμπόδιο που πρέπει να αντιμετωπίσουμε είναι το πώς να κάνουν πραγματικά ένα αρχείο JPEG και πώς να ωθήσει πραγματικά στο φάκελο. Η PSET απαιτεί ότι κάθε JPEG που θα βρείτε είναι με την ακόλουθη μορφή, όπου έχετε τον αριθμό. jpg. Ο αριθμός, ακόμα κι αν είναι 0, λέμε 000.jpg. Όταν βρείτε ένα JPEG στο πρόγραμμά σας, θα πάμε να θέλουν να το αναφέρουμε με τη σειρά που έχει βρει. Τι σημαίνει αυτό; Πρέπει να το είδος του να παρακολουθείτε πόσα έχουμε βρεθεί και ό, τι ο αριθμός των κάθε JPEG πρέπει να είναι. Εδώ θα πάμε να επωφεληθούν από την sprintf λειτουργία. Παρόμοια με την printf, η οποία ακριβώς το είδος των εκτυπώσεων από μια τιμή στο τερματικό, sprintf εκτυπώνει το αρχείο έξω στο φάκελο. Και έτσι ό, τι αυτό θα κάνω, αν είχα sprintf, τον τίτλο, και στη συνέχεια το string εκεί, θα εκτυπώσετε 2.jpg. Αν υποθέσουμε ότι έχω κλείσει σωστά τα αρχεία μου, που θα περιέχει το αρχείο που είχα γράψει έξω. Αλλά ένα πράγμα είναι ότι ο κώδικας που έχω εδώ δεν ικανοποιεί αρκετά το τι PSET απαιτεί. Η PSET απαιτεί ότι το δεύτερο αρχείο JPEG πρέπει να ονομαστεί 002 αντί των μόλις 2. Έτσι, κατά την εκτύπωση από το όνομα, τότε ίσως να θέλετε να αλλάξει ελαφρώς το σύμβολο κράτησης θέσης. Θυμάται κανείς πώς θα επιτρέπουν την επιπλέον χώρους όταν τυπώνουμε κάτι; Ναι. >> [Φοιτητής] Βάζετε ένα 3 μεταξύ του σημείου τοις εκατό και το 2. >> Ναι, τέλεια. Θα βάλει ένα 3 στην περίπτωση αυτή, επειδή θέλουμε χώρο για 3. 3d% θα μπορούσε πιθανότατα να σας δώσει 002.jpg αντί για 2. Το πρώτο επιχείρημα στην sprintf λειτουργία είναι στην πραγματικότητα ένα char array, οποία προηγουμένως ήξερε ως χορδές. Εκείνοι βούληση, το είδος της περισσότερο σαν μια προσωρινή αποθήκευση, την αποθήκευση μόνο η προκύπτουσα σειρά. Δεν θα είναι πραγματικά ασχολούνται με αυτό, αλλά θα πρέπει να το συμπεριλάβει. Γνωρίζοντας ότι κάθε όνομα αρχείου έχει τον αριθμό, το οποίο καταλαμβάνει τρεις χαρακτήρες, και στη συνέχεια. jpg, πόσο καιρό θα πρέπει να είναι αυτός ο πίνακας; Ρίξτε μια σειρά. Πόσοι χαρακτήρες στον τίτλο, στο όνομα; Έτσι, υπάρχουν 3 hashtags, περίοδο, jpg. >> [Φοιτητής] 7. >> 7. Δεν είναι αρκετά. Εμείς πάμε να θέλουν 8, διότι θέλουμε να καταστεί δυνατή η μηδενική τερματισμού, καθώς και. Τέλος, μόνο και μόνο για να σκιαγραφήσει τη διαδικασία που θα πρέπει να κάνει για την Ανάκτηση, έχετε κάποιες πληροφορίες αρχή. Θα συνεχίσουμε μέχρι να βρείτε την αρχή ενός αρχείου JPEG, και αυτό μπορεί να είναι είτε μία από τις δύο αρχικών ακολουθιών. Θα εξακολουθήσουν να διαβάζουν. Κάθε κάθετος εδώ αντιπροσωπεύει 512 bytes. Μπορείτε να κρατήσει την ανάγνωση, να κρατήσει την ανάγνωση μέχρι να συναντήσετε μια άλλη σειρά εκκίνησης. Μόλις έχετε ότι, μπορείτε να τερματίσετε την τρέχουσα JPEG - σε αυτή την περίπτωση, είναι το κόκκινο, έτσι θέλετε να τελειώσει αυτό. Θέλετε να sprintf το όνομα του ότι σε pset4 φάκελο σας, τότε θα θέλετε να ανοίξετε ένα νέο JPEG και στη συνέχεια να κρατήσει την ανάγνωση μέχρι να συναντήσει την επόμενη. Κρατήστε την ανάγνωση, συνεχίστε το διάβασμα, και στη συνέχεια, τελικά, τελικά, θα πάμε για να φτάσετε στο τέλος του αρχείου, και έτσι θα θελήσετε να κλείσετε την τελευταία JPEG που εργάζονταν με, sprintf ότι σε pset4 φάκελο σας, και στη συνέχεια να εξετάσουμε όλες τις εικόνες που έχετε πάρει. Αυτές οι εικόνες είναι πραγματικά εικόνες από CS50 προσωπικό, και έτσι αυτό είναι όπου η διασκέδαση μπόνους μέρος της PSET έρχεται σε είναι ότι ανταγωνίζονται σε τμήματα σας για να βρείτε τα TFs στις εικόνες και να βγάλετε φωτογραφίες μαζί τους για να αποδείξουν ότι έχετε κάνει την PSET και έτσι μπορείτε να δείτε ποια μέλη του προσωπικού είναι στις φωτογραφίες. Μέχρι τότε μπορείτε να τραβήξετε φωτογραφίες με το προσωπικό. Μερικές φορές θα πρέπει να τους κυνηγήσει. Ίσως μερικοί από αυτούς θα προσπαθήσει να τρέξει μακριά από εσάς. Μπορείτε να βγάλετε φωτογραφίες μαζί τους. Αυτό είναι σε εξέλιξη. Δεν είναι απαιτητοί, όταν το PSET οφείλεται. Η προθεσμία θα ανακοινωθεί στο spec. Στη συνέχεια, μαζί με το τμήμα σας, όποιο τμήμα παίρνει τις περισσότερες φωτογραφίες με τα περισσότερα μέλη του προσωπικού θα κερδίσει ένα αρκετά φοβερό βραβείο. Αυτό είναι το είδος των κινήτρων για να πάρει pset4 σας τελειώσει όσο το δυνατόν γρηγορότερα επειδή τότε μπορείτε να πιάσουμε δουλειά κυνήγι κάτω όλα τα διαφορετικά CS50 μέλη του προσωπικού. Αυτό δεν είναι υποχρεωτική, αν και, έτσι μόλις πάρετε τις εικόνες, τότε έχετε τελειώσει με pset4. Και είμαι τελειώσει με Walkthrough 4, οπότε σας ευχαριστώ όλους που ήρθατε. Καλή τύχη με ιατροδικαστικές. [Χειροκροτήματα] [CS50.TV]