1 00:00:00,000 --> 00:00:09,500 >> [Παίζει μουσική] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Ήταν Δεσποινίς Scarlett με το κηροπήγιο. 3 00:00:12,350 --> 00:00:13,560 Whodunit; 4 00:00:13,560 --> 00:00:15,030 Λοιπόν, θα πάμε να το μάθουμε. 5 00:00:15,030 --> 00:00:20,870 Στο Clue επιτραπέζιο παιχνίδι, ίσως να δοθεί μια φυσική κόκκινη εικόνα. 6 00:00:20,870 --> 00:00:24,120 Και αυτή η εικόνα είναι πολύ κόκκινο και ανώμαλος, και η δουλειά σας είναι να 7 00:00:24,120 --> 00:00:25,490 αποκαλύψει το κρυμμένο μήνυμα. 8 00:00:25,490 --> 00:00:29,740 Και συνήθως είστε παρέχεται με ένα κόκκινο μεγεθυντικό φακό, ή μια κόκκινη οθόνη για να 9 00:00:29,740 --> 00:00:31,410 αποκαλύπτουν ότι η κρυμμένο μήνυμα. 10 00:00:31,410 --> 00:00:33,340 Λοιπόν, θα πάμε να μιμούνται αυτό. 11 00:00:33,340 --> 00:00:37,960 >> Στο αστυνομικό θεατρικό έργο, σας δίνεται μια εικόνα bitmap που μοιάζει πολύ ανώμαλος και κόκκινο, 12 00:00:37,960 --> 00:00:43,430 και στη συνέχεια εκτελέστε το πρόγραμμα whodunit για να αποκαλύψει ένα κρυφό μήνυμα. 13 00:00:43,430 --> 00:00:45,650 >> Έτσι, ας σπάσει αυτό σε βήματα. 14 00:00:45,650 --> 00:00:50,390 Κατ 'αρχάς, θέλετε να ανοίξετε το αρχείο - η ιδέα που έχετε δώσει. 15 00:00:50,390 --> 00:00:53,880 Και στη συνέχεια να δημιουργήσετε επίσης ένα αρχείο bitmap ετυμηγορία. 16 00:00:53,880 --> 00:00:58,240 Στη συνέχεια, θέλετε να ενημερώσετε το bitmap header πληροφορίες για την outfile ετυμηγορία. 17 00:00:58,240 --> 00:00:59,920 Περισσότερα για αυτό αργότερα. 18 00:00:59,920 --> 00:01:04,319 Και τότε θα πάμε να διαβάσετε σε το ιδέα, scanline, pixel προς pixel, 19 00:01:04,319 --> 00:01:07,320 αλλάζοντας τα χρώματα pixel ως αναγκαίο, και τη γραφή 20 00:01:07,320 --> 00:01:08,960 εκείνες στην ετυμηγορία - 21 00:01:08,960 --> 00:01:12,000 pixel προς pixel σε η scanline ετυμηγορία. 22 00:01:12,000 --> 00:01:13,780 >> Πώς μπορούμε να αρχίσει πηγαίνει γι 'αυτό; 23 00:01:13,780 --> 00:01:16,940 Καλά, ευτυχώς, έχουμε copy.c στον κώδικα διανομής. 24 00:01:16,940 --> 00:01:21,240 Και αυτό πρόκειται να αποδείξει πολύ χρήσιμο για μας. 25 00:01:21,240 --> 00:01:29,700 Copy.c ανοίγει ένα αρχείο, διαβάζει ότι header infile του, και στη συνέχεια, ενημερώνει το 26 00:01:29,700 --> 00:01:31,070 header outfile του. 27 00:01:31,070 --> 00:01:37,010 Και στη συνέχεια να διαβάζει κάθε εικονοστοιχείο στην scanline, pixel προς pixel, και κατόπιν 28 00:01:37,010 --> 00:01:42,390 γράφει ότι η pixel στην outfile. 29 00:01:42,390 --> 00:01:45,020 >> Έτσι, το πρώτο σας βήμα θα μπορούσε είναι να εκτελέσετε την ακόλουθη 30 00:01:45,020 --> 00:01:46,420 εντολή στο τερματικό - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Αυτό θα δημιουργήσει ένα αντίγραφο του copy.c ονομάζεται whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Έτσι, το πρώτο μας βήμα για να ανοίξει το αρχείο, καλά, υπάρχει μια ακριβής 34 00:01:58,320 --> 00:02:00,070 αντίγραφο του ότι copy.c. 35 00:02:00,070 --> 00:02:03,360 Γι 'αυτό θα σας αφήσει να το εξετάσουμε αυτό. 36 00:02:03,360 --> 00:02:07,860 >> Αυτό που έχουμε να κάνουμε στην παρούσα PSET είναι file I / O, ουσιαστικά λαμβάνοντας αρχεία, 37 00:02:07,860 --> 00:02:10,229 την ανάγνωση, τη γραφή, την επεξεργασία τους. 38 00:02:10,229 --> 00:02:12,650 Πώς μπορείτε πρώτα να ανοίξετε ένα αρχείο; 39 00:02:12,650 --> 00:02:16,800 Λοιπόν, θα πάμε για να δηλώσει ένα αρχείο δείκτη, και στη συνέχεια να καλέσετε το 40 00:02:16,800 --> 00:02:18,670 συνάρτηση fopen. 41 00:02:18,670 --> 00:02:23,150 Περάστε στη διαδρομή ή το όνομα του εν λόγω αρχείο, και στη συνέχεια η λειτουργία που θέλετε 42 00:02:23,150 --> 00:02:24,700 να ανοίξετε το αρχείο μέσα 43 00:02:24,700 --> 00:02:28,620 Περνώντας σε ένα r θα ανοίξει foo.bmp για την ανάγνωση. 44 00:02:28,620 --> 00:02:35,670 Λαμβάνοντας υπόψη ότι η fopen με το πέρασμα σε μια w θα ανοιχτή bar.bmp, για τη σύνταξη του φακέλου και 45 00:02:35,670 --> 00:02:37,020 στην πραγματικότητα επεξεργασία. 46 00:02:37,020 --> 00:02:41,970 >> Έτσι, τώρα που έχουμε ανοίξει το αρχείο, μας το επόμενο βήμα είναι να ενημερώσετε τις πληροφορίες κεφαλίδας 47 00:02:41,970 --> 00:02:43,230 για την outfile. 48 00:02:43,230 --> 00:02:44,610 Τι είναι μια κεφαλίδα πληροφορίες; 49 00:02:44,610 --> 00:02:48,160 Λοιπόν, πρώτα πρέπει να γνωρίζουμε τι είναι bitmap. 50 00:02:48,160 --> 00:02:51,000 Ένα bitmap είναι μόνο μια απλή διάταξη των bytes. 51 00:02:51,000 --> 00:02:55,480 Και από όπου και αν δηλώνονται σε αυτό το αρχείο εδώ, bmp.h, με μια δέσμη των 52 00:02:55,480 --> 00:02:58,610 πληροφορίες για το τι ένα bitmap είναι στην πραγματικότητα κατασκευασμένα από. 53 00:02:58,610 --> 00:03:05,730 Αλλά αυτό που πραγματικά νοιάζονται για το κεφαλίδα του αρχείου bitmap, ακριβώς εδώ, και 54 00:03:05,730 --> 00:03:08,460 οι πληροφορίες bitmap header, εδώ. 55 00:03:08,460 --> 00:03:13,170 Η επικεφαλίδα αποτελείται από ένα ζευγάρι των μεταβλητές που θα αποδειχθεί πολύ χρήσιμη. 56 00:03:13,170 --> 00:03:18,400 Υπάρχει biSizeImage, η οποία είναι η συνολικό μέγεθος της εικόνας σε bytes. 57 00:03:18,400 --> 00:03:20,890 Και αυτό περιλαμβάνει pixels και padding. 58 00:03:20,890 --> 00:03:24,210 Padding είναι πολύ σημαντική, αλλά θα φτάσουμε σε αυτό αργότερα. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth αντιπροσωπεύει το πλάτος της εικόνας σε pixels μείον το παραγέμισμα. 60 00:03:30,000 --> 00:03:34,220 BiHeight είναι τότε επίσης το ύψος της εικόνας σε pixels. 61 00:03:34,220 --> 00:03:38,240 Και στη συνέχεια το BITMAPFILEHEADER και το BITMAPINFOHEADER, όπως ανέφερα 62 00:03:38,240 --> 00:03:40,900 Νωρίτερα, εκείνοι εκπροσωπούνται ως structs. 63 00:03:40,900 --> 00:03:45,410 Έτσι, δεν μπορείτε να αποκτήσετε πρόσβαση στο αρχείο κεφαλίδα μόνη της, αλλά θα θελήσετε να πάρετε για να 64 00:03:45,410 --> 00:03:47,370 αυτές οι μεταβλητές μέσα. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Επομένως, πώς θα ενημερώσετε τις πληροφορίες κεφαλίδας; 67 00:03:50,600 --> 00:03:54,020 Λοιπόν, πρώτα θα πρέπει να δούμε αν μπορούμε πρέπει να αλλάξετε οποιαδήποτε πληροφορία από 68 00:03:54,020 --> 00:03:58,480 η infile, η ένδειξη, με την outfile, η ετυμηγορία. 69 00:03:58,480 --> 00:04:00,250 Είναι κάτι αλλάζει σε αυτή την περίπτωση; 70 00:04:00,250 --> 00:04:04,320 Λοιπόν, δεν είναι πραγματικά, γιατί θα πάμε να αλλάζει μόνο τα χρώματα. 71 00:04:04,320 --> 00:04:07,550 Εμείς δεν πρόκειται να αλλάξει το αρχείο το μέγεθος, το μέγεθος της εικόνας, το πλάτος, 72 00:04:07,550 --> 00:04:08,310 ή το ύψος. 73 00:04:08,310 --> 00:04:14,010 Έτσι, είστε εντάξει για τώρα απλά την αντιγραφή κάθε pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Έτσι τώρα ας δούμε πώς μπορούμε πραγματικά μπορεί να διαβάσει κάθε pixel από το αρχείο. 76 00:04:20,720 --> 00:04:23,640 Ένα άλλο αρχείο I / O λειτουργία θα μπαίνουν στο παιχνίδι - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Παίρνει σε ένα δείκτη στο struct η οποία θα περιέχει τα bytes που 79 00:04:28,440 --> 00:04:30,110 διαβάζετε. 80 00:04:30,110 --> 00:04:31,890 Έτσι διαβάζετε σε αυτό. 81 00:04:31,890 --> 00:04:36,090 Και τότε θα περάσει σε ένα μέγεθος, το οποίο είναι το μέγεθος του κάθε στοιχείου που θα 82 00:04:36,090 --> 00:04:37,360 θέλετε να διαβάσετε. 83 00:04:37,360 --> 00:04:40,640 Εδώ, η sizeof λειτουργία θα έρθει σε πρακτικό. 84 00:04:40,640 --> 00:04:45,570 Στη συνέχεια θα περάσει σε αριθμό, τα οποία αντιπροσωπεύει τον αριθμό των στοιχείων του 85 00:04:45,570 --> 00:04:47,480 μέγεθος για να το διαβάσετε. 86 00:04:47,480 --> 00:04:51,180 Και τελικά, inptr, η οποία είναι ο δείκτης αρχείου που είστε 87 00:04:51,180 --> 00:04:52,530 πρόκειται να διαβάσει από. 88 00:04:52,530 --> 00:04:58,650 Έτσι, όλα αυτά τα στοιχεία είναι μέσα inptr και θα πάμε στα δεδομένα. 89 00:04:58,650 --> 00:05:01,660 >> Ας δούμε ένα μικρό παράδειγμα. 90 00:05:01,660 --> 00:05:07,590 Αν θέλω να διαβάσω σε δεδομένα δύο σκυλιά, καλά, μπορώ να το κάνω με δύο τρόπους. 91 00:05:07,590 --> 00:05:15,250 Μπορώ να διαβάσετε είτε σε δύο αντικείμενα μεγέθους σκυλί από inptr μου, ή μπορώ να διαβάσω 92 00:05:15,250 --> 00:05:19,280 σε ένα αντικείμενο στο μέγεθος των δύο σκυλιά. 93 00:05:19,280 --> 00:05:23,580 Έτσι, θα δείτε ότι ανάλογα με τον τρόπο ότι έχετε κανονίσει το μέγεθος και αριθμό, 94 00:05:23,580 --> 00:05:25,840 μπορεί να διαβάσει τον ίδιο αριθμό των bytes. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Έτσι τώρα, ας αλλάξουμε το pixel χρώμα, όπως έχουμε ανάγκη. 97 00:05:33,020 --> 00:05:37,320 Αν κοιτάξετε bmp.h και πάλι, στη συνέχεια, θα δείτε ότι στο κάτω μέρος 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs είναι μια άλλη struct, όπου αυτά αποτελούνται από τρία bytes. 99 00:05:42,920 --> 00:05:49,220 Ένα, rgbtBlue, rgbtGreen και rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Έτσι ώστε κάθε ένα από αυτά αντιπροσωπεύει το ποσό μπλε, η ποσότητα του πράσινου, και το 101 00:05:52,480 --> 00:05:57,250 ποσότητα του κόκκινου χρώματος μέσα σε αυτό το pixel, όπου κάθε ποσό που αντιπροσωπεύεται από ένα 102 00:05:57,250 --> 00:05:58,670 δεκαεξαδικό αριθμό. 103 00:05:58,670 --> 00:06:04,370 >> Έτσι ff0000 θα είναι ένα μπλε χρώμα, επειδή πηγαίνει από το μπλε, 104 00:06:04,370 --> 00:06:05,850 σε πράσινο, κόκκινο. 105 00:06:05,850 --> 00:06:09,300 Και τότε όλα f θα είναι λευκό. 106 00:06:09,300 --> 00:06:13,440 Ας ρίξουμε μια ματιά σε smiley.bmp, η οποία έχετε στον κώδικα της διανομής σας. 107 00:06:13,440 --> 00:06:15,690 Εάν το ανοίξετε σε μόλις μια εικόνα θεατή, τότε θα 108 00:06:15,690 --> 00:06:17,080 απλά δείτε ένα κόκκινο smiley. 109 00:06:17,080 --> 00:06:20,380 Όμως, λαμβάνοντας μια βαθύτερη κατάδυση σε, θα δείτε ότι η δομή 110 00:06:20,380 --> 00:06:22,340 του είναι ακριβώς pixels. 111 00:06:22,340 --> 00:06:25,880 Έχουμε λευκά εικονοστοιχεία, και, στη συνέχεια, κόκκινα εικονοστοιχεία. 112 00:06:25,880 --> 00:06:31,000 Το λευκό, FFFFFF, και στη συνέχεια όλα τα κόκκινα εικονοστοιχεία έχω χρωματισμένο για σας 113 00:06:31,000 --> 00:06:35,440 εδώ, και θα δείτε ότι είναι 0000FF. 114 00:06:35,440 --> 00:06:39,760 Μηδέν μπλε, πράσινο μηδέν, και την πλήρη κόκκινο. 115 00:06:39,760 --> 00:06:45,350 Και δεδομένου ότι smiley είναι οκτώ pixels πλάτος, δεν έχουμε καμία padding. 116 00:06:45,350 --> 00:06:47,360 Εντάξει. 117 00:06:47,360 --> 00:06:53,310 >> Έτσι, εάν επρόκειτο να ορίσετε διαφορετικές τιμές σε RGBTRIPLE και ήθελα να 118 00:06:53,310 --> 00:06:58,350 να το κάνει πράσινο, τότε αυτό που θα κάνουμε είναι να Θα ήθελα να δηλώσω RGBTRIPLE, που ονομάζεται 119 00:06:58,350 --> 00:07:02,660 τρίκλινα, και στη συνέχεια να έχουν πρόσβαση σε κάθε byte μέσα σε αυτό το struct I 120 00:07:02,660 --> 00:07:04,030 Θα χρησιμοποιήσετε τον τελεστή τελεία. 121 00:07:04,030 --> 00:07:08,430 Έτσι triple.rgbtBlue, μπορώ εκχωρήσετε ότι στο 0. 122 00:07:08,430 --> 00:07:13,460 Πράσινο μπορώ να το αναθέσει σε πλήρη - κάθε αριθμό, πραγματικά, μεταξύ 0 και επόμενα. 123 00:07:13,460 --> 00:07:15,470 Και στη συνέχεια, κόκκινο, Είμαι, επίσης, πρόκειται να πω 0. 124 00:07:15,470 --> 00:07:19,160 Οπότε αυτό μου δίνει ένα πράσινο pixel. 125 00:07:19,160 --> 00:07:23,030 >> Στη συνέχεια, τι κι αν θέλετε να ελέγξετε η αξία του κάτι; 126 00:07:23,030 --> 00:07:27,250 Θα μπορούσα να έχω κάτι που ελέγχει αν η αξία του τριπλού του rgbtBlue είναι 127 00:07:27,250 --> 00:07:31,080 ff και στη συνέχεια να εκτυπώσετε, «αισθάνομαι μπλε! ", ως αποτέλεσμα. 128 00:07:31,080 --> 00:07:35,640 Τώρα, αυτό δεν σημαίνει κατ 'ανάγκην ότι η pixel είναι μπλε, σωστά; 129 00:07:35,640 --> 00:07:40,060 Επειδή πράσινο και κόκκινο αξίες του pixel θα μπορούσαν επίσης να έχουν μη-0 τιμές. 130 00:07:40,060 --> 00:07:43,470 Ό, τι αυτό σημαίνει, και όλα αυτά αυτό είναι ο έλεγχος για 131 00:07:43,470 --> 00:07:45,610 για μια πλήρη μπλε χρώμα. 132 00:07:45,610 --> 00:07:50,050 Αλλά όλα τα εικονοστοιχεία θα μπορούσαν επίσης να έχουν μερική τιμές χρώματος, όπως αυτό 133 00:07:50,050 --> 00:07:52,180 επόμενο παράδειγμα εδώ. 134 00:07:52,180 --> 00:07:55,400 >> Είναι λίγο πιο δύσκολο να δείτε τι αυτή η εικόνα είναι τώρα. 135 00:07:55,400 --> 00:08:00,320 Αυτό φαίνεται λίγο περισσότερο σαν το clue.bmp ότι θα πρέπει να δοθεί. 136 00:08:00,320 --> 00:08:03,600 Τώρα, φυσικά, θα μπορούσε να λύσει αυτό, επειδή υπάρχει μια πολύ κόκκινο, με 137 00:08:03,600 --> 00:08:07,040 κρατώντας μια κόκκινη οθόνη για την εικόνα έτσι ότι μπορεί να εμφανιστούν τα άλλα χρώματα. 138 00:08:07,040 --> 00:08:10,968 Επομένως, πώς θα μιμούνται αυτό με c; 139 00:08:10,968 --> 00:08:15,640 Λοιπόν, θα μπορούσαμε να αφαιρέσετε όλα τα κόκκινα από την εικόνα. 140 00:08:15,640 --> 00:08:21,870 Και έτσι να το κάνουμε αυτό θα καθορίζεται κάθε κόκκινο τιμή pixel προς μηδέν. 141 00:08:21,870 --> 00:08:25,020 Και έτσι η εικόνα θα δούμε λίγο Κάτι σαν αυτό, όπου δεν έχουμε καμία κόκκινο 142 00:08:25,020 --> 00:08:26,300 απολύτως. 143 00:08:26,300 --> 00:08:29,390 >> Μπορούμε να δούμε το κρυφό μήνυμα α λίγο πιο καθαρά τώρα. 144 00:08:29,390 --> 00:08:31,730 Είναι άλλο ένα χαμογελαστό πρόσωπο. 145 00:08:31,730 --> 00:08:33,870 Ή ίσως θα μπορούσαμε να χρησιμοποιήσουμε μια άλλη μέθοδο. 146 00:08:33,870 --> 00:08:36,480 Ίσως, θα μπορούσαμε να διακρίνουμε όλα τα κόκκινα εικονοστοιχεία - 147 00:08:36,480 --> 00:08:41,100 δηλαδή, όλα τα εικονοστοιχεία με 0 μπλε, πράσινο 0 και 0 κόκκινο - 148 00:08:41,100 --> 00:08:43,169 και να αλλάξετε εκείνα για τα λευκά. 149 00:08:43,169 --> 00:08:45,470 Και την εικόνα μας μπορεί να μοιάζει κάτι σαν αυτό. 150 00:08:45,470 --> 00:08:48,250 Μια λίγο πιο εύκολο να δούμε. 151 00:08:48,250 --> 00:08:51,170 >> Υπάρχουν πολλοί άλλοι τρόποι για να αποκαλύψει το μυστικό μήνυμα, καθώς, 152 00:08:51,170 --> 00:08:53,730 που ασχολούνται με το χειρισμό του χρώματος. 153 00:08:53,730 --> 00:08:57,050 Ίσως μπορείτε να χρησιμοποιήσετε μία από τις μεθόδους που ανέφερα παραπάνω. 154 00:08:57,050 --> 00:08:59,600 Και επιπλέον, μπορεί να θέλετε να ενισχύσει ορισμένα χρώματα 155 00:08:59,600 --> 00:09:02,620 και να φέρει τα έξω. 156 00:09:02,620 --> 00:09:06,190 >> Έτσι, τώρα που έχουμε αλλάξει το pixel το χρώμα, την επόμενη εμείς απλά πρέπει να τα γράψω 157 00:09:06,190 --> 00:09:08,500 μέσα στο scanline, pixel προς pixel. 158 00:09:08,500 --> 00:09:11,860 Και για άλλη μια φορά, θα θελήσετε να κοιτάξουμε πίσω να copy.c, αν δεν το έχετε αντιγράψει 159 00:09:11,860 --> 00:09:18,170 ήδη, και να εξετάσουμε την fwrite λειτουργία, η οποία λαμβάνει τα δεδομένα, ένας δείκτης 160 00:09:18,170 --> 00:09:23,230 στο struct που περιέχει το ψηφιολέξεις ότι διαβάζετε από, το μέγεθος της 161 00:09:23,230 --> 00:09:26,610 τα στοιχεία, ο αριθμός των τεμαχίων, και στη συνέχεια το outptr - 162 00:09:26,610 --> 00:09:29,450 ο προορισμός αυτών των αρχείων. 163 00:09:29,450 --> 00:09:34,010 >> Αφού γράψετε στα pixels, θα είστε πρέπει επίσης να γράψετε στην padding. 164 00:09:34,010 --> 00:09:34,970 Τι είναι το υπόστρωμα; 165 00:09:34,970 --> 00:09:38,670 Λοιπόν, κάθε pixel rgbt είναι τρία bytes. 166 00:09:38,670 --> 00:09:43,670 Όμως, η scanline για μια εικόνα bitmap πρέπει να είναι ένα πολλαπλάσιο των τεσσάρων byte. 167 00:09:43,670 --> 00:09:47,650 Και εάν ο αριθμός των pixels που δεν είναι πολλαπλάσιο του τέσσερα, τότε θα πρέπει να προσθέσετε 168 00:09:47,650 --> 00:09:48,880 αυτά τα μαξιλαράκια. 169 00:09:48,880 --> 00:09:51,420 Padding είναι μόνο εκπροσωπείται από 0s. 170 00:09:51,420 --> 00:09:54,380 Έτσι, πώς γράφουμε, ή να διαβάσετε αυτό; 171 00:09:54,380 --> 00:09:59,280 Λοιπόν, αποδεικνύεται ότι δεν μπορείτε πραγματικά fread padding, αλλά μπορείτε να 172 00:09:59,280 --> 00:10:00,970 υπολογισμό αυτό. 173 00:10:00,970 --> 00:10:04,400 >> Σε αυτή την περίπτωση, η ιδέα και η ετυμηγορία έχουν το ίδιο πλάτος, έτσι ώστε η 174 00:10:04,400 --> 00:10:05,910 παραγεμίσματος είναι η ίδια. 175 00:10:05,910 --> 00:10:09,370 Και το padding, όπως θα δείτε σε copy.c, υπολογίζεται 176 00:10:09,370 --> 00:10:11,790 με τον παρακάτω τύπο - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth φορές sizeof (RGBTRIPLE) θα να μας δώσει πόσα bytes το bmp 178 00:10:16,690 --> 00:10:18,280 έχει σε κάθε γραμμή. 179 00:10:18,280 --> 00:10:21,890 Από εκεί, οι modulos και αφαιρέσεις με 4 μπορεί να υπολογίσει πόσο 180 00:10:21,890 --> 00:10:25,610 πρέπει να προστεθεί ο αριθμός των bytes, έτσι ώστε το πολλαπλάσιο των bytes για 181 00:10:25,610 --> 00:10:27,250 κάθε σειρά είναι τέσσερις. 182 00:10:27,250 --> 00:10:30,490 >> Τώρα που έχουμε τον τύπο για πόση πλήρωση χρειαζόμαστε, τώρα 183 00:10:30,490 --> 00:10:31,610 μπορούμε να το γράψω. 184 00:10:31,610 --> 00:10:34,080 Τώρα, ανέφερα και πριν, padding είναι μόνο 0s. 185 00:10:34,080 --> 00:10:39,730 Έτσι, στην περίπτωση αυτή, είμαστε απλά βάζοντας μια χαρα, σε αυτή την περίπτωση ένα 0, σε μας 186 00:10:39,730 --> 00:10:41,710 outptr - outfile μας. 187 00:10:41,710 --> 00:10:47,530 Έτσι ώστε να μπορεί να είναι μόνο fputc 0, κόμμα outptr. 188 00:10:47,530 --> 00:10:52,400 >> Έτσι, ενώ έχουμε διαβάσει σε μας αρχείων, file I / O έχει παρακολουθημένη μας 189 00:10:52,400 --> 00:10:57,440 θέση σε αυτά τα αρχεία με κάτι καλείται ο δείκτης θέσης αρχείου. 190 00:10:57,440 --> 00:10:59,350 Σκεφτείτε το σαν ένα δρομέα. 191 00:10:59,350 --> 00:11:03,550 Βασικά, προχωρεί κάθε φορά ότι Fread, αλλά έχουμε 192 00:11:03,550 --> 00:11:05,671 ελέγχουν πάνω από αυτό, πάρα πολύ. 193 00:11:05,671 --> 00:11:11,030 >> Για να μετακινήσετε το δείκτη θέσης αρχείου, μπορείτε να χρησιμοποιήσετε τη λειτουργία fseek. 194 00:11:11,030 --> 00:11:15,600 Όταν η inptr αντιπροσωπεύει το αρχείο δείκτη που αναζητάτε μέσα, το 195 00:11:15,600 --> 00:11:20,370 ποσότητα είναι ο αριθμός των bytes που θα θέλετε να μετακινήσετε το δρομέα, και στη συνέχεια από 196 00:11:20,370 --> 00:11:23,470 σχετίζεται με το σημείο αναφοράς από όπου βρίσκεται ο δρομέας. 197 00:11:23,470 --> 00:11:26,770 Αν περάσει SEEK_CUR, ότι αντιπροσωπεύει την τρέχουσα 198 00:11:26,770 --> 00:11:28,100 θέση στο αρχείο. 199 00:11:28,100 --> 00:11:31,020 Ή μπορείτε να χρησιμοποιήσετε κάποιες άλλες παραμέτρους. 200 00:11:31,020 --> 00:11:35,400 Έτσι, θα μπορούσαμε να θέλετε να χρησιμοποιήσετε fseek να παρακάμψετε πάνω από την επενδυτική πλήρωση του αρχείο σε μορφή. 201 00:11:35,400 --> 00:11:39,410 Και πάλι, αν είστε κολλημένοι, υπάρχει ένα παράδειγμα ότι στην copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Έτσι τώρα έχουμε ανοίξει το αρχείο, η ιδέα, και η ετυμηγορία. 203 00:11:43,260 --> 00:11:46,450 Έχουμε ενημερωθεί τις πληροφορίες κεφαλίδας για ετυμηγορία μας, γιατί κάθε 204 00:11:46,450 --> 00:11:48,730 bitmap χρειάζεται μια κεφαλίδα. 205 00:11:48,730 --> 00:11:52,280 Έχουμε στη συνέχεια, διαβάστε στην ιδέα του scanline, pixel προς pixel, αλλάζοντας 206 00:11:52,280 --> 00:11:55,210 κάθε χρώμα ανάλογα με τις ανάγκες, και γραπτώς σε εκείνα τα 207 00:11:55,210 --> 00:11:57,340 ετυμηγορία, pixel προς pixel. 208 00:11:57,340 --> 00:12:01,550 Μόλις ανοίξετε την ετυμηγορία, μπορείτε να δείτε ποιος ο ένοχος, ή ποιο είναι το μυστικό 209 00:12:01,550 --> 00:12:02,850 μήνυμα. 210 00:12:02,850 --> 00:12:05,550 Το όνομά μου είναι Zamyla, και αυτό ήταν whodunit. 211 00:12:05,550 --> 00:12:12,864