JASON Hirschhorn: Καλώς ήρθατε, ο καθένας, την Εβδομάδα 6. Είμαι στην ευχάριστη θέση να σας δούμε όλους ζωντανός και καλά μετά Quiz 0, γιατί ξέρω ότι ήταν λίγο τραχιά. Αλλά ευτυχώς, όλοι έκανε απίστευτα καλά. Και έτσι αυτό είναι υπέροχο. Αν είστε στο τμήμα μου, έχω δώσει πιο από εσάς πίσω κουίζ σας ήδη. Ένα ζευγάρι από εσάς, είμαι συνάντηση μετά το μάθημα. Και αν είστε φοιτητής επέκτασης και δεν έχετε λάβει κουίζ σας πίσω ακόμα, TF σας είναι πιθανώς εργάζονται σε αυτό και η διαβάθμιση είναι, και θα το πάρει πίσω για να σας σύντομα. Έτσι, οι μαθητές επέκταση μου που είναι βλέποντας τώρα - ελπίζω να ζήσουν - Θα πάρει κουίζ σας σύντομα, καθώς και. Το πρόγραμμά μας για σήμερα είναι η εξής. Κατ 'αρχάς, θα πάμε να πάει πέρα ​​από μερικές πόρους που CS50 παρέχει σε σας. Εμείς πάμε για να πάει πάνω Quiz 0 επόμενο, και Θα απαντήσει σε οποιεσδήποτε ερωτήσεις κανέναν έχει περίπου ιδιαίτερα προβλήματα. Και τότε, θα πρέπει να πηγαίνει πάνω file I / O και το πρόβλημα που 5. Αυτά τα δύο τελευταία θέματα θα λάβει μέχρι το μεγαλύτερο μέρος του τμήματος σήμερα. Έβαλα τη λίστα αυτή κάθε εβδομάδα ως υπενθύμιση σε όλους σας, αλλά και των βασικών τμήμα, έχουμε μόνο 90 ​​λεπτά - εμείς δεν είναι σε θέση να καλύπτει τα πάντα που έχω θα ήθελαν να καλύψει για σας παιδιά. Αλλά έχουμε έναν τόνο των πόρων για την να αξιοποιήσει, όπως θα έχετε να ξέρετε το υλικό και την εργασία μέσω το πρόβλημά σας θέτει. Μια υπενθύμιση που έχω σε απευθείας σύνδεση ένα κείμενο κουτί, που έχει συσταθεί για να συμπληρώσετε αν έχετε οποιαδήποτε σχόλια για μένα, τόσο θετικές όσο και εποικοδομητικό, για το τμήμα. Αυτό URL βρίσκεται ακριβώς εδώ κάτω. Επομένως, σας παρακαλώ, πάρτε μια στιγμή αν έχετε κάποιο σχολίων, είτε κατά τη διάρκεια της τμήμα, ή μετά, ή μετά μπορείτε να παρακολουθήσετε το βίντεο σε απευθείας σύνδεση, να μου δώσετε τα σχόλιά σας. Πραγματικά, εκτιμώ οποιαδήποτε και όλα αυτά. Έτσι έχω ήδη έχουν μικρές συνομιλίες με πολλή μου μαθητές σε όλη τη διάρκεια της εβδομάδας - όπως εγώ το χέρι πίσω κουίζ, μιλώντας για το Φυσικά, βλέποντας πώς κάνεις. Και ένα θέμα έχει έρθει πάνω και πάνω μιλάμε για - σε Ειδικότερα - πρόβλημα θέτει. Και έχω έγκλειστα αυτό το θέμα στον πίνακα δεξιά τώρα. Ουσιαστικά, υπάρχει μια διαφορά μεταξύ στροφή σε κάτι που είναι γίνεται σωστά και κάτι ότι γίνεται καλά. Οι περισσότεροι άνθρωποι έχουν κάνει φανταστική από την άποψη της ορθότητας - 5 ή 4 για όλες τις psets. Οι περισσότεροι άνθρωποι παίρνουν εκείνες όλη την ώρα. Ωστόσο, μόνο και μόνο επειδή έχετε κάνει κάτι σωστό δεν σημαίνει ότι έχετε κάνει κάτι τόσο κομψά, ή αποτελεσματικά, είτε ως καθαρά όπως σας θα μπορούσε να κάνει. Και αυτό είναι ό, τι ο σχεδιασμός - και σε μικρότερο βαθμό, το στυλ - άξονες είναι για. Είμαι, λοιπόν, σε όλους σας πιέζει, και άλλα TFs πιέζουν εσείς, όχι μόνο για τη σειρά σε πράγματα που είναι σωστές, αλλά γυρίστε στα πράγματα που είναι κωδικοποιημένα καλά. Δεν κάνει περιττές ΓΙΑ βρόχους, Δεν εκ νέου υπολογισμό των μεταβλητών, αν δεν έχετε να. Για παράδειγμα, κοιτάζοντας πίσω στο πρόβλημα που 4, κατά την τοποθέτηση των τούβλων για την οθόνη, κάθε γραμμή - κάθε τούβλο σε ένα δεδομένη σειρά έχει την ίδια y-συντεταγμένη - το ίδιο ύψος συντεταγμένων. Έτσι ώστε y-συντεταγμένη δεν χρειάζεται να υπολογίζεται εντός του εσωτερικού ένθετα ΓΙΑ βρόχο που πιθανόν χρησιμοποιείται να θέσει τα τούβλα στην οθόνη. Χρειάζεται μόνο να υπολογίζονται κάθε φορά που ενεργοποιείται μια γραμμή, ή μετακινείται προς τα κάτω μια γραμμή. Έτσι λένε, αν υπάρχουν 10 τούβλα σε ένα σειρά, κάθε τούβλο μπορεί να έχουν την ίδια y-συντεταγμένη, και ότι η y-συντεταγμένη μπορεί απλά να υπολογιστεί μία φορά για όλα αυτά. Δεν χρειάζεται να υπολογιστεί 10 φορές, ούτε ότι η ανάγκη υπολογισμού να συμβεί στην πραγματική κλήση της συνάρτησης - η νέα gracked κλήση της συνάρτησης. Έτσι, αν αυτό ήταν μια μικρή σύγχυση για σας, πιο γενικά, πράγματα που Δεν χρειάζεται να συμβεί κάθε φορά θα περάσουν από ένα βρόχο ΓΙΑ δεν θα πρέπει να βάλει μέσα στο βρόχο ΓΙΑ, και δεν θα πρέπει να συμβαίνει κάθε φορά που θα πάτε μέσω του βρόχου FOR. Ένα άλλο καλό παράδειγμα σχεδίου που είδαμε στην Εβδομάδα 3 για 15, θα μπορούσατε να κρατήσετε κομμάτι του μηδενός. Έτσι, όταν η προετοιμασία του σκάφους, σας αποθηκεύσετε - σε μια καθολική μεταβλητή, ίσως - το χ και y-συντεταγμένη της μηδενικής. Και στη συνέχεια, κάθε φορά που - σε συνάρτηση με την κίνησή σας, κάθε φορά που κάνετε μια επιτυχημένη κίνηση, μπορείτε να ενημερώσετε το θέση του μηδέν. Αυτό θα σας σώσει από το να έχουν να κάνουν φωλιασμένα for για να κοιτάξετε μέσα από το επιβιβάζονται κάθε φορά σε συνάρτηση με την κίνησή σας και να βρει το μηδέν, ή να βρείτε το πλακάκι, και στη συνέχεια να ελέγξει τι είναι δίπλα του. Αντ 'αυτού, έχετε τη θέση του μηδέν, μπορείτε απλά να δούμε πάνω, κάτω, και προς τα αριστερά και δεξιά του για να βρει το κεραμίδι που ψάχνατε. Έτσι, όσον αφορά τα προγράμματα που είμαστε γραπτώς, ποτέ δεν είσαι αρκετά μεγάλος ότι ορισμένες από αυτές τις αποφάσεις για το σχεδιασμό είναι πραγματικά πρόκειται να παρεμποδίσει σας πρόγραμμα, ή να το κάνετε να τρέχει πιο αργά, ή ίσως ακόμη και να τρέξει έξω από τη μνήμη. Αλλά είμαστε ακόμα πιέζει εσείς να γράψω όπως το κομψό και αποδοτικό κώδικα όσο το δυνατόν. Έτσι, αν το κάνετε καταλήγουν γράφοντας πράγματα που έχουν σημαντικά μεγαλύτερο το πεδίο εφαρμογής, που θα συνταχθεί με καλή σχεδιασμό πέραν του ότι είναι σωστή. Έτσι, ένας αριθμός που έχετε έφερε ότι έξω. Αυτό είναι κάτι που ψάχνουμε - κάτι που θα πάμε να συνεχίσουμε να πιέζετε τα παιδιά του. Αν έχετε ποτέ οποιεσδήποτε ερωτήσεις σχετικά με το σχεδιασμό του προγράμματός σας, μη διστάσετε να φτάσει σε μένα, και είμαι στην ευχάριστη θέση να με τα πόδια μέσα από το πρόγραμμά σας με σας, και να επισημάνω μερικά από το σχεδιασμό αποφάσεις σας και να σας δώσει μερικές προτάσεις για το πώς να κάνουν ακόμη καλύτερες αποφάσεις σχεδιασμού. Έτσι θα πάμε για να προχωρήσουμε να μιλάμε για Quiz 0. Πριν το κάνουμε αυτό, κάνει κανείς απορίες σχετικά με το τι Έχω καλύπτονται μέχρι τώρα; [Θρόισμα NOISE] JASON Hirschhorn: Επτά δευτερόλεπτα. OK. Ας μιλήσουμε για Quiz 0 για λίγο. Οι περισσότεροι από εσάς έχετε Quiz σας πίσω του 0. Αν δεν το κάνετε, ελπίζω μπορείτε να θυμηθείτε λίγο. Αλλά αν έχετε πάρει Quiz 0, τότε έχουν επίσης πρόσβαση στο PDF online σε οι λύσεις του δείγματος. Μήπως κάποιος έχει οποιεσδήποτε ερωτήσεις πρίν πηδάμε στο υλικό της εβδομάδας για ένα ιδιαίτερο πρόβλημα για Quiz 0 - γιατί η απάντηση είναι αυτό που είναι; Είναι κανείς σύγχυση για κάτι; Ακόμα κι αν έχεις το δικαίωμα πρόβλημα, αλλά Απλά θα ήθελα να σου το εξηγήσω λίγο Επιπλέον, είμαι στην ευχάριστη θέση να το πράξουν τώρα. Έτσι, ζήτησα από τα παιδιά σας να να έρθει προετοιμασμένος με κάποια σκέψεις για Quiz 0. Έτσι, ο οποίος θα ήθελε να μας πάρει ξεκίνησε με μια ερώτηση ή σχόλιο σχετικά με Quiz 0; [PAPER θρόισμα] JASON Hirschhorn: Δεν είναι όλοι έκανε τέλεια. Έτσι ξέρω [γέλια] πρέπει να υπάρχουν κάποια ερωτήματα Quiz για 0. OK. Ναι. Ompica. OMPICA: Αριθμός 10. JASON Hirschhorn: Αριθμός 10. Ποιο από τα δύο ήταν το νούμερο 10; OMPICA: Η - JASON Hirschhorn: I haven't - OMPICA: Η περιλαμβάνουν - JASON Hirschhorn: Number 10 ήταν οκτώ για i - γραφή οκτώ έως i; OMPICA: Ναι. JASON Hirschhorn: OK. Έτσι, μια άλλη ερώτηση που θα μπορούσε να έχει ρώτησε ήταν είμαι προφητικό; Η απάντηση είναι ναι. Στο τμήμα πριν από το κουίζ, ρώτησα εσείς να κωδικοποιήσει τόσο Sterling και οκτώ έως i. Και οι δύο από αυτούς έτυχε να εμφανίζονται στο κουίζ. Έτσι, ελπίζουμε, θα καταβληθεί προσοχή σε αυτό. Και αν είχε, τότε θα πρέπει ίσως κάνει καλά σε αυτά τα δύο. Αλλά οκτώ έως i, δεν είχαμε πραγματικά κώδικα αυτό στην τάξη, αλλά ήταν, και πάλι, Έγινε στις εξετάσεις. Έτσι, ένα ζευγάρι από τα πράγματα να λάβουν σημειωθεί κατά την κωδικοποίηση οκτώ έως i. Το πρώτο πράγμα που, σύμφωνα με την ερώτηση, ήταν ότι θα έπρεπε να ελέγξετε αν το string ήταν ίση με null. Ένα ζευγάρι άνθρωποι προσπάθησαν να το ελέγξετε αργότερα για στο πρόγραμμα, αν s βραχίονα ήμουν - έτσι ώστε ένα συγκεκριμένο χαρακτήρα, καθόσον εγχόρδων - ήταν ίση με null. Αλλά να θυμάστε, ότι είναι ουσιαστικά μηδενική - είναι καλό να σκεφτούμε null ως μηδενικός δείκτης - ένας δείκτης στο μηδέν - κάπου στη μνήμη όπου δεν μπορείτε ποτέ να έχετε πρόσβαση. Έτσι, αν κάτι είναι ίση με null, μπορείτε ξέρετε ότι δεν έχει προετοιμαστεί, ή δεν υπάρχει τίποτα εκεί. Έτσι, s είναι ένα αστέρι char, s βραχίονα i είναι μια χαρα. Έτσι, είναι λογικό να συγκρίνουμε την τιμή null, αλλά δεν s βραχίονα i σε null. Αλλά και πάλι - έτσι ώστε να ήταν το πρώτο πράγμα που ότι θα έπρεπε να κάνει - ελέγξτε για να βεβαιωθείτε ότι έχετε πραγματικά πήρε μια πραγματική σειρά. Στη συνέχεια, θα ήθελε να πάει μέσα κάθε χαρακτήρα της συμβολοσειράς. Και έτσι αυτό θα ήταν σαν ένα στήριγμα s i, για παράδειγμα, αν θ είναι iterator σας. Και να λάβει το χαρακτήρα, και να πάρει την πραγματική του αξία. Έχετε αυτό αποθηκεύεται ως char, αλλά η τιμή ASCII για το μηδέν - μηδέν ως χαρακτήρας - δεν είναι στην πραγματικότητα ο ακέραιος αριθμός μηδέν. Είναι κάποιος άλλος αριθμός που μπορείτε να κοιτάζω προς τα πάνω στον πίνακα ASCII. Έτσι, ένας τρόπος για να διορθωθεί αυτό - ίσως ο καλύτερος τρόπος για τη διόρθωση ότι - έχει αφαιρεθεί κάτι από αυτό η τιμή του χαρακτήρα - μηδέν ως χαρακτήρας. Έτσι, μείον μόνη προσφορά, μηδέν, άλλο μόνη προσφορά. Αυτό θα πάρει ό, τι αριθμό που έχετε ως char, και να το πάρετε ίσο με ο αριθμός ως πραγματική ακέραιο. Και αυτό είναι πολύ παρόμοια με την προσέγγιση πολλοί άνθρωποι πήραν στο πρόβλημα που 2, με Καίσαρα και Viginere - αυτές αλγόριθμους κρυπτογράφησης, όταν είχαν τους εκ περιτροπής. Έτσι, μετά το έχετε ως ένα αριθμό από μηδέν έως εννέα, τότε - ανάλογα με την όπου πηγαίνει στον τελικό αριθμό - θα πρέπει να το πολλαπλασιάσετε από μια δύναμη του 10. Μερικοί άνθρωποι μετακινούνται από το πίσω μέρος στο μπροστά, και πολλαπλασιάζεται το άτομο αριθμό από μια δύναμη του 10. Μερικοί άνθρωποι μετακινούνται από το εμπρός προς τα πίσω - και έτσι πήρε την υψηλότερη αύξοντες αριθμούς πρώτο - και θα σώσει εκείνους σε μια παγκόσμια μεταβλητή μετρητή. Και στη συνέχεια, κάθε φορά μέσω του FOR βρόχο, πολλαπλασιάστε το γιγαντιαίο παγκόσμιο αντιμετώπιση μεταβλητή από 10, για να κάνει χώρο για το επόμενο χαρακτήρα. Έτσι, αυτό ήταν μια μικρή σύγχυση, χωρίς με το γράψιμο στον πίνακα. Αλλά το διάλυμα του δείγματος είναι στη διάθεσή σας. Αλλά αυτά ήταν τα μεγάλα πράγματα ψάχναμε. Επίσης, ο έλεγχος για να βεβαιωθείτε ότι κάθε ατομικό χαρακτήρα ήταν πράγματι μια χαρακτήρα μεταξύ μηδέν και εννέα, και όχι κάποιο άλλο χαρακτήρα, όπως ένα Α, για παράδειγμα. Αυτά ήταν τα πράγματα ψάχναμε στο εν λόγω ερώτημα. Μήπως αυτό απαντήσω στην ερώτησή σας; OMPICA: Ναι. JASON Hirschhorn: OK. Υπάρχουν άλλα ζητήματα υπάρχει Κουίζ για 0; Τι γίνεται με τη σύνταξη; Όλοι κατάρτιση σωστά; Όχι. Υπήρχαν - [Γελάει] Οποιεσδήποτε ερωτήσεις σχετικά με την διαδικασία κατάρτισης; Wow. [PAPER θρόισμα] JASON Hirschhorn: Ναι. Michael. ΜΙΧΑΗΛ: Υπάρχει αριθμός 7 - τυχαίο; JASON Hirschhorn: Αριθμός 7. Ο αριθμός 7 ήταν να πάρει έναν τυχαίο ακέραιο. Εξαιρετικό. Έτσι, σας δίνεται ένα ακέραιο a και ακέραιος b, και θέλετε ένα τυχαίο ακέραιος αριθμός μεταξύ a και b. Μπορούμε να γράφουν πραγματικά αυτό το ένα για το διοικητικό συμβούλιο, διότι αυτό Ήταν μία γραμμή κώδικα - ένας τρόπος για να το κάνει. Έτσι μας δίνεται drand ως λειτουργία που θα μπορούσε να χρησιμοποιήσει. Και τι drand - αν υποτεθεί ότι είναι ήδη σπαρθεί - τι drand επιστρέψει; ΜΙΧΑΗΛ: Ο πλωτήρας μεταξύ 0,0 και 1,0. JASON Hirschhorn: Ένας αριθμός - ναι. Ένας αριθμός μεταξύ 0 και 1. Και έτσι έχουμε β και. Και τότε έχουμε τυχαίων αριθμών μεταξύ 0 και 1 που μας δόθηκε από drand. Μερικοί άνθρωποι προσπάθησαν να θέσει b, ή β μείον α, ή κάτι μέσα εκείνα παρενθέσεις. Αυτό θα σήμαινε ότι είναι επιχειρήματα για αυτή τη λειτουργία. drand δεν λαμβάνει κανένα επιχείρημα - όπως κάνει GetString δεν λαμβάνουν κανένα επιχείρημα. Έτσι είναι απλά ανοίξτε paren, κοντά Paren - και ότι, από μόνη της, είναι η κλήση της συνάρτησης. Και αυτό σας δίνει έναν αριθμό μεταξύ 0 και 1. Φυσικά, έχουμε μια ολόκληρη σειρά ότι οι αριθμοί μπορεί να είναι μέσα Δηλαδή, αν b είναι 10 και είναι 5, που πραγματικά θέλουν έναν αριθμό με μια σειρά από 5. Έτσι, το επόμενο πράγμα που πρέπει να κάνουμε είναι πολλαπλασιάσουμε με το εύρος b μείον ένα. Έτσι, αν υποτεθεί ότι είναι πολλαπλασιάζεται. Και αυτό θα μας δώσει μια σειρά μέσα σε ένα δεδομένο εύρος. Και ότι η συγκεκριμένη περιοχή είναι η διαφορά μεταξύ β μείον ένα. Και, τέλος, ότι θα δώσει μόνο από - λένε ότι η περιοχή μεταξύ β μείον ένα είναι 5, που θα μας δώσει μια αριθμός από 0 έως 5. Αλλά αν μια είναι στην πραγματικότητα 5, πρέπει να ενισχύσει αυτή η σειρά μέχρι εκεί που είναι στην πραγματικότητα υποτίθεται ότι είναι, με την προσθήκη ενός. Έτσι ώστε να παίρνει τη λογική δικαιώματος. Και τότε, θα έχετε άλλη ερώτηση; ΜΙΧΑΗΛ: Όχι. Νιώθω πραγματικά ηλίθιος τώρα. [Γελάει] JASON Hirschhorn: Όχι. Μην αισθάνεστε πραγματικά ηλίθιος. Ένας αριθμός των ατόμων που αγωνίστηκαν με αυτήν την ερώτηση. Και τότε, το άλλο ερώτημα είναι, drand, είπατε, σας δίνει μια float - επιστρέφει ένα πλωτήρα. Αλλά αυτή η λειτουργία στην πραγματικότητα ζήτησε ένας ακέραιος για να επιστραφούν. Δεν χρειάζεται να ρίξει αυτό ρητά σε ένα ακέραιο, επειδή αυτά εργασίες θα το αντιμετωπίσουμε όπως όλα ένα float - ως αριθμό κινητής υποδιαστολής. Όπως αυτό θα - ακόμη και αν αυτό είναι ένας ακέραιος, αυτό θα πολλαπλασιάζονται σωστά. Όλα ο πολλαπλασιασμός θα λειτουργήσει. Δεν χρειάζεται να το ρίχνει εδώ. Στην πραγματικότητα, δεν πρέπει να το ρίξει. Αυτό θα ήταν - αν θα ρίξει μια σειρά που είναι μεταξύ 0 και 1 - έναν τυχαίο αριθμό, ένα πλωτό σημείο - τότε είτε θα είναι μόνο 0 ή 1, έτσι θα χάσετε όλα αυτά ακρίβειας. Αλλά στο τέλος, όταν θα επιστρέψετε, παίρνει αυτόματα έστειλε πίσω ως ακέραιος. Έτσι, δεν χρειάζεται να κάνετε ότι casting τον εαυτό σας. Έτσι, αυτό ήταν η απάντηση το ζήτημα αυτό, ο αριθμός 7. Οποιεσδήποτε άλλες ερωτήσεις σχετικά με Quiz 0; Ναι, Annie. ANNIE: Όταν χρησιμοποιούμε αναδρομικές - όταν χρησιμοποιούμε επαναληπτική βρόχους; JASON Hirschhorn: Όταν δεν χρησιμοποιείτε recursive - τόσο γενικότερα, η πλεονεκτήματα και τα μειονεκτήματα της αναδρομής σε σχέση με μια επαναληπτική προσέγγιση. Μπορεί κανείς να προσφέρει μια pro ή con; Παρακαλούμε; Δεν μπορεί κανείς. Ποιος μπορεί να προσφέρει μια pro ή con; [PAPER θρόισμα] ΦΟΙΤΗΤΗΣ 1: Αναδρομική είναι λιγότερο κωδικοποίηση - λιγότερη πληκτρολόγηση; JASON Hirschhorn: Έτσι, γενικά, αναδρομή, ιδίως, μια λειτουργία - ή έναν αλγόριθμο, όπως συγχώνευση είδος - το οποίο προσφέρεται σε μια αναδρομική προσέγγιση - θα μπορούσε να είναι πιο απλή να κωδικοποιήσει αναδρομικά. Και απλά να έχει περισσότερο νόημα να το κάνουν αναδρομικά. Έτσι, αυτό θα είναι ένα pro σε αναδρομή. Άλλοι; Ναι; ΦΟΙΤΗΤΗΣ 2: Con σε αναδρομή - Χρησιμοποιεί περισσότερη μνήμη. JASON Hirschhorn: Έτσι ακριβώς δεξιά. Μια αναδρομική συνάρτηση θα συνεχίσουμε να προσθέτουμε στοίβα πλαισίων στη στοίβα. Έτσι, αν είστε λειτουργίας σε πολλά αριθμούς, και πρέπει να καλέσετε αυτό λειτουργούν πολλά, τότε σίγουρα θα καταλαμβάνουν περισσότερη μνήμη, ενώ μια επαναληπτική προσέγγιση θα βάλει μόνο ένα στοίβα πλαίσιο στη στοίβα, γιατί όλα αυτά συμβαίνουν μέσα σε μία λειτουργία. Οποιαδήποτε άλλα πλεονεκτήματα και τα μειονεκτήματα; Ναι. ΦΟΙΤΗΤΗΣ 3: Πλεονεκτήματα για αναδρομή. Δεν χρειάζεται να εκτιμήσει εκ των προτέρων πόσες φορές η κωδικός έπρεπε να επαναληφθεί. Μπορείτε να έχετε ένα προκαθορισμένο αριθμό φορές που θα πρέπει να επαναλάβει, τότε αναδρομή είναι καλύτερα, γιατί παίρνει αυτό το αποτέλεσμα. JASON Hirschhorn: Νομίζω ότι είναι αλήθεια. Αλλά νομίζω ότι και στις δύο περιπτώσεις θα κάνατε ποτέ - θα πάρετε πιθανώς μερικά είσοδο από το χρήστη. Ή αυτή η λειτουργία θα έχουμε κάποια στοιχεία που θα καθορίσει πόσες φορές πρέπει να τρέξει. Έτσι, γενικά, δεν θα σκληρό κώδικα - ακόμη και σε μια επαναληπτική προσέγγιση - πώς πολλές φορές ότι loop θα εκτελείται. Μήπως έχετε ένα άλλο θα ήταν σκεφτόμαστε, Annie; OK. Έτσι, αυτά είναι ίσως τα δύο - το μεγαλύτερο pro και το μεγαλύτερο con σε μια αναδρομική σχέση μια επαναληπτική προσέγγιση. OK. Οτιδήποτε άλλο στο Quiz 0; Ας προχωρήσουμε. File I / O. Υπάρχει μια υπέροχη μικρή αυτή την εβδομάδα σχετικά με το αρχείο I / O που ελπίζουμε έχετε προσέξει πολλαπλές φορές, και θαύμαζε. Μια πολλή δουλειά πήγε σε αυτό, και έχω ακούσει ότι είναι τρομερά χρήσιμο. Θα περιλαμβάνονται επίσης τη σύνδεση σε αυτή τη διαφάνεια, σε περίπτωση που δεν είχαν μια ευκαιρία να το παρακολουθήσουν 10 φορές. Έτσι, θέλουμε να πάμε για λίγο πάνω από το σημαντικά βήματα για το άνοιγμα και την εργασία με τα αρχεία, και στη συνέχεια πρόκειται να βουτήξει σε μια κωδικοποίηση πρόβλημα πριν εξετάζοντας το σύνολο του προβλήματος. Έτσι και πάλι, Πάω να θέσει αυτό επάνω η οθόνη, αλλά Πάω να μιλήσω για μόλις ένα λεπτό για το τι είμαστε κάνουμε εδώ με το αρχείο I/O-- Τι σημαίνει αυτό; Αυτό σημαίνει ότι μπορούμε να δημιουργήσουμε μας προγράμματα, και στη συνέχεια να έχουν τα προγράμματά μας εξόδου, και δεν έχουν κάνει καμία επίπτωση στις ο κόσμος έξω από το πρόγραμμά μας. Αλλά όταν αρχίσουν να εργάζονται με αρχεία - τόσο την ανάγνωση τους και τη δημιουργία τους - μπορούμε να έχουμε κάποια επίδραση στη κόσμο έξω από το πρόγραμμά μας. Ακριβώς όπως και αν το Microsoft Word δεν ήταν σε θέση να προβεί σε έγγραφα του Word, τότε φορά Microsoft Word κλείσει, όλοι σας Οι εργασίες θα πρέπει να φύγει, και θα πραγματικά είναι άχρηστο. Εμείς τελικά δεν θέλουν να είναι σε θέση να γράφουν τα προγράμματα που μπορούν να επηρεάσουν την κόσμο γύρω τους, τόσο με τη λήψη σε πολύπλοκες είσοδοι - από την άποψη των αρχείων και μέσω αρχείων, καθώς επίσης και δημιουργώντας ενδιαφέροντα και αναγκάζοντας εξόδους - σε όρους διαφορετικούς τύπους αρχείων. Έτσι ώστε να είναι ο λόγος που αρχίζουν να μάθετε πώς να εργαστείτε με τα αρχεία. Πιο συγκεκριμένα, τι κάνουμε είναι ως εξής. Είναι πολύ απλό. Υπάρχουν μόνο μερικά βήματα, και αυτά που αναφέρονται εδώ σε αυτόν τον κωδικό. Έτσι θα πάμε για να περάσει αυτή η γραμμή κώδικα από τη γραμμή. Κατ 'αρχάς, μπορείτε να δείτε τόνισε - όταν εργάζεστε με ένα αρχείο, ανεξάρτητα από τον τύπο του αρχείου που είναι, θα πρέπει να το ανοίξετε. Και αυτό είναι με μια κλήση για να fopen - εδώ. Θα περιλαμβάνει το όνομα του αρχείου. Εάν το αρχείο δεν είναι στον κατάλογο σας, ή το φάκελο όπου το πρόγραμμα ζωή, τότε θα πρέπει επίσης να περιλαμβάνει μια διαδρομή όπου το αρχείο είναι. Εμείς πάμε να υποθέσουμε ότι αυτή η αρχείο που ονομάζεται "text.txt" - ένα απλό έγγραφο κειμένου - είναι η ίδιο φάκελο με το πρόγραμμα αυτό είναι. Έτσι, αυτό είναι ένα άλλο πράγμα που πρέπει να νου - ότι αν θέλετε να ανοίξετε ένα αρχείο κάπου αλλού, που πραγματικά χρειάζεστε να συμπεριλάβει τη θέση του. Δεύτερον, μπορείτε να περάσετε ένα επιχείρημα για να fopen, και αυτό είναι που θέλετε να κάνετε με το αρχείο. Υπάρχουν τρία κύρια επιχειρήματα που θα πάμε να περάσει στο fopen. Ποιος μπορεί να μου δώσει αυτά τα τρία; Ποιος μπορεί να μου δώσει ένα από αυτά; Ναι. ΦΟΙΤΗΤΗΣ 4: Το όνομα του αρχείου; JASON Hirschhorn: Συγγνώμη. Τρία βασικά επιχειρήματα μπορείτε να περάσετε ως το δεύτερο επιχείρημα για fopen. Έχεις δίκιο - το όνομα του αρχείου είναι το πρώτο επιχείρημα. Αλλά το δεύτερο επιχείρημα είναι fopen γενικά τρεις χορδές, και - ναι. Aleja. ALEJA: Α για προσάρτησης. JASON Hirschhorn: A, εάν θέλετε να προστεθούν σε ένα αρχείο που υπάρχει ήδη. ΦΟΙΤΗΤΙΚΟ 5: R για ανάγνωση. JASON Hirschhorn: R, αν θέλετε να διαβάσετε από ένα αρχείο. ΦΟΙΤΗΤΙΚΟ 6: W για διαγραφή. JASON Hirschhorn: Και w, αν θέλετε να γράψετε σε ένα αρχείο. Έτσι, σε αυτή την περίπτωση, γράφουμε στο αρχείο, έτσι έχουμε w. Μπορείτε να το ανοίξετε, θα πρέπει επίσης να αποθηκεύσετε το αρχείο κάπου, και αυτό είναι με το κωδικός στην αριστερή πλευρά ο φορέας ανάθεσης - Είμαι δημιουργία ενός δείκτη σε ένα αρχείο ονομάζεται, στην περίπτωση αυτή, το αρχείο. Εμείς δεν πρόκειται να ανησυχείτε τι αυτό όλα τα καπάκια ΑΡΧΕΙΟ πράγμα είναι. Αρκεί να πούμε, είναι μια μακρά ρεύμα μηδενικά και μονάδες. Και αυτό είναι το πώς πρόκειται να λειτουργούν και να κατανοήσει αυτό. Το επόμενο πράγμα που πρέπει να κάνουμε - και αυτό είναι εξαιρετικά σημαντικό - κάθε φορά που ανοίγετε ένα αρχείο - Στην πραγματικότητα, κάθε φορά που θα καλέσετε malloc, για παράδειγμα, και να πάρετε κάποια μνήμης και δοκιμάστε και να το αποθηκεύσετε σε ένα δείκτη, μπορείτε πάντα θέλετε να ελέγξετε για να βεβαιωθείτε ότι συνάρτηση δεν επιστρέφει null. Έτσι, σε αυτή την περίπτωση, έχουμε τον έλεγχο για να σίγουροι ότι μπορούμε πραγματικά να ανοίξει το αρχείο σωστά και δεν υπήρχε κανένα λάθος στο πρόγραμμά μας. Στη συνέχεια, τη στιγμή που έχουμε ελέγχονται για να βεβαιωθείτε ότι έχουμε ένα αρχείο εργασίας, μπορούμε γράψτε, ή να διαβάσει από, ή επισυνάπτει στον φάκελο. Σε αυτή την περίπτωση, είμαι απλά εκτύπωση μια γραμμή σε αυτό το αρχείο. Πώς μπορώ να ξέρω αυτό; Λοιπόν, είμαι με τη χρήση αυτής της λειτουργίας ονομάζεται fprintf. Όλες οι λειτουργίες που θα χρησιμοποιήσετε κατά τη σύνταξη, ή την ανάγνωση από ή χειρισμό αρχείων θα είναι παρόμοιο με λειτουργίες που έχετε δει πριν, αλλά ξεκινούν με το γράμμα F, στέκεται για το αρχείο. Και fprintf, σε αντίθεση με την κανονική μας εκτύπωση app, παίρνει ένα επιπλέον επιχείρημα, και αυτό είναι το αρχείο όπου μπορείτε θέλετε να εκτυπώσετε αυτή τη γραμμή. Δεν έχω τίποτα να το δικαίωμα των Ohai. Δεν έχω την τρίτη επιχείρημα για την printf - ή το δεύτερο επιχείρημα για την printf, η Το τρίτο επιχείρημα για την fprintf, γιατί δεν έχουν καμία κράτησης θέσης εδώ. Δεν είμαι συμπεριλαμβανομένων τυχόν μεταβλητές. Αλλά και πάλι, fprintf και όλα αυτά αρχείου λειτουργίες που λειτουργούν με αρχεία γενικά θα πρέπει το αρχείο κατά την οποία από όπου και αν δραστηριοποιούνται. Τέλος, το τελευταίο σημαντικό πράγμα που πρέπει να κάνετε είναι να κλείσετε το αρχείο, όπως ακριβώς με - κάθε φορά που malloc κάτι, θέλουμε να ελευθερώσουμε κάτι, για να μην έχουμε έχετε μια διαρροή μνήμης - θέλουμε να κλείσει το αρχείο μας. Εάν αυτό το πρόγραμμα τερματίστηκε χωρίς κλείσιμο το αρχείο, οι πιθανότητες είναι τίποτα δεν θα πάει λάθος, ειδικά αν ήταν ένα μικρό αρχείο. Αλλά αυτό είναι σίγουρα καλό στυλ κωδικοποίησης και την πρακτική να κλείσει πάντα το αρχείο σας όταν τελειώσετε τη χρήση του. Έτσι ώστε να είναι τα βασικά στοιχεία του αρχείου I / O. Πιθανόν να έχετε δει ότι πριν, ή παρακολούθησαν το εν λόγω φανταστική μικρή. Μήπως κάποιος έχει οποιεσδήποτε ερωτήσεις, πριν πάμε σε κάποια κωδικοποίηση πρακτική προβλήματα, για το αρχείο I / O ή βήματα Πήγα πάνω; [TYPING SOUNDS] JASON Hirschhorn: Σας Έχω μια ερώτηση, AVI; AVI: Όχι. JASON Hirschhorn: OK. Πάω να περιμένουν άλλο επτά δευτερόλεπτα. [Γελάει] Αυτή είναι μια πολύ καλή συμβουλή. Εσείς απλά δεν μου αρέσει ερωτήσεις. Αυτό είναι μια χαρά. OK. Έτσι, το πρόβλημά μας είναι πρώτη προπόνηση, είμαστε πρόκειται να επαναλάβει τη λειτουργία της ένα εργαλείο γραμμής εντολών που ίσως χρησιμοποιείται πριν - αντίγραφο - το εργαλείο αντιγραφής. Εάν πληκτρολογήσετε cp και στη συνέχεια να περάσει το δύο επιχειρήματα σε τερματικό σας, μπορείτε να αντιγράψετε ένα αρχείο. Και αυτό είναι αυτό που πρόκειται να γράψω τώρα. Έτσι και πάλι, διαβάζοντας μακριά από αυτή τη διαφάνεια, είχα μπορείτε να γράψετε ένα πρόγραμμα που θα λαμβάνει δύο και μόνο δύο γραμμής εντολών επιχειρήματα - ένα αρχείο προέλευσης και ένα αρχείο προορισμού - και αντιγράφει τα περιεχόμενα της πηγής αρχείο στο αρχείο προορισμού ένα byte σε μια στιγμή. Έτσι ώστε να είναι πολλά για να ζητήσει. Και πάλι, μια καλή προσέγγιση σε αυτό είναι να δεν πάει κατ 'ευθείαν στον κώδικα C, αλλά σπάσει σε μερικά βήματα. Κατ 'αρχάς, σκεφτείτε για τη λογική - ακριβώς αυτό σας ζητώ να κάνετε - και να κατανοήσουν όλα τα βήματα σε αυτό το πρόβλημα. Όχι σε C, μόνο σε κάποια ψευδοκώδικα, ή ακόμα και ένα νοητικό μοντέλο της τι συμβαίνει. Στη συνέχεια, αφού έχετε το ψευδοκώδικα τα κάτω, καταλάβω πώς ο ψευδοκώδικας χάρτες σε εργαλεία και πράγματα έχουμε έμαθαν να χρησιμοποιούν σε C. Και τέλος, αφού έχετε όλα μαζί, τότε μπορείτε να προγραμματίσετε το πρόβλημα. Διαρκέσει 5 έως 10 λεπτά για να εργάζονται σε αυτό το πρόβλημα. Θα βάλω τις οδηγίες πίσω επάνω σε ένα δευτερόλεπτο. Και μετά θα πάμε να πάει πέρα ​​από η ψευδοκώδικα, και τον κωδικό να ζήσουν σαν ομάδα. Εάν έχετε οποιεσδήποτε ερωτήσεις, ενώ είστε εργάζονται σε αυτό, μη διστάσετε να αυξήσει το χέρι σας, και θα έρθω γύρω και να τους απαντήσει. ΦΟΙΤΗΤΗΣ 7: Μπορώ να περάστε ένα κομμάτι χαρτί; JASON Hirschhorn: Τι συμβαίνει; [TYPING SOUNDS] JASON Hirschhorn: OK. Ας πάει πάνω από τον ψευδοκώδικα πρώτα, και Στη συνέχεια θα σας δώσω ένα ζευγάρι περισσότερο λεπτά για να τελειώσει κωδικοποίησης. Ποιος θα ήθελε να μου να ξεκινήσω με την πρώτη γραμμή του pseudocode για αυτή τη λειτουργία; ΦΟΙΤΗΤΗΣ 8: Ελέγξτε για να βεβαιωθείτε ότι Σας δόθηκαν δύο αρχεία. JASON Hirschhorn: OK. Και αν δεν είμαστε; ΦΟΙΤΗΤΗΣ 8: Θα ήθελα να επιστρέψω 0. JASON Hirschhorn: Πρέπει να επιστρέψουμε 0; ΦΟΙΤΗΤΗΣ 8: Επιστροφή α - κοπή. Λυπάμαι. JASON Hirschhorn: Ναι. Μάλλον όχι 0. Επειδή το 0 σημαίνει ότι όλα ήταν καλά. OK. Έτσι, αυτή είναι η πρώτη γραμμή του ψευδοκώδικα. Ποιος έχει τη δεύτερη γραμμή ψευδοκώδικα; ΦΟΙΤΗΤΗΣ 9: Ανοικτή τόσο τα αρχεία; JASON Hirschhorn: Ανοίξτε τα δύο αρχεία. Εντάξει; ΦΟΙΤΗΤΗΣ 10: Ελέγξτε για να δείτε αν το αρχείο είναι NULL; JASON Hirschhorn: Ελέγξτε για να βεβαιωθείτε βέβαιος ότι ούτε είναι NULL. Ως μέρος - slash 0 - είναι ότι NULL; ΦΟΙΤΗΤΗΣ 11: Όχι. JASON Hirschhorn: Αυτό δεν είναι NULL. Αυτό ονομάζεται τερματισμού NULL. Είναι πραγματικά γράφεται με ένα μόνο λίτρο. Έτσι, ελέγχοντας κάτι ενάντια σε αυτό - Αυτό είναι στην πραγματικότητα ένας χαρακτήρας - έτσι τον έλεγχο κάτι ενάντια σε αυτό είναι δεν είναι το ίδιο με τον έλεγχο για να δούμε αν ισούται με NULL. Και μερικοί άνθρωποι - για κουίζ τους και το πρόβλημά τους σύνολα - έχουμε το δύο από αυτά συγχέονται. Αλλά τα δύο από αυτά είναι στην πραγματικότητα διαφορετικές. Ένας τελειώνει μια σειρά - το ένα είναι ένας δείκτης για 0. ΦΟΙΤΗΤΗΣ 12: Γιατί δεν θα ελέγξει για βεβαιωθείτε ότι τα αρχεία δεν είναι NULL πριν να τα ανοίξετε; JASON Hirschhorn: Λοιπόν, ανοίξτε το αποθηκεύει κάτι σε αυτό το αρχείο. Και αν πάτε πίσω εδώ - έτσι ώστε αυτή η γραμμή - fopen - θα σας δώσει μια διεύθυνση και να αποθηκεύουν ότι η διεύθυνση στο αρχείο αν αυτό δουλεύει. Αν δεν λειτουργεί, θα αποθηκεύσει NULL - ΦΟΙΤΗΤΗΣ 12: Αχ. OK. Σε έπιασα. JASON Hirschhorn: Στο αρχείο. Έτσι δεν μπορείτε να ελέγξετε για NULL πριν τους έχετε ανοίξει. NULL σημαίνει κάτι που δεν έκανε λειτουργούν σωστά. OK. Έτσι, βεβαιωθείτε ότι δεν είναι; Ή είναι; Τι νομίζετε; Θα πάμε με αυτό. ΦΟΙΤΗΤΗΣ 13: Είναι. JASON Hirschhorn: Είναι; Ούτε είναι; ΦΟΙΤΗΤΗΣ 13: Είναι. JASON Hirschhorn: OK. Εμείς φαίνεται να έχουν κάποια συναίνεση σε αυτό. Ούτε είναι NULL. Εντάξει, την επόμενη γραμμή του ψευδοκώδικα. Ποιος δεν μου έδωσε μια γραμμή ακόμα; Εμείς θα σας περιμένουμε. Ναι. ΦΟΙΤΗΤΗΣ 14: Θα πρέπει να διαβάσετε από το πρώτο αρχείο; JASON Hirschhorn: OK. ΦΟΙΤΗΤΗΣ 14: Ή χρησιμοποιούμε fscanf ή κάτι τέτοιο το πρώτο αρχείο; JASON Hirschhorn: Έτσι θέλουμε να διαβάζεται από το πρώτο αρχείο και - ας βάλουμε αυτό το δικαίωμα εδώ. Διαβάστε από το αρχείο προέλευσης. Και τότε, τι κάνουμε μετά εμείς διαβάζεται από το αρχείο προέλευσης; Κάποιος άλλος; ΦΟΙΤΗΤΗΣ 15: Γράψε στο το αρχείο προορισμού; JASON Hirschhorn: Σας γράφω για να το αρχείο προορισμού, και - OK. Τι άλλο χάνουμε; Κάποιος άλλος που δεν μου έδωσε μια γραμμή κώδικα ακόμα - του ψευδοκώδικα. Ναι. ΦΟΙΤΗΤΗΣ 16: Ίσως μπορείτε να ελέγχετε πάντα αν υπάρχει κάτι για να διαβάσετε για, όπως και η επόμενη γραμμή; Που είναι σαν την επόμενη γραμμή, δείτε εάν υπάρχει. [ΗΛΕΚΤΡΟΝΙΚΗ BEEP] JASON Hirschhorn: Ωχ. Αυτό είναι το λογισμικό journaling μου. Ναι; ΦΟΙΤΗΤΗΣ 16: Ναι. JASON Hirschhorn: Έτσι δώστε σε μένα ακόμα μια φορά. ΦΟΙΤΗΤΗΣ 16: Ελέγξτε αν υπάρχει ακόμα μια επόμενη γραμμή από το αρχείο προέλευσης για να διαβάσετε. JASON Hirschhorn: OK. Γι 'αυτό και δεν διαβάζετε τις γραμμές - διάβαζαν bytes εδώ - αλλά είσαι σωστή. Θέλουμε να διαβάσει και να γράψει μέχρι δεν υπάρχουν περισσότερα byte. OK. Και έτσι αυτά θα πρέπει πραγματικά να είναι σε εσοχή ένα κομμάτι, επειδή είναι εκεί κάτω. Σωστά; Μέχρι είμαστε έξω από bytes, θα πάμε να διαβάζεται από το αρχείο προέλευσης και να γράφουν στο αρχείο προορισμού. Και τότε, τι είναι η τελευταία γραμμή ψευδοκώδικα; Κάποιος που δεν είναι δεδομένη μου κάτι ακόμα. ΦΟΙΤΗΤΗΣ 17: Κλείστε τα αρχεία; JASON Hirschhorn: Ακριβώς. Κλείστε τα αρχεία. Έτσι, υπάρχει ψευδοκώδικα μας. Πάω να θέσει το ψευδοκώδικα σε gedit, και σε λίγα λεπτά θα θα κωδικοποιήσει αυτό μαζί. OK. Ας ξεκινήσουμε ως ομάδα. Nishant, έχω νέο αρχείο μου. Έχω μόλις άνοιξε αυτό επάνω. Untitled document 1. Ποιο είναι το πρώτο πράγμα που πρέπει να κάνω; Nishant: Συμπεριλάβετε βιβλιοθήκες; JASON Hirschhorn: OK. Με ποιες βιβλιοθήκες; Nishant: stdio.h, stdlib.h, πιστεύω; JASON Hirschhorn: OK. Τι είναι stdlib για; Nishant: ξέχασα. JASON Hirschhorn: OK. Έτσι περιλαμβάνουν stdio. Τι πρέπει να κάνω ακόμη και πριν Αρχίζω κωδικοποίηση; Nishant: Γράψτε μια επικεφαλίδα; JASON Hirschhorn: Πώς μπορώ να το χρωματιστό; [Παρεμβάλλοντας VOICES] Nishant: Πώς μπορείτε να πάρετε χρώματος; JASON Hirschhorn: Πώς μπορώ χρώμα κωδικοποίησης; Nishant: Δεν ξέρω. Αχ. Αποθήκευση. JASON Hirschhorn: Save. Ναι. Θα πρέπει να το αποθηκεύσετε ως. Αι. Έτσι το αποθηκεύσετε στην επιφάνεια εργασίας ως cp.c. Sweet. Και αν θέλετε να πάρετε την πλήρη στυλ σημεία, τι πρέπει να κάνω περιλαμβάνουν στην κορυφή; Nishant: Θα μπορούσατε να γράψετε το όνομά σας, το όνομα του προγράμματος, και το σκοπό του προγράμματος, καθώς και? JASON Hirschhorn: Φαίνεται καλό. Εξαιρετικό. Έτσι, μας έχετε ξεκίνησε τέλεια. # Include - επίσης θα γράψει - OK. Έτσι, νομίζω ότι είμαι έτοιμοι να πάτε. Ποιος έχει την πρώτη γραμμή του κώδικα για μένα - ή οι πρώτες γραμμές κώδικα που θα πάρει για να ικανοποιήσει το πρώτο μας σχόλιο σε ψευδοκώδικα; Μπορείτε. ΦΟΙΤΗΤΗΣ 18: Δεν πρέπει να είναι int argc, και στη συνέχεια char * argv; JASON Hirschhorn: Νομίζω ότι έχεις δίκιο. Ας αλλάξουμε να int main, ανοιχτή paren, int argc, κόμμα, char * argv; Όπως αυτό; ΦΟΙΤΗΤΗΣ 18: Βάσεις. JASON Hirschhorn: Στηρίγματα. Άνοιγμα βραχίονα, κλείσιμο παρένθεσης, κοντά γονέα. Τέλεια. Τώρα μπορώ να πάρω τα επιχειρήματα της γραμμής εντολών. OK. Βεβαιωθείτε ότι είμαστε στη διάθεσή τους δύο αρχεία. Μπορείτε να μου δώσετε και αυτό. ΦΟΙΤΗΤΗΣ 18: Αν argc - αυτό δεν είναι ίσο με 3. JASON Hirschhorn: Αν ανοιχτά paren argc δεν ισότιμη 3; ΦΟΙΤΗΤΗΣ 18: Ναι, μπορείτε να επιστρέψετε 1 ή οτιδήποτε. JASON Hirschhorn: Συγγνώμη. ΦΟΙΤΗΤΗΣ 18: Επιστροφή 1 ή οτιδήποτε. JASON Hirschhorn: Επιστροφή 1. Εντάξει; Μεγάλη. Ανοίξτε τα δύο αρχεία. Ποιος μπορεί να με βοηθήσει να ανοίξετε τα δύο αρχεία; Ποιος δεν μου έδωσε τον κωδικό ακόμα; Kurt; KURT: Έτσι, όλα τα καπάκια Ρ-Ι-Ε-Ε πηγή αστέρων. JASON Hirschhorn: Πάω να πάρουν τα φωνήεντα. Αυτοί είναι δροσερά. Είναι σαν Tumblr. ΦΟΙΤΗΤΗΣ 18: Ισούται fopen - JASON Hirschhorn: Ισούται fopen; ΦΟΙΤΗΤΗΣ 18: Open paren, argv, ανοιχτό βραχίονα. JASON Hirschhorn: Περιμένετε. Λυπάμαι. Ανοίξτε paren. OK. ΦΟΙΤΗΤΗΣ 18: Ναι. Argv sub 1. JASON Hirschhorn: Sub 1; ΦΟΙΤΗΤΗΣ 18: Ναι. Argv ανοικτό στήριγμα 1 - Ναι. Και τότε το κόμμα, και στη συνέχεια ανοίξτε το διπλό απόσπασμα, r, διπλά εισαγωγικά, κοντά paren, ερωτηματικό. JASON Hirschhorn: Sweet. Και τι γίνεται με το άλλο; ΦΟΙΤΗΤΗΣ 18: Πολύ παρόμοια, αλλά, αντίθετα, S-R-C, που θα το ονομάσουμε D-S-T. JASON Hirschhorn: Oo! Μου αρέσει αυτό. ΦΟΙΤΗΤΗΣ 18: Just D-S-T. Ναι. Και στη συνέχεια, argv, ανοιχτό βραχίονα, 2. Ναι. Και τότε w αντί του r. Ναι. JASON Hirschhorn: Μεγάλη. Επόμενο ζευγάρι των γραμμών. Επίσης, αν κάποιος έχει τα πράγματα για να προσθέσετε γραμμές που έχουμε κάνει, μη διστάσετε να προσθέστε αυτά επίσης. Ελέγξτε για να βεβαιωθείτε ότι δεν είναι NULL. Ποιος μπορεί να μου δώσει τον κώδικα που πρέπει να ικανοποιήσει αυτή την γραμμή ψευδοκώδικα; Archer. ΤΟΞΟΤΗΣ: Αν src ισούται ισούται NULL ή dst ισούται ισούται NULL, τότε θα επιστρέψει - JASON Hirschhorn: Τι; ΤΟΞΟΤΗΣ: Επιστροφή 2; JASON Hirschhorn: Επιστροφή 2. Έτσι, αν είναι ανοιχτό paren src ισούται ισούται με NULL, ή - ό, τι αυτό thing's - σωλήνα; Pipe; Θα το ονομάσουμε σωλήνα. Σωληνώσεων, σωλήνες, dst ισούται ίσων NULL, επιστρέψτε 2. Εντάξει; Μέχρι είμαστε έξω από bytes - εμείς είδος παραληφθεί πάνω από αυτό το βήμα το τμήμα ψευδοκώδικα να πηγαίνει μέχρι εδώ. Αλλά μέχρι να είμαστε έξω από bytes - τι κάνει αυτό ακούγεται σαν; Τι είδους δομή C - αλλά εγώ δεν χρησιμοποιούν τη δομή των λέξεων, επειδή θα πάμε να αρχίσετε να χρησιμοποιείτε ότι σε άλλες περιπτώσεις - αλλά εργαλείο C ακούγεται αυτό σαν; ΦΟΙΤΗΤΗΣ 19: Ένας βρόχος. JASON Hirschhorn: Ένας βρόχος. Ακούγεται σαν μια θηλιά. Έτσι, ο οποίος μπορεί να μου δώσει την πρώτη γραμμή του κώδικα βρόχου εδώ; Μπορείτε επίσης να επιλέξετε τι είδους βρόχο που θέλετε, αν μου δώσεις αυτή η γραμμή κώδικα. Υπάρχουν τρία είδη. Μπορείτε να επιλέξετε. Θα ήθελα να προτείνω ένα από αυτά. Avi. Ποιο από τα δύο θέλετε; AVI: ΓΙΑ. JASON Hirschhorn: ΓΙΑ. AVI: int i ισούται με μηδέν. JASON Hirschhorn: OK. AVI: Αυτό το μέρος δεν είμαι σίγουρος για το. Αλλά εγώ είναι μικρότερο από το μέγεθος της πηγής αστέρι; Δεν είμαι σίγουρος γι 'αυτό. JASON Hirschhorn: OK. AVI: Επειδή θέλετε το το μέγεθος του αρχείου, έτσι δεν είναι; JASON Hirschhorn: Έτσι, αυτό πιθανότατα δεν θα μας δίνουν το μέγεθος της πραγματικής αρχείο σε bytes. Λοιπόν, τι άλλο θα μπορούσαμε να κάνουμε; Τι είναι ένα άλλο είδος βρόχου; Ή θα πρέπει να κολλήσει με το βρόχο ΓΙΑ; ΦΟΙΤΗΤΗΣ 20: Θα μπορούσατε να κάνετε ένα βρόχο ΕΝΩ; Και τότε, τι θα κάνετε είναι you'd - γιατί έχουμε ένα char * για το αρχείο. Έτσι, αν έχουμε κρατήσει μόνο προσαύξηση ότι μέχρι να βρίσκαμε τον χαρακτήρα NULL σε το τέλος του; Ή όχι, αυτό δεν είναι το πώς λειτουργούν τα αρχεία; JASON Hirschhorn: Έτσι μπορούμε να κρατήσουμε την αύξηση του char * μέχρι να βρούμε το NULL - ΦΟΙΤΗΤΗΣ 20: Ουσιαστικά συνεχίζω ανά χαρακτήρα μέχρι να χτυπήσει το τέλος του αρχείου. JASON Hirschhorn: Ναι. Έτσι, αυτό είναι που θέλουμε να κάνουμε. Θέλουμε να κρατήσει ανάγνωση, χαρακτήρα με χαρακτήρα, μέχρι να φτάσουμε στο το τέλος του αρχείου. ΦΟΙΤΗΤΗΣ 20: Ναι. Αναζήτηση - ποιο είναι το τέλος ή σήμα στοπ στο τέλος του ένα αρχείο κειμένου. JASON Hirschhorn: OK. Έτσι, όταν φτάσουμε στο τέλος του αρχείου - πώς ξέρουμε ότι έχουμε φτάσει το τέλος ενός αρχείου; Αν είμαι καλώντας - οπότε ας κάνουν ένα βήμα πίσω. Τι είναι συνάρτηση; Ας πάμε σε αυτή τη γραμμή εδώ. Διαβάστε από το αρχείο προέλευσης. Ποιος μπορεί να μου δώσει αυτή τη γραμμή του κώδικα; ΦΟΙΤΗΤΗΣ 21: fscanf; JASON Hirschhorn: fscanf. OK. Τι γίνεται αν θέλω να διαβάσω, πολύ Συγκεκριμένα, ένα byte; ΦΟΙΤΗΤΗΣ 21: Δεν ξέρω. JASON Hirschhorn: OK. Ακόμα πιο απλό από fscanf - τι είναι ένα - Θέλω να διαβαστεί από ένα αρχείο προέλευσης; Διαβάστε από ένα αρχείο προέλευσης. Τι είναι μια λειτουργία - ναι. ΦΟΙΤΗΤΗΣ 22: Είναι fread; JASON Hirschhorn: Fread. Νομίζω ας κολλήσει με η μία για τώρα. Τι είδους επιχειρήματα δεν fread πάρει; ΦΟΙΤΗΤΗΣ 22: Μάλλον ο τύπος αρχείου, και στη συνέχεια θέση στο αρχείο; JASON Hirschhorn: Τι μπορώ να πληκτρολογήσετε εδώ να καταλάβω τι είδους επιχειρήματα fread παίρνει; ΠΟΛΛΑΠΛΕΣ ΦΟΙΤΗΤΕΣ: Man fread. JASON Hirschhorn: Man fread και fwrite. Μοιάζει κρεμούν έξω μαζί. Έτσι fread παίρνει πόσα επιχειρήματα; ΦΟΙΤΗΤΗΣ 23: Τέσσερα. JASON Hirschhorn: Παίρνει τέσσερα επιχειρήματα. Παίρνει ένα δείκτη, το μέγεθος, και ότι πράγμα, το οποίο είναι περίεργο, και κάποιο αρχείο. Εντάξει; Ας διαβάσουμε γι 'αυτό εδώ. «Η fread λειτουργία διαβάζει n memb τα στοιχεία των δεδομένων, κάθε μέγεθος bytes καιρό, από το ρεύμα που υποδεικνύεται από ρεύμα, την αποθήκευση τους στη θέση δίνεται από το δείκτη. " Έτσι, τέσσερα επιχειρήματα. Γιατί δεν μπορώ να αντιγράψω μόνο αυτό, και να το επικολλήσετε εδώ. OK. Έτσι, ο οποίος μπορεί να ξεκινήσει τη συμπλήρωση τα επιχειρήματα αυτά για μένα; Avi. AVI: Βγάλτε το κενό. Βάλτε απλά src. Βγάλτε το δείκτη και το αστέρι. Βάλτε src. Στη συνέχεια - JASON Hirschhorn: Έτσι, Πάω να σταματήσει εκεί, γιατί αυτό είναι λάθος. Έχεις δίκιο με src, αλλά όπου θα πρέπει src πάτε; [Παρεμβάλλοντας VOICES] JASON Hirschhorn: Θα πρέπει πηγαίνετε εδώ. Αυτή είναι η src - src μας είναι ένας τύπος. Ας ρίξουμε μια ματιά εδώ. Αυτό ζητά τύπου FILE *, εμείς πραγματικά να δείτε τους συνήθως έτσι. Έτσι, αυτό που ζητά ένα επιχείρημα του πληκτρολογήστε FILE * ονομάζεται ρεύμα που είναι src. Εντάξει; Τι μέγεθος των πραγμάτων κάνουν θέλουμε να διαβάσουμε; Σας έδωσα αυτό το περιγραφή του προβλήματος. ΦΟΙΤΗΤΗΣ 24: Ένα byte σε μια στιγμή. JASON Hirschhorn: Ένα byte. Πόσο μεγάλο είναι ένα byte; Το μέγεθός του είναι σε bytes, οπότε τι μπορώ να βάλω εκεί; ΦΟΙΤΗΤΗΣ 25: One. JASON Hirschhorn: One. Δεξιά. Το μέγεθός του είναι μονάδα byte, έτσι 1 είναι 1 byte. Πόσα μπορώ να θέλουν να διαβάσουν σε μια στιγμή. ΦΟΙΤΗΤΗΣ 26: One; JASON Hirschhorn: Ένα πράγμα. Θέλω να διαβάσω ένα πράγμα του μεγέθους 1, ένα δάγκωμα σε μια στιγμή. Και πού μπορώ να το πω, αφού το διάβασα; ΦΟΙΤΗΤΗΣ 27: Προορισμός; JASON Hirschhorn: Γι 'αυτό δεν μπορούμε να βάζουμε κατ 'ευθείαν στο σημείο προορισμού. ΦΟΙΤΗΤΗΣ 28: Εσύ θα θέσει το σε ένα τρίτο δείκτη; ΦΟΙΤΗΤΗΣ 27: Για τον προορισμό. JASON Hirschhorn: OK. Ναι. ΦΟΙΤΗΤΗΣ 29: Μπορείτε να δηλώσετε κάτι για να ενεργεί ως προσωρινή αποθήκευση νωρίτερα. JASON Hirschhorn: OK. Δώσε μου αυτό. ΦΟΙΤΗΤΗΣ 29: Ένα άλλο αρχείο δείκτη, ίσως; JASON Hirschhorn: OK. Έτσι, αυτό είναι άκυρο αστέρι - είναι ένα είδος κενού αστέρι, γι 'αυτό δεν πρέπει να είναι ένας δείκτης του αρχείου. Και αν είμαι ανάγνωση ενός byte, όπου θα ήταν ένα καλό μέρος για να αποθηκεύσετε ένα byte; ΦΟΙΤΗΤΗΣ 29: Μια σειρά; JASON Hirschhorn: Μια σειρά. OK. Και τι άλλο είναι κάτι που είναι ακριβώς το μέγεθος ενός byte; ΦΟΙΤΗΤΗΣ 30: char *; ΦΟΙΤΗΤΗΣ 29: Ναι. JASON Hirschhorn: A char * δεν είναι ένα byte. ΦΟΙΤΗΤΗΣ 29: Μια χαρα. JASON Hirschhorn: Μια χαρα είναι ένα byte. Σωστά; Έτσι, ας την ονομάσουμε αυτό το ρυθμιστικό είναι ένα γενικό το όνομα που χρησιμοποιείται για αυτά τα πράγματα για να αποθηκεύσετε κάτι προσωρινά. Έτσι, μπορώ να δημιουργήσω ένα buffer. Σωστά; Αλλά δεν λαμβάνει ένα κενό *. Έτσι ίσως έχετε δίκιο, ότι θα πρέπει να είναι ένα ρυθμιστικό του μεγέθους 0. Γι 'αυτό αποθηκεύει ένα - σωστά. Επειδή αυτό το δικαίωμα εδώ - char buffer είναι ένας χαρακτήρας, αλλά αυτό παίρνει ένα κενό * - ένας δείκτης. Έτσι θα μπορούσα να κάνω αυτό και τώρα ρυθμιστικό είναι ένας δείκτης. Τι άλλο θα μπορούσα να κάνω; ΦΟΙΤΗΤΗΣ 31: Βάλτε ένα αστέρι δίπλα σε char. JASON Hirschhorn: Θα μπορούσα έχουν δημιουργήσει το char *. OK. Τι είναι ένα άλλο πράγμα που θα μπορούσα να κάνω; Ή ας πάει με αυτό. Char * buffer, ώστε ό, τι μπορώ να τοποθετήσω εδώ; ΦΟΙΤΗΤΗΣ 31: Buffer. JASON Hirschhorn: Buffer. Ρυθμιστικό είναι ένας δείκτης σε μια χαρα. Και σε αυτή τη θέση, είναι σαν να βάζουμε ένα byte κάτι που έχουμε διαβάσει. Ναι. Avi. AVI: Απλά μια γρήγορη ερώτηση. Θέλετε να malloc buffer; JASON Hirschhorn: Ποιος μπορεί να απάντηση στο ερώτημα αυτό; ΦΟΙΤΗΤΗΣ 32: Καλά, δεν πραγματικά σημείο σε τίποτα αυτή τη στιγμή, έτσι - JASON Hirschhorn: Αλλά κάνουμε θέλουμε να το malloc; ΦΟΙΤΗΤΗΣ 32: Αν ήταν να το κάνει αυτό Έτσι, υποθέτω, ναι, γιατί θα πρέπει να κάποια θέση για να επισημάνω. JASON Hirschhorn: Έχουμε πρέπει να το malloc; ΦΟΙΤΗΤΗΣ 33: Εάν πρόκειται να χρησιμοποιήσετε έξω από το βρόχο. JASON Hirschhorn: Πρόκειται να χρησιμοποιήσετε έξω από το βρόχο; ΦΟΙΤΗΤΗΣ 34: Ναι. ΦΟΙΤΗΤΗΣ 35: Περιμένετε. Θέλουμε να το δηλώσουν στο βρόχο σε πέραν; JASON Hirschhorn: Έτσι υποθέτω ότι έχουμε κάποια ψευδο ΕΝΩ βρόχο εδώ ότι είμαστε προσπαθώ να καταλάβω, ότι δεν έχουμε πάρει ακόμα. Δεν χρειάζεται να το malloc. Είμαστε δραστηριοποιούνται σε κύριο, είναι μόνο πρόκειται για να χρησιμοποιηθεί μέσα σε αυτό το βρόχο. Δεν πρέπει να υπάρχουν έξω από αυτό. Έτσι μπορεί να είναι μια τοπική μεταβλητή. Έχετε ένα δείκτη για μια τοπική μεταβλητή. ΦΟΙΤΗΤΗΣ 36: Αλλά δεν είναι επισημαίνοντας τίποτα. JASON Hirschhorn: Όχι, δεν είναι αρχικοποιείται σε τίποτα. Αλλά εμείς δεν πρόκειται να το χρησιμοποιήσετε επίσης. Εμείς πάμε για να βάλει κάτι στην είναι η πρώτη φορά που το χρησιμοποιείτε. Έτσι ώστε να φαίνεται εντάξει. Γι 'αυτό και δεν χρειάζεται malloc εδώ. Και νομίζω ότι είναι εντάξει όπως είναι. OK. Έχουμε την fread γραμμή. Ας κάνουμε την επόμενη γραμμή. Αν θέλουμε να γράψουμε σε ένα αρχείο, τι είναι μια καλή λειτουργία για να χρησιμοποιήσετε για να το κάνουμε αυτό; ΦΟΙΤΗΤΗΣ 37: fwrite; ΦΟΙΤΗΤΗΣ 38: fprintf; JASON Hirschhorn: fprintf είναι ένα. Τι είναι ένα άλλο; ΦΟΙΤΗΤΗΣ 39: fwrite. JASON Hirschhorn: fwrite. Και για τους σκοπούς μας, fwrite, το οποίο είδαμε εδώ, είναι ίσως η καλύτερη επιλογή. Παίρνει τέσσερα επιχειρήματα, καθώς και. Nishant, μπορεί να σας δώσει με τα επιχειρήματα; Nishant: εξέλιξη του πρώτου ατόμου να είναι ακριβώς buffer. JASON Hirschhorn: OK. Nishant: Το δεύτερο είναι ακριβώς πρόκειται να είναι 1. Η Τρίτη θα είναι 1. Και η τέταρτη θα είναι dst. JASON Hirschhorn: Μήπως κάποιος έχει οποιεσδήποτε ερωτήσεις σχετικά με αυτή τη γραμμή; Αυτό φαίνεται καλό. OK. Έτσι, τώρα μοιάζει με το ένα πράγμα είμαστε λείπει - στην πραγματικότητα, ας γράψουμε αυτή η τελευταία γραμμή. Κλείστε τα αρχεία. Ποιος μπορεί να μας τελειώσει το γράψιμο αυτές οι δύο τελευταίες γραμμές; Ναι. Συγγνώμη, αυτό είναι το όνομά σου; LUCY: Lucy. JASON Hirschhorn: Lucy. LUCY: Αδυναμία εγγραφής αρχείου src και, στη συνέχεια, Αδυναμία εγγραφής αρχείου προορισμού. JASON Hirschhorn: Αδυναμία εγγραφής αρχείου, ανοικτή paren, src, κοντά paren, ερωτηματικό. Και fclose - ναι; LUCY: Ανοικτή παρενθέσεις, dst και στη συνέχεια ερωτηματικό. JASON Hirschhorn: Μεγάλη. Και τι πρέπει να περιλαμβάνουν στο τέλος; LUCY: Επιστροφή 0. JASON Hirschhorn: Επιστροφή 0. Πρέπει να κάνω; Απλά μια ερώτηση. Μήπως πρέπει να περιλαμβάνει την επιστροφή 0? ΠΟΛΛΑΠΛΕΣ ΦΟΙΤΗΤΕΣ: Όχι. JASON Hirschhorn: Όχι. Κύρια κάνει αυτόματα αν μπορείτε να φτάσετε στο τέλος. Αλλά νομίζω ότι είναι ωραίο να περιλαμβάνει ρητό. Ειδικά όταν γυρίζουμε άλλες τα πράγματα σε όλο το πρόγραμμα. OK. Αυτό είναι ό, τι μας λείπει - ΕΝΩ τι; Ποιος μπορεί να σκεφτεί κάποια - έχει κάποια αίσθηση του τι πράγματα θα μπορούσε να πάει εκεί; Ακόμα κι αν είναι μόνο σε κάποια pseudocode όπως η γλώσσα; Τι είμαστε πραγματικά - τι θέλουμε να πάει μέχρι; Ναι, Lucy. LUCY: Το τέλος του αρχείου. JASON Hirschhorn: Το τέλος του αρχείου. Λοιπόν, τι εννοείτε με το τέλος του αρχείου; LUCY: Μόλις φτάσετε το τέλος του αρχείου, να σταματήσει. JASON Hirschhorn: OK. Έτσι, τη στιγμή που θα φτάσει στο τέλος του αρχείου. Πώς ξέρουμε ότι όταν έχουμε φτάσει το τέλος του αρχείου; ΦΟΙΤΗΤΗΣ 40: Νομίζω ρυθμιστικό θα οριστεί στην τιμή NULL. ΦΟΙΤΗΤΗΣ 41: Ρυθμιστικό δηλώνεται μέσα στο βρόχο. JASON Hirschhorn: Έτσι νομίζετε ότι ρυθμιστικό θα πρέπει να οριστεί στην τιμή NULL. Γιατί θα buffer να οριστεί στην τιμή NULL; ΦΟΙΤΗΤΗΣ 40: Διότι όταν fread, προσπαθείτε να βάλετε τίποτα σε ρυθμιστικό. JASON Hirschhorn: OK. Έτσι σκέφτεστε fread - όταν έχουμε φτάσει στο τέλος της αρχείο, τι fread πρόκειται να κάνει; Νομίζω ότι αυτό είναι το ερώτημα πρέπει να καταλάβουμε. Τι σημαίνει fread κάνουμε; Μήπως βάζετε μηδενική σε ρυθμιστικό, ή μήπως συμβαίνει κάτι άλλο; Πώς μπορούμε να καταλάβουμε τι κάνει; ΦΟΙΤΗΤΗΣ 42: Man. JASON Hirschhorn: Man. Έτσι, ας ρίξουμε μια ματιά εδώ. Επιστροφή αξία. Την επιτυχία, fread και fwrite επιστρέψει το αριθμό των ειδών που διαβάζεται ή γράφεται. Αυτός ο αριθμός ισούται με τον αριθμό των bytes μεταφερθούν μόνο όταν το μέγεθος είναι 1. Εάν παρουσιαστεί κάποιο σφάλμα, ή το τέλος της επιτευχθεί το αρχείο, η τιμή που επιστρέφεται είναι ένα σύντομη καταμέτρηση στοιχείο ή 0. Έτσι, για τους σκοπούς μας, αν fread φτάνει το τέλος του αρχείου, και διαβάζει από το το τέλος του αρχείου, δεν υπάρχει τίποτα που αφήνεται να διαβάσετε, τι πρόκειται να επιστρέψει; ΦΟΙΤΗΤΗΣ 43: Zero; JASON Hirschhorn: Τι; ΦΟΙΤΗΤΗΣ 43: Zero; JASON Hirschhorn: Μηδέν. Είναι πρόκειται να επιστρέψει στο μηδέν. Έτσι, γνωρίζουμε ότι fread, όταν έχουμε φτάσει στο τέλος του αρχείου, πρόκειται να επιστρέψει το μηδέν. Πώς μπορούμε να χρησιμοποιήσουμε προς όφελός μας; AVI: Μπορείτε να δηλώσετε μια μεταβλητή έξω του βρόγχου που ονομάζεται επιταγή. Εάν η επιταγή είναι ίσο με - για τώρα - ένα. JASON Hirschhorn: OK. AVI: Και τότε μπορείτε να βάλετε ένα IF δήλωση αμέσως μετά fread λέγοντας ότι αν fread ισούται με το μηδέν - ηο. JASON Hirschhorn: Ποιος μπορεί να βοηθήσει Avi έξω; AVI: Ποια είναι η αξία επιστρέφονται από fread; JASON Hirschhorn: Εμείς απλά πήγε πάνω από αυτό. AVI: Πώς θα την εκπροσωπήσει; JASON Hirschhorn: Έτσι επιστρέφει - ας κοιτάξτε εδώ - επιστρέφει ένα size_t, το οποίο είναι κατ 'ουσίαν ένας ακέραιος. Έτσι επιστρέφει έναν ακέραιο. Και στην περίπτωσή μας, θα επιστρέφει 1 ή 0 - 1 αν το διαβάσετε ένα πράγμα - ένα byte, και 0 αν έχουμε φτάσει στο τέλος. Έτσι, αν fread - ναι; ΦΟΙΤΗΤΗΣ 45: Δεν μπορείτε απλά να βάλετε το πλήρες fread (ρυθμιστικό διάλυμα, 1, 1, src) εντός της while loop; JASON Hirschhorn: Έτσι σας προτείνουμε κάνει αυτό σε εκεί; [Παρεμβάλλοντας VOICES] JASON Hirschhorn: Περίμενε. Έτσι είμαστε απαλλαγεί από αυτό. Έτσι είστε προτείνοντας την τοποθέτηση fread σε εκεί; Τι θα πρέπει να επίσης να μετακινήσετε αν θέλετε να το κάνετε αυτό; ΦΟΙΤΗΤΗΣ 45: Το ρυθμιστικό έξω. JASON Hirschhorn: Θα πρέπει να επίσης να μετακινήσετε αυτό εδώ. ΦΟΙΤΗΤΗΣ 45: Αλλά μήπως ότι συνεχώς μετακινήσετε προς τα εμπρός; [Παρεμβάλλοντας VOICES] JASON Hirschhorn: OK. Έτσι, αυτό είναι ό, τι προτείνεται Okshar. Δημιουργούμε ρυθμιστικό μας. Εμείς ΕΝΩ fread, τότε fwrite. Σκέψεις σχετικά με αυτό; ΦΟΙΤΗΤΗΣ 46: μόνο ερώτημα μου είναι, θα να εκτελέσει πράγματι την fread εντολή; JASON Hirschhorn: Μεγάλη ερώτηση. Όταν βάζετε μια κλήση της συνάρτησης μέσα από μια κατάσταση, κάνει ότι κλήση της συνάρτησης εκτελέσει; Έχουμε δει παραδείγματα πριν. Σωστά; ΦΟΙΤΗΤΗΣ 46: OK. Ναι. Γι 'αυτό δεν εκτελέσει. JASON Hirschhorn: Έχουμε δει τα πράγματα όπως εκείνο πριν, όπου έχουμε μια κλήση της συνάρτησης μέσα από μια κατάσταση. Μήπως αυτό κλήση της συνάρτησης εκτελέσει; Ναι. Έτσι, η απάντηση είναι ναι. Αυτή η κλήση της συνάρτησης θα εκτελέσει. Αλλά και πάλι, είναι αυτό που θέλουμε; Τι είναι ένας τρόπος με τον οποίο μπορούσα να καταλάβω αν είναι αυτό που θέλουμε; ΠΟΛΛΑΠΛΕΣ ΦΟΙΤΗΤΕΣ: Εκτελέστε αυτό; JASON Hirschhorn: Θα μπορούσαμε να το τρέξει. Αλλά πριν το κάνουμε αυτό, θα μπορούσαμε να Επίσης λόγο μέσα από αυτό. Αν - πούμε ότι έχουμε ένα byte σε μας αρχείο, θα φτάσουμε εδώ, θα φτάσουμε σε αυτόν τον κώδικα. Αυτό θα τρέξει. fread θα επιστρέψει ένα byte και αποθηκεύσει στο buffer. Και αυτό πρέπει να εκτιμήσουμε σε 1, δεξιά, αφού επιστρέφει 1. Έτσι, ΕΝΩ 1. Αυτό σημαίνει ότι ο κώδικας μέσα Ο βρόχος while θα εκτελέσει; ΦΟΙΤΗΤΗΣ 47: Ναι. Είναι αλήθεια. JASON Hirschhorn: Ναι. 1 είναι αληθές. Δεν είναι 0. Έτσι ο κώδικας εδώ μέσα θα εκτελέσει. Έτσι, θα γράψουμε αυτό. Θα κινηθεί πίσω σε αυτό γραμμή και πάλι. Τώρα έχουμε - είμαστε στο τέλος του αρχείου μας. Διαβάζουμε από το τέλος του αρχείου μας, γιατί είχαμε μόνο ένα byte σε αυτό. Fread επιστρέφει 0, καταστήματα κάτι σε ρυθμιστικό. Ειλικρινά δεν ξέρω τι αποθηκεύει στη μνήμη. Θα μπορούσαμε ίσως να αναζητήσετε για να δούμε τι κάνει. Αυτό Ειλικρινά δεν ξέρω. Δεν ξέρουμε, ποιος νοιάζεται τι αποθηκεύει σε ρυθμιστικό; Αλλά δεν επιστρέφει 0. Και ενώ θα εκτελέσει 0; ΕΝΩ 0 δεν θα εκτελέσει. Έτσι, τότε θα μετακινηθεί προς τα κάτω εδώ. Έτσι, ας πάρει μια ανάταση των χεριών, αν αυτό είναι ο κώδικας θα πρέπει να τρέξουμε, ή αν πρέπει να κάνει αλλαγές πρώτα. Έτσι, αν νομίζετε ότι - θα πρέπει να ψηφίσετε. Αν νομίζετε ότι θα πρέπει να εκτελέσετε αυτόν τον κώδικα όπως είναι, παρακαλώ σηκώστε το χέρι σας. OK. Υπάρχει ένα - έχετε κάποια ερώτηση, ανησυχία; Ναι. ΦΟΙΤΗΤΗΣ 48: Μετά προχωράμε ρυθμιστικό έξω από το βρόχο, εμείς πρέπει να το malloc; JASON Hirschhorn: Μεγάλη ερώτηση. Μετά προχωρούμε ρυθμιστικό έξω από το βρόχου, δεν πρέπει να το malloc; Αυτό είναι ένα ερώτημα το πεδίο εφαρμογής. Αν προετοιμαστεί ρυθμιστικό έξω αυτού του βρόχου, θα υπάρχουν εσωτερικό του βρόχου; ΠΟΛΛΑΠΛΕΣ ΦΟΙΤΗΤΕΣ: Ναι. JASON Hirschhorn: Ναι. Το πεδίο εφαρμογής της καλύπτει μέσα από το βρόχο, και, πραγματικά, τίποτα κάτω από το εσωτερικό του εν λόγω κώδικα, συμπεριλαμβανομένης της τα πράγματα εδώ μέσα. Γι 'αυτό και δεν χρειάζεται να το malloc. Είναι μια τοπική μεταβλητή, και το πεδίο εφαρμογής της εξακολουθεί να περιλαμβάνει το βρόχο. ΦΟΙΤΗΤΗΣ 49: Μήπως θα πρέπει να το ελευθερώσει; JASON Hirschhorn: Έχουμε πρέπει να ελεύθερο buffer; ΦΟΙΤΗΤΗΣ 49: Ναι, αν δεν το κάνουμε malloc. JASON Hirschhorn: Έχουμε πρέπει να ελεύθερο buffer; Εμείς δεν κάνουμε. Και πάλι, είναι μια τοπική μεταβλητή, γι 'αυτό δεν χρειάζεται να το απελευθερώσει. OK. Ας δούμε τι θα συμβεί. Γι 'αυτό είναι προετοιμαστεί. Αυτό ήταν ό, τι κάτι που Marcus προτάθηκε νωρίτερα. Έτσι έχουμε το σφάλμα αυτό, η μεταβλητή buffer Αγνωστο είναι όταν χρησιμοποιείται εδώ. Πώς μπορούμε να το διορθώσω αυτό; ΦΟΙΤΗΤΗΣ 50: malloc αυτό; ΦΟΙΤΗΤΗΣ 51: Ίσο NULL; ΦΟΙΤΗΤΗΣ 52: Πείτε ρυθμιστικό ισούται με NULL. JASON Hirschhorn: OK. Φαίνεται καλό. Εμείς το έχουμε τώρα. Ας δημιουργήσουμε κάτι για να δοκιμάσετε να αντιγράψετε. Έτσι έχουμε αρχείο κειμένου μας. Πώς μπορούμε να τρέξει αυτό το πρόγραμμα; Ναι. ΦΟΙΤΗΤΗΣ 53: Μπορείτε να κάνετε dot κάθετο cp, test.txt. Και τότε μπορείτε να ονομάσετε ένα άλλο αρχείο το οποίο θα αποθηκεύει σε. JASON Hirschhorn: OK. Θα το ονομάσουμε out.txt. Cool; Ακολ σφάλμα. Σκέψεις σχετικά με το σφάλμα seg; Αυτό είναι μεγάλη. Πώς μπορούμε να βρούμε από πού το σφάλμα seg είναι; Τι; ΦΟΙΤΗΤΗΣ 54: Gdb. JASON Hirschhorn: Gdb. Τρέχουμε gdb γράφοντας gdb dot κάθετος, το όνομα του προγράμματός μας. Δεν υπάρχουν επιχειρήματα της γραμμής εντολών εκεί. Εμείς πάμε για να ορίσετε ένα breakpoint στο κεντρικό. Αν θέλω να ξεκινήσω gdb, τι μπορώ να κάνω; ΦΟΙΤΗΤΗΣ 55: R. JASON Hirschhorn: R. Και μετά τι; ΦΟΙΤΗΤΗΣ 55: Τα επιχειρήματα; JASON Hirschhorn: Στη συνέχεια, η τα επιχειρήματα της γραμμής εντολών. Ας δούμε. Ν παίρνει μόνο με γραμμή προς γραμμή. Πάω να πάει μέχρι Παίρνω seg δικό μου λάθος. Υπάρχει seg δικό μου λάθος. Μοιάζει fread προκαλείται seg δικό μου λάθος. Ξέρω fread προκάλεσε seg δικό μου λάθος, διότι αυτό ήταν το γραμμή που μόλις εκτελεστεί. Και το μόνο πράγμα που ήταν συμβαίνει σε αυτήν τη γραμμή - δύο πράγματα συμβαίνουν. Fread πήγαινε, και τότε θα ήταν κάνει κάποιο έλεγχο ΕΝΩ. Είμαι πρόθυμος να στοιχηματίσει ότι η ΕΝΩ έλεγχο δεν προκαλεί seg δικό μου λάθος. Το πιο πιθανό, fread ήταν προκαλώντας seg δικό μου λάθος. Βλέπω επίσης κάτι εδώ, memcopy. Αντίγραφο της μνήμης. Ακούγεται σαν να κινείται από τη μνήμη μία θέση στην άλλη. Ακούγεται σαν κάτι που θα μπορούσε να συμβεί σε fread, ίσως κάποια μνήμη κινείται από εδώ και εδώ. Ας πάμε μέσα από αυτό και πάλι. Πώς μπορώ να ξεκινήσετε από την αρχή και να τρέξει και πάλι; Ναι. ΦΟΙΤΗΤΗΣ 56: Μήπως θα πρέπει να θέσει ένα εμπορικό πριν buffer; JASON Hirschhorn: Έτσι εμπορικό πριν buffer θα μου δώσει τη διεύθυνση του buffer, το οποίο είναι ένα char *. Ας τρέχει μέσα από αυτό για μια ακόμη φορά. Πώς μπορώ να τρέχει μέσα από αυτό για άλλη μια φορά; ΦΟΙΤΗΤΗΣ 57: Μπορεί απλά πληκτρολογήστε τρέξει και πάλι; JASON Hirschhorn: Απλά πληκτρολογήστε και πάλι τρέξιμο. Γι 'αυτό και δεν πρόκειται να εκτελέσει αυτή τη γραμμή. Έτσι buffer είναι ένας δείκτης NULL. Διορθώστε; Είναι επισημαίνοντας - ας δούμε. Αν έχουμε μας - σχεδιάσετε μια γρήγορη εικόνα σχετικά με αυτό. Μπορεί ο καθένας να δούμε αν Γράφω εδώ; Έτσι στη στοίβα, έχουμε ένα τοπικό μεταβλητή και ονομάζεται buffer, και Είναι ένας δείκτης σε char. Ποια είναι αυτή η διεύθυνση char σε; ΦΟΙΤΗΤΗΣ 58: 0x0. JASON Hirschhorn: Σωστά. Αυτό είναι τι είναι αυτό. Εδώ, μέσα στο ρυθμιστικό, αποθηκεύεται 0x0. Αυτό είναι ό, τι έχουμε - η setup που έχουμε τώρα. Έτσι, αυτή η γραμμή, fread, βάζει κάτι από την πηγή πού; Σε αυτό το πλαίσιο ή το παράθυρο; Ποιο κουτί; Αριστερά ή δεξιά κουτί κουτί; Το δικαίωμα αυτό το πλαίσιο. Επομένως, το δείκτη, και βάζει εδώ. Όταν προσπαθούμε και τη μνήμη αφής σε θέση 0, τι έχουμε; Ένα σφάλμα κατάτμησης. Αυτό είναι το λάθος που έχουμε τώρα. Ναι. ΦΟΙΤΗΤΗΣ 59: Μην έχετε να θέσει ρυθμιστικό αστέρι; Ή όχι; Για fread; JASON Hirschhorn: Έτσι fread παίρνει ένα δείκτη. Έτσι ώστε να περνά σε ρυθμιστικό διάλυμα. Και τότε θα απο-αναφορά κάπου μέσα fread. Αλλά και πάλι, είδαμε, παίρνει ένα δείκτη. Δεν χρειάζεται να περάσει αστέρι buffer. Αυτό θα διέρχεται είναι ό, τι είναι εδώ. Και αυτό θα μπορούσε πιθανότατα να μας δώσει ένα λάθος γιατί είμαστε το de-αναφορά. Σωστά; Όταν de-αναφορά σε αυτό το δείκτη, όταν προσπαθούμε να αποκτήσετε πρόσβαση σε αυτήν τη θέση, παίρνουμε ένα λάθος - σφάλμα κατάτμησης μας. Έτσι - ουπς. Εμείς πάμε για να βγείτε από το gdb. Η γραμμή μας - το πρόβλημά μας - είναι σωστό εδώ σε αυτή τη γραμμή. Και αυτό είναι ένα πρόβλημα, διότι αυτής της γραμμής. Πώς μπορούμε να δημιουργήσουμε ένα πλαίσιο που είναι προσβάσιμο σε fread. Σωστά; Πρέπει να δημιουργήσουμε ένα πλαίσιο που είναι ένα byte μεγάλο, το μέγεθος ενός χαρακτήρα. Αλλά χρειαζόμαστε αυτό το πλαίσιο να είναι προσβάσιμο όταν αυτή η λειτουργία εκτελείται. Έτσι, όταν - ναι. Οποιεσδήποτε ιδέες; ΦΟΙΤΗΤΗΣ 60: Απλά ορίζεται ως οποιοδήποτε τυχαίο χαρακτήρα. Απλά κάνουμε char ισούται ρυθμιστικού ο χαρακτήρας. Και στη συνέχεια, όταν έχετε buffer εκεί - JASON Hirschhorn: Περιμένετε. Char buffer; Έτσι, δεν έχει αστέρι; ΦΟΙΤΗΤΗΣ 60: Ναι. Βγάλτε το αστέρι. Ισούται με ένα τυχαίο χαρακτήρα. JASON Hirschhorn: OK. Έτσι, να μου δώσει ένα. ΦΟΙΤΗΤΗΣ 60: Like a ή κάτι τέτοιο. Και στη συνέχεια, όταν έχετε buffer εκεί, μπορείτε να χρησιμοποιήσετε ένα - ΦΟΙΤΗΤΗΣ 61: Star; Ω, όχι, το εμπορικό. ΦΟΙΤΗΤΗΣ 60: Χρησιμοποιήστε το σύμβολο. JASON Hirschhorn: OK. Και τι γίνεται με το fwrite; ΦΟΙΤΗΤΗΣ 60: Χρησιμοποιήστε πάλι το εμπορικό. JASON Hirschhorn: Εντάξει. Έτσι, η ιδέα σας είναι, έχουμε δημιουργήσει μια χαρα και βάλει κάτι σε αυτό, και στη συνέχεια εγγραφή σε αυτό το char. ΦΟΙΤΗΤΗΣ 60: Ναι. JASON Hirschhorn: Τι σκέφτονται οι άνθρωποι; ΦΟΙΤΗΤΗΣ 62: Είναι μπερδεμένη. JASON Hirschhorn: OK. Ας το σύρει έξω. Έτσι, αυτή τη φορά, Πάω να επιστήσω αυτό κόκκινο στη στοίβα εδώ, και τότε θα έχει - ooh! Λυπάμαι. Έτσι, αυτή τη φορά έχουμε κάτι που ονομάζεται buffer, και είναι στη στοίβα. Διορθώστε; Και σώζουμε σε αυτό το, αρχικά. Στη συνέχεια έχουμε το αίτημά μας για fread. Τι fread δεν είναι αυτό που παίρνει ένα byte από το αρχείο μας και βάζει κάπου. Αυτό βάζει σε ό, τι το το πράγμα δείχνει να. Λοιπόν, πριν είχαμε αυτή τη διεύθυνση - 0x0. Τώρα τι διεύθυνση έχουμε; ΦΟΙΤΗΤΗΣ 63: Ό, ρυθμιστικό διεύθυνση είναι. JASON Hirschhorn: Ό, ρυθμιστικό διεύθυνση είναι. Είναι πιθανότατα θα είναι κάτι τέτοιο. Πιθανώς πρόκειται να ξεκινήσει με ένα b και ένα f, και στη συνέχεια να έχουν έξι άλλες δεκαεξαδικά ψηφία. Δεν πειράζει. Κάποια διεύθυνση. Και είμαστε περνώντας αυτή τη διεύθυνση μέσα Και θα πάμε να θέσει ένα μας byte πράγμα σε αυτή τη διεύθυνση. Έτσι θα πάμε για να βάλει ένα μας byte πράγμα εδώ μέσα. Και μετά θα πάμε να γράψει από τι είναι ποτέ εδώ μέσα. Μήπως κάποιος έχει απορίες γι 'αυτό; Ποιος νομίζει ότι αυτός ο κώδικας θα λειτουργήσει; Σηκώστε το χέρι σας αν νομίζετε ότι ο κωδικός αυτός θα λειτουργήσει. Θα πρέπει να λάβει θέση. Και ποιος πιστεύει ότι αυτός ο κώδικας δεν θα λειτουργήσει; Σηκώστε το χέρι σας. Όλοι οι υπόλοιποι θα πρέπει να είναι σηκώνοντας το χέρι τους. OK. Μάικλ, πού στέκεσαι; MICHAEL: δεν μπορώ να αποφασίσω. Είδος του στη μέση. JASON Hirschhorn: Είσαι στη μέση. Διαλέξτε ένα. ΜΙΧΑΗΛ: Θα έχουμε πίστη και να πω ότι θα λειτουργήσει. JASON Hirschhorn: OK. Θα έχουν πίστη και να πω ότι δουλεύει; Τι συνέβη; [Παρεμβάλλοντας VOICES] JASON Hirschhorn: Κανένα σφάλμα seg. Πώς μπορούμε να ελέγξετε για να δείτε αν δύο πράγματα είναι ίσα; Δύο αρχεία είναι ίσες. ΦΟΙΤΗΤΗΣ 64: Diff. JASON Hirschhorn: Diff. Diff ελέγχους για τις διαφορές μεταξύ των δύο αρχεία, και αν επιστρέφει τίποτα, είναι πανομοιότυπα. Και αν ανοίξουμε, θα πάρετε το αρχείο μας. Έτσι, αυτή ήταν η σωστή λύση. Ας ρίξουμε μια ματιά πίσω σε αυτό για μια ακόμη φορά. Εμείς πραγματικά δεν έκανε ακόμα πρέπει να το προετοιμάσει. Θα ήταν ίσως δούμε λίγο καθαρότερο αν δεν έχετε βάλει κάτι τυχαίο εκεί. Το θέμα είναι, θα έπρεπε να δημιουργήσετε κάποιο χώρο για να αποθηκεύσετε κάτι από fread και να λάβει κάτι από fwrite. Και αυτό το πράγμα έπρεπε να είναι είτε μια τοπική μεταβλητή στη στοίβα - σας θα μπορούσε να έχω malloc'd κάποιο διάστημα. Γι 'αυτό και στην πραγματικότητα θα μπορούσε να έχει γραπτή malloc εδώ, και που θα έχουν εργαστεί. Και τότε θα έχουν την αποθήκευση πράγματα μας κάπου στο σωρό. Αλλά αυτό είναι στην πραγματικότητα, κατά πάσα πιθανότητα, η πιο κομψή λύση. Απλά δημιουργήστε χώρο στη στοίβα για αυτά τα πράγματα να πάνε. Θα έχει άλλες δύο παρατηρήσεις. Εάν επρόκειτο να λάβει σειρά του σε αυτό, και στη συνέχεια, να σκοράρει σε αυτό, οι παρατηρήσεις μου θα είναι ως εξής. Αυτά είναι 1 εδώ, για μένα, κοίτα σαν μαγικό αριθμό. Αυτό το 1, από την άποψη της fread, νόημα. Αυτός είναι ο αριθμός των πραγμάτων να διαβάσει ή να γράψει. Αλλά αυτό εδώ θα πρέπει να ίσως να είναι κάτι άλλο. Έτσι τι είναι μια λύση; ΦΟΙΤΗΤΗΣ 65: Μέγεθος byte. JASON Hirschhorn: Σας αρέσει αυτό; ΦΟΙΤΗΤΗΣ 65: Μέγεθος της char. JASON Hirschhorn: Μέγεθος char. Ναι, byte δεν είναι ένας τύπος. Έτσι, το μέγεθος των έργων char. Θα μπορούσαμε να έχουμε, στην κορυφή του μας κώδικα, # ορίζεται ότι. Ονομάζεται κάτι BYTE και Είναι πραγματικά μια χαρα. Στην πραγματικότητα, μια ακόμη καλύτερη προσέγγιση θα μπορούσε να ήταν αυτό - uint. Ξέρει κανείς τι είναι αυτό; Λυπάμαι. Έχω πίσω. Περιμένετε, όχι. Ποιο περίπτωση δεν πάει; Ξέρει κανείς τι είναι αυτό; Ναι. ΦΟΙΤΗΤΗΣ 67: υποτίθεται για να βοηθήσει την τυποποίηση όλη πράγματα συστημάτων που έχουν - όπως ανυπόγραφα ακέραιοι που έχουν 8 bytes; JASON Hirschhorn: Αυτό είναι ακριβώς δεξιά. Σε διαφορετικά μηχανήματα, το μέγεθος ενός χαρακτήρα - δεν είναι συνήθως μια χαρα. Χαρακτήρες είναι συνήθως ένα byte. Αλλά το μέγεθος των άλλων τύπων δεδομένων είναι διαφορετικά μεγέθη σε μία μηχανή 32-bit έναντι μιας μηχανής 64-bit. Μια uint8_t είναι πάντα 8 bits - πάντα ένα byte. Και εγώ πρέπει να περιλαμβάνουν την εν λόγω πρότυπο αρχείο κεφαλίδας int. Μέχρι τώρα, αυτό θα ήταν πιθανώς ο καλύτερος τρόπος για να γράψω αυτό το κώδικα. Έτσι, μπορώ να απαλλαγώ από τα μαγικά τους αριθμούς. Και έχω και μια πιο λογική πληκτρολογήστε του buffer. Δεν είναι απλώς ένα char, είναι ένα byte, που είναι αυτό που περιμένουμε να είναι. Και εδώ, έχουμε πραγματικά ήταν λίγο πιο ισχυρή. Εμείς δεν το αποκαλεί χαρακτηριστικά, τα οποία - ίσως, ο οποίος γνωρίζει - θα μπορούσε να είναι ένα διαφορετικό μέγεθος σε διαφορετικά μηχανήματα. Είμαστε πραγματικά λέγοντας ότι αυτό είναι ακριβώς ένα byte, πάντα, δεν το θέμα αυτό. Και αν κοιτάξουμε εδώ, κάνουμε cp. Uh-oh. Τι συνέβη; ΦΟΙΤΗΤΗΣ 68: Θα μπορούσε να αλλάξει. JASON Hirschhorn: Τι; ΦΟΙΤΗΤΗΣ 69: Είναι αυτό; ΦΟΙΤΗΤΗΣ 70: Δεν το έκανες ορίζουν ως ένα είδος. ΦΟΙΤΗΤΗΣ 71: Αλλά θα πρέπει να να ορίζεται στο πρότυπο. ΦΟΙΤΗΤΗΣ 72: Τι συμβαίνει; ΦΟΙΤΗΤΗΣ 73: Πρέπει να καθορίζει το είναι όλα τα καπάκια; JASON Hirschhorn: Έτσι δεν είναι # define. Στην πραγματικότητα, σε αυτή την περίπτωση, είμαι πρόκειται να χρησιμοποιήσετε typedef. Επειδή είμαστε χρησιμοποιώντας ως ένας τύπος σε μία θέση. Έτσι, στην περίπτωση αυτή, θέλουμε πραγματικά να typedef σαν να εκτυπώνετε ένα νέο τύπο byte, και είναι, κατ 'ουσίαν, αυτό. Είναι λίγο διαφορετικό από ό, τι # define. Και τώρα, ο κώδικας μας δουλεύει τέλεια. Έτσι, και πάλι, # define παίρνει κάτι, αντικαθιστά παντού με το άλλο πράγμα. Είναι απλά μια μακρο - στενογραφία για να απαλλαγούμε από μαγικοί αριθμοί. Αλλά στην περίπτωση αυτή, επειδή είμαστε χρησιμοποιώντας το ως ένα είδος - εδώ - προκειμένου αυτό να λειτουργεί, χρειαζόμαστε να typedef ό, τι είναι byte. Και είμαστε το καθορίζουν εδώ. Δεν είναι ένα struct, στην πραγματικότητα μόνο ένα ανυπόγραφο ακέραιος. Είναι μακρύς ο δρόμος byte. Ο κωδικός αυτός θα είναι διαθέσιμα στο διαδίκτυο, και όλοι πρέπει να έχουν το δικαίωμα τώρα. Έτσι έχουμε - perfect - 13 λεπτά για να πάει αριστερά πάνω από το πρόβλημα που 5. Θέλω να περπατήσω μέσα copy.c μαζί, και στη συνέχεια θα μιλήσω εν συντομία για τα άλλα μέρη του προβλήματος που. Επιτρέψτε μου λοιπόν να σηκώσει copy.c. Και το δροσερό πράγμα είναι, έχουμε στην πραγματικότητα ήδη γράψει πολλά αυτού του κώδικα. Ο κώδικας γράψαμε κυριολεκτικά βγήκε από εδώ όταν ήμουν γράφοντας αυτό για τη δική μου. Αλλά αυτό είναι copy.c, αποτελεί το θεμέλιο για τα δύο πρώτα τμήματα της το πρόβλημα που για whodunit.c, η οποία θα πρέπει να γράψετε και resize.c. Recover.c, το οποίο είναι το τρίτο και τελευταίο μέρος του συνόλου του προβλήματος, δεν είναι βασίζεται στα ανοικτά αυτού του αρχείου. Θα πάμε να πρέπει να γράψω αυτό το αρχείο, σας δίνουμε ένα πρότυπο γι 'αυτό αρχείο, αλλά δεν έχει καμία να κάνει με copy.c. Αλλά επειδή copy.c είναι το θεμέλιο για τα δύο πρώτα σκέλη, θα πάμε να περπατήσει μέσα από αυτό τώρα, έτσι ώστε να έχουν μια καλή αίσθηση του τι κάνει. Και οι παρατηρήσεις δίνουν μερικά από μακριά. Έχουμε ήδη γράψει μερικά από αυτό. Πρώτον, είμαστε φροντίζοντας έχουμε τρία επιχειρήματα. Στη συνέχεια, εμείς θυμόμαστε το όνομα του αρχείου. Γι 'αυτό παραληφθεί αυτό το βήμα, όταν που κωδικοποιούνται πράγμα μας - όταν cp μας. Αλλά εδώ, κάνουν είναι λίγο καθαρότερο. Είναι έλεγχο για να βεβαιωθείτε και τα δύο αρχεία είναι καλές, σε Εκτός από το άνοιγμα τους. Γράψαμε όλοι αυτόν τον κώδικα μόλις τώρα, οπότε είμαι δεν πρόκειται να σταθώ σε αυτόν τον κώδικα. Επόμενο είναι μερικά πράγματα που είναι ειδικά για τους τύπους των αρχείων που χρησιμοποιούμε, η οποία είναι αρχεία bitmap. Bitmap αρχεία έχουν κάποια μεταδεδομένα συνδέονται με αυτά. Έτσι, το πρώτο ζευγάρι των bytes να σας πω σχετικά με το αρχείο. Δεν είναι τα χρώματα της το pixel στην εικόνα αυτή. Θα σας πω σχετικά με το αρχείο. Και αν διαβάσετε μέσα από το σύνολο του προβλήματος, θα έχετε πολύ περισσότερες πληροφορίες σχετικά με το τι τύποι των δομών μεταδεδομένων περιλαμβάνονται με bitmap. Αλλά γι 'αυτό έχουμε αυτό το πρώτο σύνολο - στον κωδικό αυτό εδώ. Μας διαβάζουν τα μεταδεδομένα - δύο κομμάτια των μεταδεδομένων - το αρχείο επικεφαλίδας και των πληροφοριών κεφαλίδας. Και είμαστε ελέγχει κάποια τμήματά του να βεβαιωθείτε ότι είναι ένα πραγματικό αρχείο bitmap πριν συνεχίσετε. Και πάλι, αυτά είναι τα στοιχεία που Δεν χρειάζεται να πάει στο τώρα. Αν διαβάσετε το σύνολο του προβλήματος, θα καταλάβετε αυτά. Μεγάλη ιστορία σύντομη, αυτά είναι απλά λέγοντας, αυτό είναι ένα αρχείο bitmap, και επιβεβαιώνοντας ότι. Στη συνέχεια, γράφουμε εκείνων στο αρχείο έξω. Βλέπουμε ότι εδώ. Σας γράφουμε για το δείκτη έξω. Στη συνέχεια, είμαστε καθορισμό padding. Έτσι και πάλι, όπως είναι με ιδιαιτερότητα ένα αρχείο bitmap, μερικές γραμμές περιλαμβάνουν παραγεμίσματος στο τέλος. Και αν διαβάσετε μέσα από το σύνολο του προβλήματος, θα μάθετε περισσότερα για το παραγέμισμα. Αυτή είναι η συνταγή για να βρείτε το υλικό παραγεμίσματος. Είναι σημαντικό να θυμόμαστε - όταν αλλάζετε το μέγεθος του bitmap αρχείο, οι αλλαγές padding. Όταν αλλάζετε το μέγεθος ενός αρχείο, οι αλλαγές padding. Ποτέ δεν πρόκειται να είναι μεγαλύτερο από 3 - θα είναι από 0 έως 3, χωρίς αποκλεισμούς. Αλλά όταν αλλάζετε το μέγεθος του κάτι, οι αλλαγές padding. Αν έχω μόνο ένα εικονοστοιχείο σε αυτή την σειρά, I χρειάζονται τρία bytes γεμίσει, επειδή κάθε σειρά πρέπει να είναι πολλαπλάσια του τέσσερα bytes καιρό σε ένα αρχείο bitmap. Αλλά αν μπορώ να διπλασιαστεί, για να πάει από το ένα pixel σε δύο pixel, καθένα από τα οποία, ας πούμε, είναι ένα byte, τότε θα πρέπει δύο bytes του padding για να κάνουν που ισούται με τέσσερα. Έτσι, όταν μπορώ να αλλάξω το μέγεθος του κάτι, Πρέπει να αλλάξω το ποσό παραγέμισμα έχω. Μήπως αυτό έχει νόημα για όλους; Στη συνέχεια, μετακινηθείτε πάνω από κάθε σειρά, ή μέσα από όλες τις σειρές. Και τότε θα επαναλάβει μέσω κάθε στήλη σε κάθε σειρά. Είμαστε θεραπεία αυτού του bitmap, όπως ένα πλέγμα, όπως έχουμε περιθάλψει το διοικητικό συμβούλιο σε 15. Όπως θα αντιμετωπίζονται τα τούβλα όταν εμείς τους τυπωμένο στην οθόνη. Ένα πλέγμα σειρών και στηλών. Στη συνέχεια - το είδαμε αυτό. Στην πραγματικότητα μόνο κωδικοποιημένα αυτό. Δημιουργήσαμε κάποια προσωρινή αποθήκευση. Διαβάζουμε εκεί, και στη συνέχεια θα το γράψει. Αυτό είναι ακριβώς αυτό που μόλις έκανε. Στη συνέχεια, επειδή είπα κάθε γραμμή καταλήγει σε κάποιο padding, εμείς υπερπηδήσει αυτό το υλικό παραγεμίσματος - το παλιό padding. Και τότε μπορούμε να το προσθέσετε ξανά. Σε αυτή την περίπτωση, δημιουργούμε ακριβώς το ίδιο αρχείο. Είμαστε απλά αντιγραφή. Έτσι, αυτή η γραμμή είναι χαζό. Θα μπορούσαμε κυριολεκτικά τη βάτα μέσα Αλλά αν αλλάξετε το μέγεθος του αρχείου, Δεν θέλετε ακόμα αυτή τη γραμμή; Έτσι, αν αλλάξετε το μέγεθος ενός αρχείου, Δεν θέλουμε ακόμα να παρακάμψετε πάνω από το παλιό υπόστρωμα; ΦΟΙΤΗΤΗΣ 74: Ναι. JASON Hirschhorn: Έτσι το κάνουμε. Επειδή αυτό, πάλι, προσφορές με το αρχείο προέλευσης. Δεν νοιάζονται για το παραγέμισμα από το αρχείο προέλευσης. Θέλουμε να πάμε στην επόμενη γραμμή. Αλλά δεν μπορούμε να το θέσουμε απλά πίσω το παλιό ποσό των padding. Πρέπει να θέσουν εκ νέου το νέο ποσό του padding. Έτσι, όταν αλλάζουμε το μέγεθος ενός αρχείο, εξακολουθούμε να θέλουμε να πηδήσει πάνω από το padding στο παλιό αρχείο - τι είμαστε ανάγνωση από. Αλλά αυτό που γράφουμε για να, θα πάμε να πρέπει να τεθεί και πάλι κάποια διαφορετική αριθμός padding που έχουμε καθορίσει. Ναι. ΦΟΙΤΗΤΗΣ 75: Η σειρά των δύο αυτών γραμμές δεν έχει σημασία, έτσι δεν είναι; Επειδή είστε το χειρισμό διαφορετικά αρχεία. JASON Hirschhorn: Ακριβώς. Η σειρά αυτών των δύο γραμμών Δεν έχει σημασία. Σας γράφω αυτή τη γραμμή. Αυτό είναι εδώ για το αρχείο γράφουμε για. Αυτό είναι σημαντικό, έτσι ώστε να πάρει το σωστή ποσότητα του padding. Αυτό έχει να ασχοληθεί με το αρχείο σε μορφή. Θέλουμε να παρακάμψετε δεξιά πάνω από το παραγέμισμα. Δεν θέλουμε να διαβάσει - αν διαβάζετε ένα byte σε μια στιγμή, έχουμε δεν νοιάζονται για αυτά τα bytes padding. Θέλουμε να προχωρήσουμε στην επόμενη γραμμή. Τέλος, ακριβώς όπως Lucy έδωσε για μας, κλείνουμε τα αρχεία και να επιστρέψετε 0. Έτσι, αυτό είναι copy.c. Και στην πραγματικότητα έγραψε - θα περάσει το μεγαλύτερο μέρος της τμήμα το γράψιμο αυτού, κατ 'ουσίαν. Κάνατε αυτό. Έτσι, ελπίζουμε ότι έχετε μια καλή αίσθηση του τι συμβαίνει εδώ. Η μεγάλη διαφορά, ειλικρινά, είναι ακριβώς αυτό το πρώτο μέρος που ασχολείται με ιδιαιτερότητες των αρχείων bitmap. Γι 'αυτό και έχουν ως επόμενη διαφάνεια μου, τι πρέπει να κάνουμε; Λοιπόν, ας σκεφτούμε αστυνομικό θεατρικό έργο. Και για κάποιον που διαβάζουν μέσω το πρόβλημα που, ό, τι κάνουμε εμείς πρέπει να κάνουμε σε αστυνομικό θεατρικό έργο; Απλά. Aleja. ALEJA: Μπορείς να πάρουν το μέρος κάθε πίξελ που υποδηλώνει κόκκινο. Και στη συνέχεια - το είδος του; JASON Hirschhorn: OK. Πάρτε λοιπόν το μέρος του κάθε pixel που υποδηλώνει κόκκινο. Που είναι κοντά, αλλά όχι όλα. ΦΟΙΤΗΤΗΣ 76: Λοιπόν, υπάρχει διαφορετικούς τρόπους για να το κάνει. JASON Hirschhorn: OK. Δώσε μου ένα τρόπο. ΦΟΙΤΗΤΗΣ 76: Βγάλτε όλα τα κόκκινα, και Στη συνέχεια τονίζουν το μπλε και το πράσινο. JASON Hirschhorn: OK. Έτσι, δίνεται τόσο αυτοί οι τρόποι - ακούγεται σαν δίνουμε ένα pixel, το έχει ένα κόκκινο, μπλε και πράσινο επίπεδο. Θέλουμε να αλλάξουμε τα σχετικά επίπεδα των το κόκκινο, μπλε και πράσινο, ανάλογα με σχετικά με αυτό το εικονοστοιχείο. Όπου στον παρόντα κώδικα πρέπει να αλλάξουμε η σχετική κόκκινο, μπλε και πράσινο επίπεδα ενός συγκεκριμένου εικονοστοιχείου. Αφού έχουμε διαβάσει - πριν το γράψεις; Δώσε μου τον αριθμό γραμμής. ΠΟΛΛΑΠΛΕΣ ΦΟΙΤΗΤΕΣ: 83. JASON Hirschhorn: 83. Έτσι, εδώ. Για whodunit, ο κώδικας θα πρέπει να εγγραφής πρέπει να πάμε όλοι εκεί. Και αυτός είναι ο μόνος κωδικός θα πρέπει να γράψετε. Διότι, όπως ακούσαμε, όλα όσα χρειάζεται να κάνετε είναι να αλλάξετε αυτά σε σχέση με το μπλε, κόκκινο, πράσινο και επίπεδα από κάθε πίξελ. Έχετε διαβάσει το, και τώρα είστε πρόκειται να το γράψω. Πώς μπορώ να πάρω - αν έχω αυτό το πράγμα το τριπλό, ακριβώς εδώ, και είναι της πληκτρολογήστε RGBTRIPLE - καλά, αν ψάξαμε στο bmp.h, τι είναι RGBTRIPLE; ΦΟΙΤΗΤΗΣ 77: Είναι ένα struct. JASON Hirschhorn: RGBTRIPLE είναι ένα struct. Βλέπουμε ότι το δικαίωμα εδώ κάτω. Και έτσι, αν ήθελα να έχουν πρόσβαση, για παράδειγμα, η κόκκινο επίπεδο του struct, πώς μπορώ να κάνω πρόσβαση στο κόκκινο επίπεδο αυτού του struct; [CLASS Ψίθυροι] ΦΟΙΤΗΤΗΣ 78: RGBTRIPLE.rgbtred; JASON Hirschhorn: Είναι αυτό σωστό; ΦΟΙΤΗΤΗΣ 79: Θα πρέπει να είναι τριπλή dot, αντί RGBTRIPLE dot; JASON Hirschhorn: Triple. Τριπλό είναι η τοπική μεταβλητή, έτσι εδώ, δεν υπάρχει καμία δείκτες εδώ. Γι 'αυτό και απλά χρησιμοποιήστε το συμβολισμό με την τελεία. Αυτό θα μου δώσει το επίπεδο του κόκκινου. Αν θέλω να το αλλάξω, μπορώ μόνο που είναι ίσο με κάτι διαφορετικό. Έτσι και πάλι, αυτή τη γραμμή κώδικα προσβάσεις αυτή η μεταβλητή μέσα σε αυτό το struct, και μπορούμε να το ρυθμίσετε σε κάτι νέο. Έτσι, για whodunit, πάλι, αυτό είναι, στην ουσία, αυτό που πρέπει να κάνουμε. Πολύ απλό. Απλά αλλάξτε κάποια σχετική επίπεδα, και αυτό είναι όπου ο κώδικας αυτός πηγαίνει. Αλλαγή μεγέθους, από την άλλη πλευρά, είναι λίγο πιο περίπλοκη. Στην πραγματικότητα, αλλαγή μεγέθους είναι ίσως η δυσκολότερο μέρος του προβλήματος αυτού που. Έχουμε τρία λεπτά για να πάει πέρα ​​από αυτό. Αλλά και πάλι, έχουμε ήδη γράψει μεγαλύτερο μέρος αυτού του κώδικα, έτσι ώστε να θα πρέπει να είναι αρκετά εξοικειωμένοι. Ποια είναι μερικά πράγματα που θέλουμε να κάνουμε σε αλλάξετε το μέγεθος, αν έχετε διαβάσει πάνω από το που το πρόβλημα; Αν τους δώσει σε μένα, θα να μιλήσουμε γι 'αυτούς. Ποια είναι μερικά πράγματα που θέλουμε να κάνουμε; ΦΟΙΤΗΤΗΣ 80: Κάθετα - έτσι θα πρέπει να αλλάξετε το μέγεθός του οριζόντια, αλλά κάθετα αλλάξετε το μέγεθός του, καθώς; JASON Hirschhorn: Έτσι, αν είμαστε δοθεί pixel, και θέλουμε να αλλάξετε το μέγεθός του με ένα παράγοντα δύο, θα πρέπει τώρα να αλλαγή μεγέθους οριζόντια και το μέγεθός της κατακόρυφα. Μήπως αυτό έχει νόημα; Ναι. Έτσι, αυτό είναι ίσως το μεγαλύτερη πρόκληση. Και εμείς θα μιλήσουμε για αυτό σε ένα λεπτό. Ναι. ΦΟΙΤΗΤΗΣ 81: Ο τρόπος που το σκέφτηκα που σου χρειάζεται εκτύπωσης έξω - JASON Hirschhorn: Περιμένετε. Μην μας πείτε τι κάνατε. Εμείς πάμε για να μιλήσουμε στη λογική. ΦΟΙΤΗΤΗΣ 81: OK. Ποια ήταν η ερώτηση; JASON Hirschhorn: Απλά σήκωσε το χέρι σας. Δεν υπήρχε καμία αμφιβολία. Επιτρέψτε μου να το παρουσιάσει. Επιτρέψτε μου να συζητήσει αυτό το λίγο. Έτσι, έχουμε ένα pixel, θέλουμε να αναπαράγουν αυτό, τόσο οριζόντια όσο και κατακόρυφα. Έτσι, στην ιδανική αυτό που κάνουμε εδώ είναι, εμείς διαβάζονται pixel μας, το γράφουμε Ωστόσο, πολλές φορές. Στη συνέχεια, όμως έχουμε τέχνασμα μας εδώ, διότι Στη συνέχεια θέλουμε να μεταβείτε στην επόμενη γραμμή και να το γράψετε σε η έναρξη της επόμενης γραμμής. Έτσι, αν θέλουμε να αναπαράγουν τόσο οριζοντίως και καθέτως, τι είναι ένας καλός τρόπος για να το κάνουμε αυτό - ένα καλό όμως να το κάνουμε αυτό; Γι 'αυτό και δεν χρειάζεται να αναζητούμε διαρκώς γύρω από το αρχείο μας να τοποθετήσετε τα πράγματα. Το ερώτημα αυτό μπορεί να μην έχει έκανε αίσθηση, αλλά νομίζω ότι μια απαντήσει σε αυτό θα βοηθήσει. ΦΟΙΤΗΤΗΣ 82: Δημιουργήστε μια σειρά; JASON Hirschhorn: Ας σκεφτούμε κάθε αρχείο ως μια σειρά. Ας σκεφτούμε σε γραμμές. Αν έχουμε την πρώτη σειρά μας από τα μικρά μας εικόνα, μπορούμε να κάνουμε αυτή τη γραμμή σε ένα μεγάλο σειρά από μία μεγάλη εικόνα, και στη συνέχεια να αναπαράγουν αυτή τη γραμμή, ωστόσο πολλές φορές χρειάζεται να επαναληφθεί, αντί να πηγαίνει pixel προς pixel, η οποία γίνεται σύγχυση όταν που ασχολούνται με τα αρχεία. Διότι αν είχαμε - Τρέχω από το διάστημα. Αν αυτό είναι το αρχείο μας, και έχουμε ότι ένα pixel εκεί, και θέλουμε να το θέσω εκεί, έχουμε ακόμα κάποια πράγματα ότι χρειάζεται να πάμε εκεί όταν είμαστε γραφή και τη δημιουργία νέου αρχείου μας - Αρχείο μας που είναι διπλάσια. Αλλά είναι πραγματικά δύσκολο με τις λειτουργίες του αρχείου να προσπερνά σε νέες γραμμές όπως αυτό, και στη συνέχεια να επιστρέψετε εδώ και να βάλει τα πράγματα εκεί. Είναι σχεδόν αδύνατο να κάνει κάτι έτσι, αν αυτό έχει νόημα. Έτσι, αν πιστεύουμε σε γραμμές, μπορούμε λάβει σειρά μας, και στη συνέχεια το βάζουμε - αναπαράγουν σειρές κάθετα. Και αυτό είναι το πώς θα ασχοληθεί με την αλλαγή μεγέθους κάθετα αντί οριζόντια. Αυτό ήταν το είδος της ταχείας και μια μικρή σύγχυση. Δυστυχώς ο χρόνος μας τελείωσε. Θα σταθεί έξω για όσους από εσάς εδώ που έχουν ερωτήσεις σχετικά με το σύνολο του προβλήματος, περιλαμβανομένης ανακάμψει. Οπότε ας διακόψουμε για τώρα. Και πάλι, αν έχετε οποιεσδήποτε ερωτήσεις, μπορούμε να συνομιλήσετε έξω.