JASON HIRSCHHORN: Willkommen, alle, bis Woche 6. Ich bin froh, euch alle am Leben zu sehen und gut Quiz nach 0, da ich weiß, dass war ein bisschen rau. Aber zum Glück, können Sie alle tat unglaublich gut. Und damit ist wunderbar. Wenn Sie in meiner Abteilung, haben mir am meisten gegeben der Sie wieder Ihre Quiz bereits. Ein paar von euch, ich treffe nach dem Unterricht. Und wenn Sie eine Erweiterung von Studierenden und sind Sie Ihr Quiz nicht erhalten haben zurück noch wird Ihre TF wahrscheinlich daran zu arbeiten und Gehalt, und wird es wieder Ihnen in Kürze. Also meine Studenten, die Verlängerung gerade jetzt - hoffentlich leben - Ich werde Ihre Quiz bekommen kurz als gut. Unsere Agenda für heute ist wie folgt. Zuerst werden wir über einige gehen Ressourcen, die CS50 bietet für Sie. Wir werden neben Quiz über 0 zu gehen, und Ich werde niemandem irgendwelche Fragen zu beantworten hat über besondere Probleme. Und dann werden wir gehen über Datei-I / O und Problem Set 5. Diese letzten beiden Themen nehmen bis der Großteil der Abschnitt heute. Ich habe diese Liste jede Woche ein Erinnerung an euch alle, aber der Kern Abschnitt haben wir nur 90 Minuten - wir nicht in der Lage, um alles abzudecken, die ich würde gerne für euch zu decken. Aber wir haben eine Menge von Ressourcen für Sie zeichnen auf, wie Sie wissen, erhalten das Material und die Arbeit durch Ihr Problem stellt. Eine Erinnerung, die ich habe einen Online-Text Box, für Sie eingerichtet ausfüllen, wenn Sie irgendeine Feedback für mich, sowohl positive als auch konstruktiv, zu Abschnitt. Das URL wird hier rechts unten befindet. Also bitte, einen Moment Zeit nehmen, wenn Sie welche haben Feedback, ob die während der Abschnitt, oder nach, oder nachdem Sie das Video zu sehen online, um mir Ihr Feedback zu geben. Ich schätze wirklich alle und alles. Also ich habe mit kleinen Gespräche mit einer Menge von meinem Studenten während der ganzen Woche - wie ich die Hand Quiz zurück, spricht über die natürlich sehen, wie du tust. Und ein Thema hat kommen und über im Gespräch über - in insbesondere - Problem setzt. Und ich habe dieses Thema gekapselt auf dem Board jetzt. Im Wesentlichen gibt es einen Unterschied zwischen Drehen in etwas, das ist korrekt und etwas getan das ist gut gemacht. Die meisten Menschen wurden dabei fantastische im Hinblick auf Richtigkeit - 5 oder 4 ist auf allen psets. Die meisten Menschen werden immer diejenigen, die ganze Zeit. Allerdings nur, weil du getan hast etwas richtig bedeutet nicht, Sie haben etwas getan, wie elegant oder effizient, oder so sauber, wie Sie hätte es tun können. Und das ist, was die Design - und zu einem geringeren Grad, Stil - Achsen sind. Ich bin also schieben Sie alle, und andere Transkriptionsfaktoren drängen euch, nicht nur wiederum in Dinge, die richtig sind, aber schalten in die Dinge, die gut codiert sind. Nicht dabei unnötige FOR-Schleifen, nicht neu berechnet, wenn Variablen Sie haben nicht zu. Zum Beispiel, im Rückblick auf Problem eingestellt 4, bei der Platzierung der Ziegelsteine ​​auf die Bildschirm, jede Zeile - jeder Stein in ein bestimmten Zeile hat die gleiche y-Koordinate - die gleiche Höhe zu koordinieren. So, dass y-Koordinate nicht zu müssen, im Innenraum berechnet werden FOR-Schleife, die Sie wahrscheinlich benutzt verschachtelt diese Steine ​​auf den Bildschirm gebracht. Es muss nur jeder berechnet werden Mal, wenn Sie eine Zeile umgeschaltet wird, oder nach unten bewegt, eine Zeile. So sagen wenn es 10 Steine ​​in eine Reihe, kann jeder Stein das gleiche haben y-Koordinate und die y-Koordinate kann einfach berechnet werden einmal für alle diejenigen. Es muss nicht berechnet werden, 10 mal, noch ist, dass die Berechnung Notwendigkeit in der tatsächlichen passieren Funktionsaufruf - die neue gracked Funktionsaufruf. Also, wenn das ein wenig verwirrend für Sie, mehr generisch, Dinge, die müssen nicht jedes Mal passieren Sie durch eine FOR-Schleife gehen sollte nicht sein setzen in der FOR-Schleife, und sollte nicht passieren, jedes Mal wenn Sie gehen durch die FOR-Schleife. Ein weiteres gutes Beispiel sahen wir Design in Woche 3 für 15, Sie halten konnte Spur der Null. Also, wenn Sie das Board initialisieren Sie retten - in einer globalen Variablen, vielleicht - die x-und y-Koordinate des Null. Und dann, wenn Sie - Ihr Umzug in Funktion, wenn Sie machen ein erfolgreicher Schritt, bearbeiten Sie die Lage der Null. Das würde Sie davon ab, zu tun, sparen FOR-Schleifen, um durch die aussehen verschachtelt Bord jedes Mal in der Move-Funktion und finden Sie die Null, oder finden Sie die Fliesen, und dann prüfen, was ist daneben. Stattdessen die Position des haben Sie Null, können Sie einfach oben schauen, unten, und links und rechts davon, zu finden die Fliese die Sie gesucht. Also in Bezug auf die Programme, die wir sind schreiben, sind sie nie groß genug Einige dieser Entwurfsentscheidungen werden wirklich behindern Ihre Programm, oder machen es langsamer laufen, oder vielleicht sogar der Speicher knapp. Aber wir sind immer noch dabei, ihr Jungs zu schreiben, wie elegant und effizienten Code wie möglich. Also, wenn Sie am Ende schriftlich Dinge , die einen deutlich größeren haben Umfang, werden sie mit guten geschrieben werden Design abgesehen davon, dass richtig. So einige von Ihnen haben gebracht, dass aus. Das ist etwas, was wir suchen - etwas, wir werden auch weiterhin drücken euch auf. Wenn Sie Fragen haben über die Gestaltung des Programms, fühlen Sie sich frei zu erreichen, um mich, und ich bin glücklich, Spaziergang durch das Programm mit Ihnen, und zeigen etwas von dem Entwurf Entscheidungen, die Sie gemacht, und geben Ihnen einige Vorschläge auf, wie man selbst bessere Design-Entscheidungen. Also werden wir weiter zu gehen zu reden Quiz 0. Bevor wir das tun, weiß jemand Fragen über das, was Ich habe so weit abgedeckt? [Rascheln] JASON HIRSCHHORN: Sieben Sekunden. OK. Lassen Sie uns über Quiz 0 sprechen für ein bisschen. Die meisten von Ihnen haben Ihre Quiz 0 zurück. Wenn Sie das nicht tun, hoffentlich Sie erinnern sie ein wenig. Aber wenn Sie Quiz 0, dann sind Sie aufgenommen haben haben auch Zugriff auf die PDF online im Probelösungen. Hat jemand irgendwelche Fragen haben, bevor wir springen in der Woche Material ein besonderes Problem auf Quiz 0 - warum die Antwort ist, was es ist? Ist jemand verwirrt über alles? Auch wenn Sie das Problem richtig verstanden habe, aber nur möchten, dass ich es erklären, ein bisschen mehr, bin ich glücklich, dies jetzt zu tun. So habe ich euch gebeten kommen vorbereitet mit einigen Gedanken über Quiz 0. Also, die gerne zu uns kommen würden begann mit einer Frage oder Kommentare zu Quiz: 0? [PAPIER Rascheln] JASON HIRSCHHORN: Nicht jeder tat perfekt. So weiß ich, [lacht] es müssen einige Fragen sein Quiz über null. OK. Ja. Ompica. OMPICA: Number 10. JASON HIRSCHHORN: Number 10. Welches war die Nummer 10? OMPICA: Die - JASON HIRSCHHORN: Ich haven't - OMPICA: Das sind - JASON HIRSCHHORN: Nummer 10 war acht i - Schreiben von acht bis i? OMPICA: Ja. JASON HIRSCHHORN: OK. Also eine andere Frage, die Sie haben können fragte ich war vorausschauend? Die Antwort ist ja. Im Abschnitt vor dem Quiz, fragte ich euch, sowohl Sterling-Code und acht bis i. Beide passiert erscheinen auf dem Quiz. So hoffnungsvoll, werden Sie bezahlt Aufmerksamkeit darauf. Und wenn Sie hatten, dann müsste wahrscheinlich auf diese beiden gut gemacht. Aber acht bis i, wir haben nicht wirklich Code es in der Klasse, aber es war wieder fragte am Quiz. So ein paar Dinge zu nehmen beachten Sie bei der Codierung von acht bis i. Das erste, was, je die Frage, war Sie benötigt, um zu überprüfen, wenn die Zeichenfolge war gleich null. Ein paar Leute versuchten, später überprüfen im Programm, wenn s Halterung ich war - so ein bestimmtes Zeichen, dass String - war gleich null. Aber denken Sie daran, dass null ist im Wesentlichen - es ist gut zu denken null als Null-Zeiger - ein Zeiger auf Null - irgendwo im Speicher, wo man kann nie zugreifen. Also, wenn etwas ist gleich null, die Sie weiß, dass es nicht initialisiert wurde, oder es ist nichts. Also s ist ein Zeichen Stern, s Halterung i ist ein Zeichen. So macht es Sinn, s vergleichen auf null, aber nicht s Halterung i auf null. Aber noch einmal - das war das erste, was dass Sie tun sollten - überprüfen, um sicherzustellen, dass Sie tatsächlich hast ein String. Weiter zu durchlaufen, Sie wollten jedes Zeichen in der Zeichenfolge. Und damit wäre wie eine Klammer s sein i, zum Beispiel, wenn ich Ihr Iterator. Und nehmen Sie das Zeichen, und zu ihrem eigentlichen Wert. Sie haben es als char gespeichert, sondern der ASCII-Wert für Null - Null als Charakter - tatsächlich nicht die ganze Zahl Null. Es ist eine andere Zahl, die Sie nachschlagen in der ASCII-Tabelle. So einen Weg, um dafür zu korrigieren - wahrscheinlich der beste Weg, um zu korrigieren dass - von ihr subtrahieren der Zeichenwert - Null als Charakter. Also minus Apostroph, null, weitere Single Zitat. Das wird nehmen, was Zahl, die Sie haben als char, und bekommen es gleich die Zahl als eine tatsächliche ganze Zahl ist. Und das ist sehr ähnlich dem Ansatz eine Menge von Menschen nahmen in der Problem Set 2, mit Caesar und Viginere - diese Chiffren, wenn Sie wurden dem Drehen auf. So, nachdem Sie es als Zahl von haben Null bis Neun, dann - je nach wo es geht in die ultimative Nummer - Sie müssen, um es zu multiplizieren mit einer Leistung von 10. Einige Menschen zogen von der Rückseite, um die vorne und multipliziert die individuelle Zahl mit einer Potenz von 10. Einige Menschen zogen von die von vorne nach hinten - und so nahm die höchste Bestellnummern ersten - und würden die in a sparen globale Zählervariable. Und dann jedes Mal durch die FÜR Schleife, multiplizieren, dass die riesigen globalen Zählervariable um 10, um Raum für das nächste Zeichen. Also das war ein wenig verwirrend, ohne mir ist es auf dem Brett zu schreiben. Aber die Probelösung steht Ihnen zur Verfügung. Aber das waren die großen Dinge die wir gesucht haben. Auch eine Überprüfung, um sicherzustellen, dass jeder individuellen Charakter war in der Tat ein Charakter zwischen null und neun, und nicht ein anderer Charakter, wie ein A, zum Beispiel. Das waren die Dinge, die wir waren auf der Suche für in dieser Frage. Heißt das, Ihre Frage zu beantworten? OMPICA: Ja. JASON HIRSCHHORN: OK. Gibt es noch andere Fragen Quiz über 0? Was ist mit der Zusammenstellung? Jeder der Zusammenstellung richtig? Nein. Es gab eine - [Lacht] Fragen zu den Übersetzungsvorgang? Wow. [PAPIER Rascheln] JASON HIRSCHHORN: Ja. Michael. MICHAEL: Ist Nummer 7 - zufällig? JASON HIRSCHHORN: Number 7. Nummer 7 war erhalten eine Zufallszahl. Excellent. So haben Sie gegeben sind eine ganze Zahl ein und eine ganze Zahl b, und Sie möchten eine zufällige ganze Zahl zwischen a und b. Wir können wirklich schreiben dieses auf der Vorstand, weil dieser war eine Zeile Code - einen Weg, es zu tun. Also werden wir Drand als gegeben Funktion, die wir nutzen könnten. Und was bedeutet Drand - vorausgesetzt, es ist schon ausgesät - Was bedeutet Drand zurückkehren? Michael: Ein Schwimmer zwischen 0,0 und 1,0. JASON HIRSCHHORN: Eine Zahl - ja. Eine Zahl zwischen 0 und 1 ist. Und so haben wir B und A haben. Und dann unsere Zufallszahl haben wir zwischen 0 und 1, die uns von Drand gegeben. Einige Menschen versuchten, b stellen oder b minus a, oder etwas in die Klammern. Das würde bedeuten, dass sie Argumente für diese Funktion. Drand nimmt keine Argumente - wie getString tut nicht alle Argumente. So ist es nur offene paren, in der Nähe paren - und das selbst, der Funktionsaufruf. Und das gibt Ihnen eine Reihe zwischen 0 und 1 ist. Natürlich haben wir eine ganze Reihe dass Zahlen in. Sprich, wenn b ist 10 und eine 5 ist, wir wirklich wollen, eine Zahl mit einem Bereich von 5. Also das nächste, was wir tun müssen, ist multiplizieren Sie diese mit dem Bereich b minus ein. So ist der Annahme, dass multipliziert. Und das wird uns eine Nummer geben innerhalb eines gegebenen Bereichs. Und dass bestimmte Bereich bei der Unterschied zwischen minus ein b. Und schließlich werde, dass nur geben es aus - sagen, den Bereich zwischen minus ein b ist 5, das wird uns einen geben Zahl von 0 bis 5 ist. Aber wenn ein tatsächlich 5 müssen wir steigern dieser Bereich nach oben, wo es ist eigentlich sein soll, durch Hinzufügen einer. Damit bekommt die Logik richtig. Und dann hätten Sie eine andere Frage? Michael: Nein. Ich fühle mich einfach jetzt wirklich dumm. [Lacht] JASON HIRSCHHORN: Nein Fühlen Sie sich nicht wirklich dumm. Eine Reihe von Menschen gekämpft mit dieser Frage. Und dann ist die andere Frage, Drand, Sie sagten, gibt Ihnen einen Schwimmer - gibt einen Schwimmer. Aber diese Funktion tatsächlich gefragt für eine ganze Zahl zurückzugeben. Sie nicht, dies ausdrücklich geworfen brauchen in eine ganze Zahl, da diese Operationen wird sie wie alle eine Behandlung schweben - wie eine Fließkommazahl. Gefällt Ihnen dieses Willens - auch wenn dies eine ganze Zahl ist, wird dies korrekt multipliziert. All die Multiplikation funktioniert. Sie brauchen nicht, um es hier zu werfen. In der Tat sollte man nicht werfen es. Das wäre - wenn Sie eine Reihe werfen würde das ist zwischen 0 und 1 - eine Zufallszahl, eine Fließkomma - dann wird es entweder nur 0 oder 1 sein, also Sie alle, dass Präzision zu verlieren. Aber am Ende, wenn Sie zurückkommen, erhält automatisch als ganze Zahl zurück gesendet. Damit Sie nicht zu tun brauchen dass Gießen sich. Also das war die Antwort auf Diese Frage, die Zahl 7. Alle anderen Fragen zu Quiz: 0? Ja, Annie. ANNIE: Wann verwenden wir rekursive - Wann verwenden wir iterative Schleifen? JASON HIRSCHHORN: Wann verwenden recursive - so generell die Vor-und Nachteile gegenüber der Rekursion eine iterative Vorgehensweise. Kann jemand bieten eine Profi oder con? Bitte? Nicht jeder kann. Wer kann eine Pro-oder eine con bieten? [PAPIER Rascheln] STUDENT 1: Rekursive weniger Codierung - weniger Tipp? JASON HIRSCHHORN: Also in der Regel, Rekursion vor allem eine Funktion - oder ein Algorithmus wie Merge Art - das selbst verleiht einer rekursiven Ansatz - könnte einfacher sein rekursiv zu codieren. Und mehr Sinn machen um es rekursiv zu tun. So, dass wäre ein Profi sein, um Rekursion. Andere? Ja? STUDENT 2: Con Rekursion - Es verwendet mehr Speicher. JASON HIRSCHHORN: Also genau richtig. Eine rekursive Funktion zu halten indem Stack-Frames auf den Stapel. Also, wenn Sie auf eine Menge von Betriebs sind Zahlen und müssen dies nennen funktionieren viel, dann werden Sie sicherlich mehr Speicherkapazität, während einen iterativen Ansatz wird nur setzen ein Stapelrahmen auf den Stapel, weil alles geschieht innerhalb einer Funktion. Alle anderen Vor-und Nachteile? Ja. STUDENT 3: Vor-Rekursion. Sie haben nicht zu bestimmen, in voranzubringen, wie oft die Code wiederholt werden mußte. Sie können eine vorbestimmte Anzahl aufweisen Zeiten, die Sie durchlaufen, dann haben Rekursion ist besser, weil es nimmt dieses Ergebnis. JASON HIRSCHHORN: Ich denke, das ist wahr. Aber ich denke, in beiden Fällen Sie würde nie - Sie würde wahrscheinlich einige Eingabe von dem Benutzer. Oder diese Funktion wäre eine Eingabe haben , die bestimmen, wie oft es laufen soll. So allgemein, würden Sie nicht hart codieren - sogar in einem iterativen Ansatz - wie viele Male, die Schleife ausgeführt werden soll. Haben Sie eine andere waren Sie haben denken, Annie? OK. Das sind also wahrscheinlich die zwei - der größte Pro-und die größte con einer rekursiven gegen eine iterative Vorgehensweise. OK. Alles andere Quiz auf 0? Gehen wir weiter. Datei-I / O. Es ist eine wunderbare Kurz in dieser Woche auf Datei-I / O, die hoffentlich Sie mehrere beobachtet haben Zeiten und bewundert. Eine Menge Arbeit ging in das, und ich habe gehört, es ist wahnsinnig hilfsbereit. Ich auch auf den Link auf dieser Folie, falls Sie nicht schon einmal eine Chance, es zu beobachten 10-mal. Also, werden wir kurz über das gehen wichtige Schritte zur Öffnung und Arbeits mit Dateien, und dann werden wir tauchen in eine Codierung Problem vor Prüfung des Problems Set. Also noch einmal, ich werde dies auf setzen der Bildschirm, aber ich werde für sprechen nur eine Minute über das, was wir sind denn hier mit Datei I/O-- was bedeutet das? Das heißt, wir schaffen unsere Programme, und dann haben unsere Programme exit ein, und keine Auswirkungen auf gemacht haben die Welt außerhalb unseres Programms. Aber wenn wir die Arbeit mit Dateien - Lesen sie sowohl in und die Schaffung von sie - können wir eine gewisse Wirkung auf die haben Welt außerhalb unseres Programms. Genau wie wenn Microsoft Word nicht in der Lage , um alle Word-Dokumente zu machen, dann einmal Microsoft Word zu beenden, alle Ihre Arbeit gegangen wäre, und es wäre wirklich nutzlos. Wir wollen schließlich in der Lage zu sein, Programme schreiben, die beeinflussen, kann die Welt um sie herum, die beide durch die Aufnahme von komplexe Eingänge - in Bezug auf die Dateien und über Dateien, aber auch für interessante und überzeugende Ausgänge - in Bezug auf die verschiedenen Arten von Dateien. Also das ist, warum wir beginnen, lernen, wie man mit Dateien zu arbeiten. Genauer gesagt, was wir tun, ist wie folgt. Es ist sehr einfach. Es sind nur ein paar Schritte, und sie werden hier auf diesem Code aufgeführt. So werden wir zu durchlaufen dieser Code Zeile für Zeile. Zunächst sehen Sie, hervorgehoben - wenn Sie mit einer Datei arbeiten, unabhängig von der Art von Datei es sich handelt, Sie brauchen, um es zu öffnen. Und das ist mit einem Aufruf von fopen - hier richtig. Sie enthalten den Namen der Datei. Wenn sich die Datei nicht im Verzeichnis, oder den Ordner, in dem dieses Programm Leben, dann müssen Sie auch gehören ein Weg, wo die Datei ist. Wir gehen davon aus, dass diese Datei "test.txt" - ein einfaches Textdokument - ist in der gleichen Ordner wie dieses Programm ist. Also das ist eine andere Sache zu halten Geist -, dass, wenn Sie eine Datei öffnen möchten irgendwo anders, die Sie tatsächlich benötigen seiner Lage sind. Zweitens können Sie ein Argument übergeben fopen, und das ist, was Sie tun möchten, mit der Datei. Es gibt drei Hauptargumente, dass Sie gehen, um passieren zu fopen. Wer kann mir diese drei geben? Wer kann mir eine von ihnen geben? Ja. STUDENT 4: Der Dateiname? JASON HIRSCHHORN: Es tut uns leid. Die drei wichtigsten Argumente, die Sie weitergeben können wie das zweite Argument von fopen. Du hast Recht - der Name der Datei ist das erste Argument. Aber das zweite Argument von fopen sind Regel drei Saiten und - ja. Aleja. ALEJA: A für Anfügen. JASON HIRSCHHORN: A, wenn Sie wollen hängen, um eine Datei, die bereits vorhanden ist. STUDENT 5: R für Lese. JASON HIRSCHHORN: R, wenn Sie will aus einer Datei zu lesen. STUDENT 6: W für Schreiben. JASON HIRSCHHORN: Und wenn Sie w wollen, in eine Datei zu schreiben. Also in diesem Fall, wir schreiben zu der Datei, so haben wir w. Sie öffnen es, haben Sie auch zum Speichern der Datei irgendwo, und das ist mit der Code auf der linken Seite von der Zuweisungsoperator - Ich erstelle einen Zeiger auf eine Datei genannt wird, in diesem Fall benötigt. Wir sind nicht zu kümmern, was diese alle Kappen FILE Sache ist. Es genügt zu sagen, es ist ein lang Strom von Nullen und Einsen. Und das ist, wie wir zu gehen betreiben und zu verstehen. Das nächste, was wir tun müssen - und Das ist unglaublich wichtig - wenn Sie eine Datei öffnen - in der Tat, wenn Sie malloc nennen, für Beispiel und etwas Speicher und versuchen und speichern Sie es in einem Zeiger, kann man immer prüfen wollen, um sicherzustellen, dass die Funktion nicht null zurück. Also in diesem Fall werden wir die Überprüfung zu machen sicher, dass wir das tatsächlich geöffnet Datei korrekt, und es gab kein Fehler im Programm. Weiter, sobald wir überprüft, um sicherzustellen, dass dass wir eine Arbeitsdatei, können wir schreiben oder lesen aus, oder hängen Sie auf die Datei. In diesem Fall bin ich einfach Druck eine Zeile in diese Datei. Wie kann ich das wissen? Nun, ich bin mit dieser Funktion fprintf genannt. Alle Funktionen werden Sie mit beim Schreiben oder Lesen, oder Manipulieren von Dateien ähnlich zu sein Funktionen, die Sie bisher gesehen haben, aber beginnen mit dem Buchstaben F, Stehen für Datei. Und fprintf, im Gegensatz zu unseren normalen Druck app, nimmt ein zusätzliches Argument, und das ist die Datei, in der Sie um diese Zeile zu drucken. Ich habe nichts zu das Recht der ohai. Ich habe nicht die dritte Argument von printf - oder das zweite Argument von printf, die dritte Argument fprintf, weil ich haben keine Platzhalter hier. Ich bin nicht wie alle Variablen. Aber noch einmal, fprintf und all diese Datei Funktionen, die mit Dateien operieren werden in der Regel gehen, um die Datei benötigen , auf dem sie arbeitet. Schließlich ist das letzte wichtige Sache zu tun ist, um die Datei zu schließen, genau wie mit - wann immer wir etwas malloc, wir etwas zu befreien, damit wir nicht wollen haben ein Speicherleck - wir wollen unsere Datei zu schließen. Wenn dieses Programm beendet wurde, ohne Schließ die Datei, stehen die Chancen gar nichts gehen würde falsch, vor allem wenn es war eine kleine Datei. Aber es ist sicherlich eine gute Codierungsstil und Praxis, um die Datei immer nahe wenn Sie es fertig. Das ist also die Grundlagen der Datei-I / O. Sie haben wahrscheinlich gesehen, dass vor, oder sah es in diesem fantastischen kurz. Hat jemand irgendwelche Fragen haben, bevor wir in eine Praxis gehen Codierung Probleme, über Datei-I / O oder die Schritte, die ich ging einfach vorbei? [SCHREIBT SOUNDS] JASON HIRSCHHORN: Haben Sie habe eine Frage, Avi? AVI: Nein. JASON HIRSCHHORN: OK. Ich werde einen anderen warten 7 Sekunden. [Lacht] Das ist ein wirklich guter Tipp. Ihr seid einfach nicht, wie Fragen zu stellen. Das ist in Ordnung. OK. Also unsere erste Praxis Problem ist, wir sind gehen, um die Funktion zu duplizieren ein Kommandozeilen-Tool, das Sie wahrscheinlich Kopie - vor verwendet - die Kopie-Tool. Wenn Sie geben cp und dann geben sie zwei Argumente in die Klemme, können Sie Kopieren einer Datei. Und das ist, was wir bis jetzt schreiben. Also noch einmal, Ablesen dieser Folie, würde ich Sie ein Programm, das dauert zu schreiben zwei und nur zwei Befehlszeilen Argumente - eine Quelldatei und eine Zieldatei - und kopiert den Inhalt des Quell Datei in die Zieldatei ein Byte zu einem Zeitpunkt. Also das ist eine Menge, um zu bitten. Auch hier ist ein guter Ansatz, dies zu nicht direkt zu den C-Code, aber brechen sie in ein paar Schritte. Zuerst denken über die Logik - genau was ich frage, was Sie tun - und zu verstehen, die alle Schritte, um dieses Problem. Nicht in C, nur in einigen Pseudocode, oder sogar ein mentales Modell , was los ist. Weiter, sobald Sie den Pseudocode nach unten, herauszufinden, wie der Pseudocode Karten auf Werkzeuge und Dinge, die wir haben gelernt, in C verwenden Und schließlich, einmal haben Sie alles, was zusammen, können Sie das Problem zu codieren. Werden 5 bis 10 Minuten arbeiten an diesem Problem. Ich werde die Anweisungen setzen wieder in einer Sekunde. Und dann werden wir gehen über der Pseudocode und Code sie als Gruppe zu leben. Wenn Sie Fragen haben, während Sie Arbeit an diesem, können Sie erhöhen Ihre Hand, und ich werde kommen um und beantworten. STUDENT 7: Kann ich swipe ein Stück Papier? JASON HIRSCHHORN: Was ist los? [SCHREIBT SOUNDS] JASON HIRSCHHORN: OK. Lassen Sie uns über die Pseudo gehen zuerst, und dann werde ich Ihnen ein paar mehr Minuten zu beenden Codierung. Wer möchte mich beginnen mit der ersten Zeile Pseudocode für diese Funktion? STUDENT 8: Stellen Sie sicher, dass Sie wurden zwei Dateien angegeben. JASON HIRSCHHORN: OK. Und wenn wir nicht? STUDENT 8: Ich würde 0 zurück. JASON HIRSCHHORN: Sollten wir 0 zurück? STUDENT 8: Rückkehr ein - Stanzen. Entschuldigung. JASON HIRSCHHORN: Ja. Wahrscheinlich nicht null. Da 0 bedeutet, alles war gut. OK. Also das ist die erste Zeile von Pseudocode. Wer hat die zweite Zeile der Pseudocode? STUDENT 9: Öffnen der Dateien? JASON HIRSCHHORN: Öffnen Sie beide Dateien. OK? STUDENT 10: Überprüfen Sie, wenn die Datei NULL? JASON HIRSCHHORN: Überprüfen Sie, sicher, dass weder NULL sind. Nebenbei - Schrägstrich 0 - ist, dass NULL? STUDENT 11: Nein. JASON HIRSCHHORN: Das ist nicht NULL. Das nennt der NULL-Terminator. Es ist eigentlich nur mit einem l geschrieben. So etwas gegen die Überprüfung, dass - das ist eigentlich ein Zeichen - so, dass etwas gegen die Überprüfung wird nicht die gleiche wie die Überprüfung, ob es gleich NULL. Und einige Leute - auf ihrem Quiz und ihr Problem Sets - haben die bekam zwei von denen zu verwechseln. Aber die zwei von denen sind in der Tat anders. Ein endet einen String - einer ist ein Zeiger auf 0 gesetzt. STUDENT 12: Warum würden Sie nicht zu überprüfen, stellen Sie sicher, dass die Dateien nicht NULL bevor Sie sie öffnen? JASON HIRSCHHORN: Also spart offen etwas in dieser Datei. Und wenn Sie wieder hier gehen - so dass diese Linie - fopen - geben Sie eine Adresse und speichern die Adresse in der Datei, wenn es funktioniert. Wenn es nicht funktioniert, ist es NULL speichern - STUDENT 12: Oh. OK. Haben Sie. JASON HIRSCHHORN: In Datei. Sie können also nicht auf NULL überprüfen bevor Sie sie geöffnet haben. NULL bedeutet, etwas nicht richtig. OK. So stellen Sie sicher, weder heißt? Oder sind? Was denken wir? Wir werden mit dem gehen. STUDENT 13: Ist. JASON HIRSCHHORN: Ist? Weder ist? STUDENT 13: Ist. JASON HIRSCHHORN: OK. Wir scheinen einige haben Konsens, dass. Weder ist NULL. OK, nächste Zeile des Pseudocode. Wer hat mir eine noch nicht gegeben? Wir werden auf dich warten. Ja. STUDENT 14: Sie haben zu lesen von der ersten Datei? JASON HIRSCHHORN: OK. STUDENT 14: Oder wir verwenden fscanf oder so etwas wie, dass die erste Datei? JASON HIRSCHHORN: Also wir wollen von der ersten Datei zu lesen und - sagen wir, dass hier richtig. Lesen Sie aus der Quelldatei. Und dann, was machen wir, nachdem wir tun aus der Quelldatei zu lesen? Jemand anderes? STUDENT 15: Schreiben in die Zieldatei? JASON HIRSCHHORN: Wir schreiben die Zieldatei und - OK. Was sonst fehlt uns? Jemand anderes, der mir nicht gegeben hat Codezeile noch - der Pseudocode. Ja. STUDENT 16: Vielleicht können Sie immer überprüfen ob es etwas zu lesen, wie die nächste Zeile? Das sind, wie in der nächsten Zeile, sehen, wenn es vorhanden ist. [ELECTRONIC BEEP] JASON HIRSCHHORN: Oops. Das ist mein Journaling-Software. Ja? STUDENT 16: Ja. JASON HIRSCHHORN: So geben es mir noch einmal. STUDENT 16: Prüfen Sie, ob es immer noch eine nächste Zeile aus der Quelldatei zu lesen. JASON HIRSCHHORN: OK. Also haben wir nicht gerade liest Zeilen - Lesen von Bytes wurden hier - aber du bist richtig. Wir wollen zu lesen und zu schreiben, bis gibt es keine weiteren Bytes. OK. Und so sollte diese wirklich eingerückt sein ein bisschen, weil sie unter da sind. Right? Bis wir von Bytes sind, werden wir aus der Quelldatei lesen und schreiben in die Zieldatei. Und dann, was ist das letzte Linie der Pseudocode? Jemand, der nicht gegeben ist mir etwas vor. STUDENT 17: Schließen der Dateien? JASON HIRSCHHORN: Genau. Schließen Sie die Dateien. So gibt es unsere Pseudocode. Ich werde den Pseudocode kannst gedit, und in ein paar Minuten haben wir wird diese zusammen zu codieren. OK. Lassen Sie uns als Gruppe zu beginnen. Nishant, habe ich meine neue Datei. Ich habe gerade dieses oben geöffnet. Untitled Dokument ein. Was ist das erste, was ich tun soll? Nishant: Fügen Bibliotheken? JASON HIRSCHHORN: OK. Welche Bibliotheken? Nishant: stdio.h, stdlib.h, glaube ich? JASON HIRSCHHORN: OK. Was ist für stdlib? Nishant: Ich habe vergessen. JASON HIRSCHHORN: OK. So gehören Stdio. Was soll ich tun, noch bevor Ich Programmieren beginnen? Nishant: Schreiben Sie eine Kopfzeile? JASON HIRSCHHORN: Wie bekomme ich es farbig? [Zwischen VOICES] Nishant: Wie bekommt man es farbig? JASON HIRSCHHORN: Wie ich Farbcodierung? Nishant: Ich weiß es nicht. Oh. Speichern. JASON HIRSCHHORN: Sparen. Ja. Ich sollte es als eine. C speichern. So speichern Sie es auf dem Desktop als cp.c. Süße. Und wenn ich voller Stil erhalten Punkte, was ich sollte sind an der Spitze? Nishant: Sie könnten Ihren Namen, den Namen zu schreiben des Programms, und der Zweck des Programms als auch? JASON HIRSCHHORN: Sieht gut aus. Excellent. So können Sie uns perfekt ab begonnen haben. # Include - wir auch schreiben - OK. Also ich glaube, ich bin ganz eingestellt, um zu gehen. Wer hat die erste Codezeile für mich - oder die ersten Zeilen Code, die es dauert, bis unser erstes erfüllen Kommentar in Pseudocode? Sie. STUDENT 18: Sollte es nicht int sein argc und dann char * argv? JASON HIRSCHHORN: Ich denke, Sie haben Recht. Wir ändern es zur Haupt, offene paren int, int argc, Komma, char * argv? Wie das? STUDENT 18: Träger. JASON HIRSCHHORN: Träger. Klammer auf, Klammer zu, Nähe Elternteil. Perfect. Jetzt kann ich Kommandozeilen-Argumente zu nehmen. OK. Stellen Sie sicher, wir sind zwei Dateien angegeben. Sie können mir das auch zu geben. STUDENT 18: Wenn argc - dieses nicht gleich drei. JASON HIRSCHHORN: Wenn offene paren argc nicht gleich drei? STUDENT 18: Ja, Sie zurück 1 oder nichts. JASON HIRSCHHORN: Es tut uns leid. STUDENT 18: Zurück 1 oder nichts. JASON HIRSCHHORN: Zurück 1. OK? Große. Öffnen Sie beide Dateien. Wer kann mir helfen, beide Dateien zu öffnen? Wer hat mir Code nicht gegeben noch? Kurt? KURT: Also alle Kappen F-I-L-E-Sterne Quelle. JASON HIRSCHHORN: Ich werde , nehmen Sie die Vokale. Die sind cool. Es ist wie Tumblr. STUDENT 18: Gleich fopen - JASON HIRSCHHORN: Gleich fopen? STUDENT 18: Open paren, argv, offene Bügel. JASON HIRSCHHORN: Warten. Entschuldigung. Offene paren. OK. STUDENT 18: Ja. Argv Unter ein. JASON HIRSCHHORN: Sub 1? STUDENT 18: Ja. Argv Klammer auf 1 - Ja. Und dann Komma, und öffnen Sie dann doppelt Zitat, r, doppelte Anführungszeichen, close paren, Semikolon. JASON HIRSCHHORN: Süße. Und was ist mit den anderen? STUDENT 18: Sehr ähnlich, aber statt von S-R-C, Sie es nennen würde D-S-T. JASON HIRSCHHORN: Oo! Ich mag diese. STUDENT 18: Nur D-S-T. Ja. Und dann argv, offene Klammer, 2. Ja. Und dann w anstelle von r. Ja. JASON HIRSCHHORN: Großartig. Weiter paar Zeilen. Auch, wenn jemand Dinge zu fügen hat Linien, die wir getan haben, fühlen sich frei, fügen Sie diese ebenfalls. Stellen Sie sicher, weder NULL ist. Wer kann mir den Code muss ich geben erfüllen diese Linie von Pseudocode? Archer. Archer Wenn src gleich equals NULL oder dst gleich equals NULL, dann zurück - JASON HIRSCHHORN: Was? Archer Return 2? JASON HIRSCHHORN: Return 2. Also, wenn offene paren src gleich ist gleich NULL, oder - was auch immer das thing's - Rohr? Rohr? Wir nennen Rohr. Rohr, Rohr, dst gleich equals NULL zurück 2. OK? Bis wir von Bytes - wir haben irgendwie übersprungen dieser Schritt von der Pseudocode Teil werde hier. Aber bis wir von Bytes - was klingt das wie? Welche Art von C-Struktur - aber ich glaube nicht das Wort Struktur, da werden wir beginnen mit dass in anderen Fällen - aber C-Werkzeug hört sich das aus? STUDENT 19: Eine Schleife. JASON HIRSCHHORN: Eine Schleife. Klingt wie eine Schleife. Also, wer mir die erste Zeile geben kann der Schleife Code hier richtig? Sie können auch wählen, welche Art von Schleife Sie wollen, wenn Sie mir diese Codezeile. Es gibt drei Arten. Sie erhalten zu holen. Ich würde vorschlagen, eine von denen. Avi. Welchen wollen Sie? AVI: FÜR. JASON HIRSCHHORN: FOR. AVI: int i gleich Null ist. JASON HIRSCHHORN: OK. AVI: Dieser Teil ich bin mir nicht sicher. Aber ich weniger als Größe von Sterne-Quelle? Ich bin mir nicht sicher. JASON HIRSCHHORN: OK. AVI: Weil Sie wollen, dass die Größe einer Datei, oder? JASON HIRSCHHORN: Also das wird wahrscheinlich nicht geben Sie die Größe des tatsächlichen Datei in Bytes. Also, was sollten wir sonst tun? Was eine andere Art von Schleife? Oder sollten wir bleiben mit der FOR-Schleife? STUDENT 20: Können Sie eine while-Schleife zu tun? Und dann, was Sie tun würden, ist du würdest - weil wir ein char * für die Datei. Also, wenn wir nur halten, dass Erhöhen bis wir würden das NULL-Zeichen finden Sie unter das Ende vom Lied? Oder nein, das ist nicht, wie die Dateien zu arbeiten? JASON HIRSCHHORN: Also wir halten können Erhöhen des char * bis wir die NULL - STUDENT 20: Im Wesentlichen weitermachen Zeichen für Zeichen, bis wir treffen das Ende der Datei. JASON HIRSCHHORN: Ja. Also das ist, was wir tun wollen. Wir wollen das Lesen, Charakter behalten von Zeichen, bis wir bekommen das Ende der Datei. STUDENT 20: Ja. Suchen - was ist der End-oder Stop-Schild am Ende einer Textdatei. JASON HIRSCHHORN: OK. Also, wenn wir an das Ende der Datei erhalten - wie wir wissen, haben wir erreicht haben das Ende einer Datei? Wenn ich rufe - also lasst uns einen Schritt zurück. Was ist eine Funktion? Lassen Sie uns auf dieser Linie gehen hier richtig. Lesen Sie aus der Quelldatei. Wer kann mir diese Zeile Code geben? STUDENT 21: fscanf? JASON HIRSCHHORN: fscanf. OK. Was, wenn ich zu lesen, sehr gesagt, ein Byte? STUDENT 21: Ich weiß es nicht. JASON HIRSCHHORN: OK. Noch einfacher als fscanf - was ist ein - Ich möchte aus einer Quelldatei zu lesen? Lesen aus einer Quelldatei. Was ist eine Funktion - ja. STUDENT 22: Es ist fread? JASON HIRSCHHORN: Fread. Ich denke, dass wir mit Stick dass man für den Moment. Welche Argumente hat fread nehmen? STUDENT 22: Wahrscheinlich der Dateityp, und dann Position in der Datei? JASON HIRSCHHORN: Was kann ich geben hier um herauszufinden, welche Art von Argumenten fread nimmt? Mehrere Schüler: Mann fread. JASON HIRSCHHORN: Mann fread und fwrite. Sieht aus wie sie zusammen hängen. So fread nimmt, wie viele Argumente? STUDENT 23: Four. JASON HIRSCHHORN: Es dauert vier Argumente. Es dauert einen Zeiger, eine Größe, und das Ding, das ist seltsam, und einige Datei. OK? Lassen Sie uns darüber lesen Sie hier. "Die Funktion fread liest n memb Elemente von Daten, jede Größe bytes lang, aus dem Strom, auf den Stream und speichert sie in der Lage durch den Zeiger angegeben. " Also vier Argumente. Warum ich nicht einfach kopieren Sie diese, und fügen Sie es gleich hier. OK. Also, wer kann beginnen Ausfüllen diese Argumente für mich? Avi. AVI: Nehmen Sie die Leere. Setzen Sie einfach src. Nehmen Sie Zeiger und den Stern. Setzen src. Dann - JASON HIRSCHHORN: Also ich werde aufhören Sie gibt, denn das ist falsch. Du hast Recht mit src, aber wo soll src gehen? [Zwischen VOICES] JASON HIRSCHHORN: Es sollte gehen hier. Das ist der src - unsere src ist ein Typ. Lassen Sie uns hier. Dies verlangt nach einem Typ FILE *, wir tatsächlich in der Regel sehen sie so. Also das verlangt nach einem Argument von Typ FILE * genannt Bach, der src ist. OK? Welche Größe der Dinge zu tun wir wollen, zu lesen? Habe ich Ihnen diese in der Problembeschreibung. TEILNEHMER 24: ein Byte zu einem Zeitpunkt. JASON HIRSCHHORN: Ein Byte. Wie groß ist ein Byte? Seine Größe ist in Bytes, also was kann ich genau dort? STUDENT 25: One. JASON HIRSCHHORN: Eins. Richtig. Seine Größe ist in der Einheit Byte, 1, so ist 1 Byte. Wie viele will ich zu einer Zeit, zu lesen. STUDENT 26: One? JASON HIRSCHHORN: Eine Sache. Ich möchte eine Sache der Größe lesen 1, einen Bissen zu einer Zeit. Und wo ich es, wenn ich es gelesen? STUDENT 27: Reiseziel? JASON HIRSCHHORN: Also ich kann nicht es gerade in Ziel. STUDENT 28: Sie sind gonna put in einem dritten Zeiger? STUDENT 27: Um das Ziel. JASON HIRSCHHORN: OK. Ja. STUDENT 29: Sie können so etwas zu erklären, wirken als ein Zwischenspeicher früher. JASON HIRSCHHORN: OK. Gib mir, dass. STUDENT 29: Eine weitere Datei Zeiger, vielleicht? JASON HIRSCHHORN: OK. Also das ist nichtig star - es ist eine Art Leere Sterne, damit es nicht muss ein Dateizeiger sein. Und wenn ich lese ein Byte, wo wäre ein guter Ort sein ein Byte zu speichern? STUDENT 29: Ein Array? JASON HIRSCHHORN: Ein Array. OK. Und was es sonst noch etwas, das ist Größe nur ein Byte? STUDENT 30: Ein char *? STUDENT 29: Ja. JASON HIRSCHHORN: Ein char * ist ein Byte. STUDENT 29: Ein char. JASON HIRSCHHORN: Ein char ist ein Byte. Right? So nennen wir diesen Puffer ist eine generische Namen für diese Dinge zu speichern verwendet vorübergehend etwas. So erstelle ich einen Puffer. Right? Aber es dauert eine void *. Also vielleicht haben Sie Recht, dass es sollte ein Puffer der Größe 0 sein. So speichert er ein - rechts. Da dies hier - char Puffer ein Charakter, aber das dauert ein void * - ein Zeiger. So konnte ich das tun und jetzt Puffer ein Zeiger ist. Was könnte ich tun? STUDENT 31: Setzen Sie einen Stern neben char. JASON HIRSCHHORN: Ich konnte erstellt es char *. OK. Was ist eine andere Sache, die ich tun könnte? Oder lassen Sie uns mit diesem zu gehen. Char * buffer, so was stelle ich hier? STUDENT 31: Puffer. JASON HIRSCHHORN: Puffer. Buffer ist ein Zeiger auf ein char. Und an dieser Stelle, wir setzen ein Byte etwas, was wir gelesen haben. Ja. Avi. AVI: Nur eine kurze Frage. Möchten Sie Puffer malloc? JASON HIRSCHHORN: Wer kann diese Frage beantworten? STUDENT 32: Nun, es ist nicht wirklich Punkt, alles gerade jetzt, so - JASON HIRSCHHORN: Aber tun wir wollen es malloc? STUDENT 32: Wenn Sie es tun, war, dass So, ich denke, ja, denn man braucht einige Platz für sie zu zeigen. JASON HIRSCHHORN: Wollen wir haben, um es malloc? STUDENT 33: Wenn Sie vorhaben, verwenden, außerhalb der Schleife. JASON HIRSCHHORN: Werden wir verwenden Sie es außerhalb der Schleife? STUDENT 34: Ja. STUDENT 35: Warten. Wollen wir es erklären wollen in der Schleife, über? JASON HIRSCHHORN: Also ich denke, wir haben einige Pseudo WHILE-Schleife hier, dass wir versuchen, herauszufinden,,, dass haben wir nicht noch gekommen. Wir brauchen nicht, um es zu malloc. Wir sind in den wichtigsten Betriebs, wird es nur noch innerhalb dieser Schleife verwendet werden. Es muss nicht existieren außerhalb dieses. So kann es eine lokale Variable sein. Sie haben einen Zeiger auf eine lokale Variable. STUDENT 36: Aber es ist nicht zeigt auf etwas. JASON HIRSCHHORN: Nein, ist es nicht etwas initialisiert. Aber wir sind nicht dabei, es auch zu verwenden. Wir werden etwas setzen es das erste Mal benutzen wir es. Damit scheint OK. Also haben wir nicht malloc brauchen hier. Und ich denke, es ist OK, wie es ist. OK. Wir haben die fread Linie. Lassen Sie uns die nächste Zeile. Wenn wir in eine Datei zu schreiben, was ist eine gute Funktion zu verwenden, um das zu tun? STUDENT 37: Fwrite? STUDENT 38: fprintf? JASON HIRSCHHORN: fprintf ist eins. Was ist ein anderes? STUDENT 39: Fwrite. JASON HIRSCHHORN: Fwrite. Und für unsere Zwecke, fwrite, die wir hier gesehen haben, ist wahrscheinlich die bessere Wahl. Es dauert vier Argumente auch. Nishant, kann Ihnen mir die Argumente? Nishant: Die erste geht nur Puffer sein. JASON HIRSCHHORN: OK. Nishant: Die zweite der nur gehen, um 1 sein. Drittens geht um eine 1 sein. Und das vierte wird sich dst sein. JASON HIRSCHHORN: Hat jemand Fragen zu dieser Linie? Das sieht gut aus. OK. So, jetzt sieht es aus wie das, was wir sind fehlt - eigentlich schreiben wir diese letzte Zeile. Schließen Sie die Dateien. Wer kann uns schriftlich beenden diese beiden letzten Zeilen? Ja. Sorry, was ist Ihr Name? LUCY: Lucy. JASON HIRSCHHORN: Lucy. LUCY: Fclose src und dann fclose Ziel. JASON HIRSCHHORN: Fclose, offene paren, src, in der Nähe paren, Semikolon. Und fclose - ja? LUCY: Open Klammern, dst und dann Semikolon. JASON HIRSCHHORN: Großartig. Und was soll ich am Ende sind? LUCY: Return 0. JASON HIRSCHHORN: Return 0. Muss ich? Nur eine Frage. Müssen wir return 0 enthalten? Mehrere Schüler: Nein JASON HIRSCHHORN: Nein Haupt tut es automatisch wenn Sie bis zum Ende erhalten. Aber ich denke, es ist schön, sind explizit. Vor allem, wenn wir anderen zurück Dinge während des gesamten Programms. OK. Dies ist, was wir verpassen - Während das, was? Wer kann einige denken - hat ein Gefühl von dem, was die Dinge könnte es gehen? Auch wenn es nur in einigen Pseudo wie die Sprache? Was sind wir wirklich - was wollen wir bis zu gehen? Ja, Lucy. LUCY: Das Ende der Datei. JASON HIRSCHHORN: Das Ende der Datei. Also, was meinst du mit Ende der Datei das? LUCY: Nachdem Sie das erreichen Ende der Datei, zu stoppen. JASON HIRSCHHORN: OK. Also noch erreichen wir das Ende der Datei. Wie können wir wissen, wann wir erreicht haben das Ende der Datei? STUDENT 40: Ich denke, Puffer auf NULL gesetzt werden. STUDENT 41: Puffer erklärt innerhalb der Schleife. JASON HIRSCHHORN: Sie glauben also, Puffer wird auf NULL gesetzt werden. Warum sollte Puffer auf NULL gesetzt werden? STUDENT 40: Denn wenn Sie fread, die Sie versuchen zu setzen sind nichts in den Puffer. JASON HIRSCHHORN: OK. Also denken Sie fread - wenn wir das Ende erreicht die Datei, was fread tun? Ich denke, das ist die Frage wir haben, um herauszufinden. Was fread tun? Gibt es da NULL in Puffer oder bedeutet es etwas anderes zu tun? Wie können wir herausfinden, was es ist? STUDENT 42: Mann. JASON HIRSCHHORN: Mann. Also schauen wir uns hier. Rückgabewert. Bei Erfolg fread und fwrite die Rückkehr Anzahl der Artikel geschrieben oder gelesen. Diese Anzahl ist gleich der Anzahl von Bytes nur übertragen, wenn die Größe 1 ist. Wenn ein Fehler auftritt, oder das Ende der Datei erreicht ist, ist der Rückgabewert ein kurze Artikel Zahl oder 0 ist. Also für unsere Zwecke, wenn fread Lauf das Ende der Datei und liest aus das Ende der Datei, da ist nichts mehr zu lesen, was es wird, zurückzukehren? STUDENT 43: Zero? JASON HIRSCHHORN: Was? STUDENT 43: Zero? JASON HIRSCHHORN: Null. Es wird null zurück. So wissen wir, dass fread, wenn wir das Ende der Datei erreicht ist, wird auf Null zurück. Wie können wir zu unserem Vorteil nutzen, dass? AVI: Sie können eine Variable außerhalb erklären der Schleife genannt Prüfung. Wenn der Check gleich - für jetzt - ein. JASON HIRSCHHORN: OK. AVI: Und dann können Sie eine IF setzen Aussage direkt nach fread sagen, wenn fread gleich Null - Nr. JASON HIRSCHHORN: Wer Avi kann helfen? AVI: Was ist der Wert von fread zurückgekehrt? JASON HIRSCHHORN: Wir haben gerade ging, dass. AVI: Wie stellen Sie es? JASON HIRSCHHORN: Also es gibt - lassen schauen hier - es gibt einen size_t, der im Wesentlichen eine ganze Zahl ist. So ist eine ganze Zahl zurückgibt. Und in unserem Fall, wird es zurück 1 oder 0 - 1, wenn es eine Sache zu lesen - ein Byte, und 0, wenn wir das Ende erreicht. Also, wenn fread - ja? STUDENT 45: Kannst du nicht einfach den Voll fread (Puffer, 1, 1, src) in der while-Schleife? JASON HIRSCHHORN: So schlagen Sie vor Dabei gibt es in? [Zwischen VOICES] JASON HIRSCHHORN: Halten. So befreien wir uns von dem. So schlagen Sie vor setzen sind fread in there? Was sollten wir auch bewegen wenn Sie das tun wollen? STUDENT 45: Der Puffer außen. JASON HIRSCHHORN: Wir sollten auch verschieben diese hier. STUDENT 45: Aber tut das ständig bewegen Sie ihn nach vorne? [Zwischen VOICES] JASON HIRSCHHORN: OK. Also das ist, was Okshar vorgeschlagen. Wir schaffen unsere Puffer. Wir WÄHREND fread, fwrite dann wir. Gedanken dazu? STUDENT 46: Meine Frage ist nur, würde es tatsächlich den Befehl fread? JASON HIRSCHHORN: Gute Frage. Wenn Sie setzen einen Funktionsaufruf innerhalb einer Bedingung, das tut Funktionsaufruf ausführen? Wir haben Beispiele dafür gesehen. Right? STUDENT 46: OK. Ja. Also es tut auszuführen. JASON HIRSCHHORN: Wir haben Dinge gesehen wie dieser vor, wo wir ein Funktionsaufruf innerhalb einer Bedingung. Heißt das Funktionsaufruf ausführen? Ja. Also die Antwort ist ja. Dieser Funktionsaufruf ausgeführt wird. Aber auch hier ist es, was wir wollen? Was ist eine Art, wie wir herausfinden konnte herauszufinden, ob es was wir wollen? Mehrere Schüler: Führen Sie das? JASON HIRSCHHORN: Wir könnten sie auszuführen. Aber bevor wir das tun, könnten wir auch durch diese Vernunft. Wenn - sagen, wir haben ein Byte in unserem Datei, werden wir Sie zu uns, wir werden auf diesen Code zu erhalten. Das wird laufen. fread wird ein Byte zurück und speichern Sie es in dem Puffer. Und dies wird auf 1 zu bewerten, rechts, nachdem er 1 zurück. So, während ein. Heißt das, den Code in die WHILE-Schleife wird ausgeführt? STUDENT 47: Ja. Es ist wahr. JASON HIRSCHHORN: Ja. 1 gilt. Es ist nicht null. Also der Code innerhalb hier ausgeführt wird. Also werden wir schreiben, dass. Wir kommen wieder, um diese zu bewegen Linie noch einmal. Jetzt haben wir - wir sind am Ende unserer Datei. Wir lesen aus dem Ende unserer Datei denn wir hatten nur ein Byte in sie. Fread 0 zurückgibt, speichert etwas Puffer. Ich weiß ehrlich nicht, was es speichert in Puffer. Wir könnten wahrscheinlich nachschlagen um zu sehen, was es tut. Dass ich weiß ehrlich nicht. Wir wissen nicht, wer was kümmert es speichert im Puffer? Aber es 0 zurück. Und wird WHILE 0 ausführen? WÄHREND 0 wird nicht ausgeführt. So dann werden wir hier unten zu bewegen. Lassen Sie uns also ein Hand wenn diese ist der Code, den wir laufen soll, oder wenn wir sollten Änderungen zuerst tun. Also, wenn Sie denken - man muss stimmen. Wenn Sie denken, wir sollten diesen Code ausführen wie es ist, bitte die Hand heben. OK. Es gibt eine - Sie haben eine Frage, ein Anliegen? Ja. STUDENT 48: Nachdem wir Puffer bewegen außerhalb der Schleife, wir tun haben, um es malloc? JASON HIRSCHHORN: Gute Frage. Nach dem wir uns bewegen Puffer außerhalb des Schleife, wir müssen es malloc? Dies ist ein Umfang Frage. Wenn wir initialisieren Puffer außerhalb dieser Schleife wird es existieren innerhalb der Schleife? Mehrere Schüler: Ja. JASON HIRSCHHORN: Ja. Sein Geltungsbereich erstreckt sich innerhalb der Schleife und, wirklich, alles darunter innen dieser Code, einschließlich der Dinge im Inneren hier. So brauchen wir nicht, um es zu malloc. Es ist eine lokale Variable, und sein Anwendungsbereich enthält immer noch die Schleife. STUDENT 49: Brauchen wir, um es zu befreien? JASON HIRSCHHORN: Wollen wir müssen freien Puffer? STUDENT 49: Ja, wenn wir nicht malloc. JASON HIRSCHHORN: Wollen wir müssen freien Puffer? Wir nicht. Wieder ist es eine lokale Variable, so dass wir nicht brauchen, um es zu befreien. OK. Mal sehen, was passiert. So ist es nicht initialisiert. Das war etwas, das, was Marcus vorgeschlagen früher. So haben wir, dass Fehler, variable Puffer wird nicht initialisiert, wenn verwendet. Wie können wir dieses Problem beheben? STUDENT 50: malloc es? STUDENT 51: Gleich NULL? STUDENT 52: Sagen Puffer gleich NULL. JASON HIRSCHHORN: OK. Sieht gut aus. Wir haben es jetzt. Lassen Sie uns etwas zu kopieren versuchen. So haben wir unsere Textdatei. Wie können wir dieses Programm ausführen? Ja. STUDENT 53: Sie können dot tun Schrägstrich cp test.txt. Und dann können Sie einen anderen Dateinamen was wird es in zu speichern. JASON HIRSCHHORN: OK. Wir nennen es out.txt. Cool? Seg Schuld. Gedanken über die Segmente Schuld? Das ist großartig. Wie können wir herausfinden, wo das Segment Schuld ist? Was? STUDENT 54: Gdb. JASON HIRSCHHORN: Gdb. Wir laufen durch das Schreiben von gdb gdb dot Schrägstrich, der Name Programm. Keine Befehlszeilenargumente gibt. Wir werden ein gesetzt Haltepunkt am wichtigsten. Wenn ich gdb starten, was kann ich tun? STUDENT 55: R. JASON HIRSCHHORN: R. Und was dann? STUDENT 55: Die Argumente? JASON HIRSCHHORN: Dann wird die Befehlszeilenargumente. Lassen Sie uns gehen. N ist gerade dabei mir Zeile für Zeile. Ich werde gehen, bis Ich meine seg Schuld. Es ist meine Schuld Segment. Es sieht aus wie fread verursacht mein seg Schuld. Ich weiß, mein fread verursacht seg Schuld, denn das war die Linie, die wir gerade durchgeführt. Und das einzige, was war geschieht in dieser Linie - zwei Dinge geschehen. Fread los war, und dann waren wir dabei einige während der Überprüfung. Ich bin bereit zu wetten, dass die WHILE Überprüfung war nicht die Ursache meiner seg Schuld. Wahrscheinlich war fread was meine seg Schuld. Ich sehe auch hier etwas, bezüglich memcopy. Speicher zu kopieren. Klingt wie ein Umzug von Speicher einem Ort zum anderen. Klingt wie etwas, was passieren würde, im fread, vielleicht einige Speicher Bewegen von hier bis hier. Lassen Sie uns durch diese gehen wieder. Wie starte ich es über und führen Sie es wieder? Ja. STUDENT 56: Möchten Sie setzen müssen ein kaufmännisches vor Puffer? JASON HIRSCHHORN: Also, bevor Ampersand Puffer würde mir die Adresse geben Puffer, der ein char * ist. Lassen Sie uns über diese noch einmal laufen. Wie kann ich ein weiteres Mal durchlaufen sie? STUDENT 57: Können Sie nur Geben Sie laufen wieder? JASON HIRSCHHORN: Geben Sie einfach wieder laufen. So werden wir nicht zu Führen Sie diese Zeile. So Puffer ist ein NULL-Zeiger. Korrigieren Sie? Es zeigt auf - mal sehen. Wenn wir unsere - ziehen schnell ein Bild davon. Kann jeder sehen, ob Ich schreibe hier? So in dem Stapel, haben wir eine lokale Variable und es heißt Puffer und es ist ein Zeiger auf ein char. Welche Adresse ist das Zeichen an? STUDENT 58: 0x0. JASON HIRSCHHORN: Richtig. Das ist, was das ist. In hier innerhalb Puffer gespeichert 0x0. Das ist, was wir haben - die Setup wir jetzt haben. Also diese Linie, fread, legt etwas von Quelle, wo? In dieses Feld oder dieser Box? Welche Box? Linke oder rechte Box Box? Dieses Recht Feld. Es folgt dem Zeiger, und legt es in hier. Wenn wir versuchen und Touch-Speicher an Stelle 0, was haben wir bekommen? Eine Segmentierungsfehler. Das ist der Fehler, den wir jetzt haben. Ja. STUDENT 59: Haben Sie nicht Sterne-Puffer zu setzen? Oder nicht? Für fread? JASON HIRSCHHORN: Also fread nimmt einen Zeiger. So spielt es im Puffer. Und dann wird es de-reference es irgendwo in fread. Aber noch einmal, wir sahen, dauert es einen Zeiger. Wir brauchen nicht, es weiterzugeben Sterne-Puffer. Das wäre vorbei es, was hier ist. Und das wäre wahrscheinlich geben Sie uns eine Fehler weil wir De-Referenzierung es. Right? Wenn wir de-reference diesen Zeiger, wenn wir versuchen, diesen Ort zu gelangen, wir bekommen eine Fehlermeldung - unsere Segmentation Fault. So - oops. Wir werden von gdb zu beenden. Unsere Linie - unser Problem - ist die richtige hier auf dieser Linie. Und es ist ein Problem, weil dieser Linie. Wie können wir eine Box, die ist in fread zugänglich. Right? Wir müssen eine Box, die eine ist zu schaffen Byte groß, die Größe eines char. Aber wir müssen, dass Feld zugänglich sein wenn diese Funktion ausgeführt wird. Also, wo - ja. Irgendwelche Ideen? STUDENT 60: Einfach gesetzt, jede beliebige Charakter. Just do char buffer Gleichen der Charakter. Und dann, wenn Sie dort Puffer haben - JASON HIRSCHHORN: Warten. Char-Puffer? Also keine Sterne? STUDENT 60: Ja. Nehmen Sie den Stern. Gleich eine zufällige Charakter. JASON HIRSCHHORN: OK. Also geben Sie mir einen. STUDENT 60: Wie ein oder so etwas. Und dann, wenn Sie Puffer haben gibt, verwenden Sie ein - STUDENT 61: Star? Oh nein, das kaufmännische. STUDENT 60: Verwenden Sie das Et-Zeichen. JASON HIRSCHHORN: OK. Und was ist in fwrite? STUDENT 60: Verwenden Sie das Et-Zeichen wieder. JASON HIRSCHHORN: In Ordnung. Also deine Idee ist, dass wir ein Char erstellen und etwas in ihm, und dann schreiben Sie an diesem Zeichen. STUDENT 60: Ja. JASON HIRSCHHORN: Was denken die Leute? STUDENT 62: Es ist gefaltet. JASON HIRSCHHORN: OK. Ziehen wir es aus. Also dieser Zeit, ich werde dies in zeichnen Rot auf dem Stapel hier, und dann werden wir haben - ooh! Entschuldigung. Dieses Mal haben wir die so genannte Puffer, und es ist auf dem Stapel. Korrigieren Sie? Und wir werden es in einem Spar zunächst. Dann haben wir unseren Aufruf fread. Welche fread tut, ist es eine Byte aus unsere Datei und legt sie irgendwo. Es versetzt sie in was auch immer der Sache ist, die auf. Nun, bevor wir diese Adresse - 0x0. Jetzt Welche Adresse haben wir? STUDENT 63: Was auch immer Adresspuffer ist. JASON HIRSCHHORN: Was auch immer Adresspuffer ist. Es ist wahrscheinlich zu sein, so ähnlich. Wahrscheinlich werde mit einem b beginnen und ein f, und dann haben sechs weitere hexadezimalen Ziffern. Spielt keine Rolle. Einige Adresse. Und wir sind vorbei, dass die Adresse in. Und wir werden unseren setzen Byte, was an dieser Adresse. So werden wir unseren setzen Byte, was hier drinnen. Und dann werden wir aus schreiben was ist überhaupt hier drin. Hat jemand irgendwelche Fragen haben, darüber? Wer denkt, dass dieser Code funktioniert? Heben Sie Ihre Hand, wenn Sie denken Dieser Code funktioniert. Sie müssen eine Haltung einzunehmen. Und wer denkt, dass dieser Code nicht funktioniert? Heben Sie Ihre Hand. Alle anderen sollten Anhebung der Hand. OK. Michael, wo stehst du? Michael: Ich kann mich nicht entscheiden. Art der in der Mitte. JASON HIRSCHHORN: Sie sind in der Mitte. Wählen Sie eine. MICHAEL: Ich werde Glauben haben und sagen, es wird funktionieren. JASON HIRSCHHORN: OK. Sie glauben und sagen, es funktioniert? Was ist passiert? [Zwischen VOICES] JASON HIRSCHHORN: Kein Segment Schuld. Wie können wir überprüfen, ob zwei Dinge gleich sind? Zwei Dateien sind gleich. STUDENT 64: Diff. JASON HIRSCHHORN: Diff. Diff Kontrollen für die Unterschiede zwischen zwei Dateien, und wenn er zurück nichts, sie sind identisch. Und wenn wir uns öffnen, bekommen wir unsere Datei. Das war also die richtige Lösung. Werfen wir einen Blick zurück auf sie ein weiteres Mal. Wir haben eigentlich nicht einmal brauchen, um es zu initialisieren. Es wäre wahrscheinlich ein bisschen aussehen Reiniger, wenn Sie nicht setzen etwas zufällig dort. Zu schaffen Der Punkt ist, mussten Sie etwas Platz, um etwas von speichern fread und etwas von fwrite. Und das Ding musste entweder eine lokale Variable auf den Stapel - man könnte etwas Platz malloc'd habe. So haben wir eigentlich könnten geschrieben malloc hier, und das würde gearbeitet haben. Und dann würden wir wurden Speicherung unsere Sachen irgendwo auf dem Heap. Aber das ist eigentlich, wahrscheinlich, die eleganteste Lösung. Erstellen Sie einfach etwas Platz auf dem Stack für diese Dinge zu gehen. Ich hätte zwei andere Kommentare. Wenn Sie wiederum in diese zu nehmen, und waren dann bekommen auf diese hat, meine Kommentare wäre wie folgt. Diese 1 ist hier, zu mir, schauen wie von Zauber Zahlen. Diese 1, in Bezug auf fread, Sinn macht. Das ist die Anzahl der Dinge zu lesen oder zu schreiben. Aber dieser hier sollte wohl etwas anderes sein. Also, was ist eine Lösung? STUDENT 65: Größe Byte. JASON HIRSCHHORN: Wie das? STUDENT 65: Größe der Zeichen. JASON HIRSCHHORN: Größe der Zeichen. Ja, das ist kein Typ Byte. So Größe von char Werke. Wir hätten, an der Spitze unseren Code, # definiert, dass. Genannt etwas BYTE und es ist wirklich ein Zeichen. Eigentlich ein noch besserer Ansatz könnte das gewesen sein - uint. Jeder weiß, was das ist? Entschuldigung. Ich habe es nach hinten. Warten Sie, nein. Welchen Weg geht das? Jeder weiß, was das ist? Ja. STUDENT 67: Angenommen, um die Standardisierung über Dinge, die Systeme haben - wie ganze Zahlen ohne Vorzeichen , die 8 Bytes haben? JASON HIRSCHHORN: Das ist genau richtig. Auf unterschiedlichen Maschinen, von der Größe eines char - Regel nicht ein Zeichen. Chars sind in der Regel ein Byte. Aber die Größe der anderen Datentypen sind verschiedenen Größen auf einem 32-Bit-Rechner im Vergleich zu einem 64-Bit-Maschine. Ein uint8_t ist immer 8 Bit - immer ein Byte. Und ich muss beinhalten, dass int Standard-Header-Datei. So, jetzt, würde dies wohl gewesen sein der beste Weg, um diesen Code zu schreiben. So bekomme ich die magischen Zahlen zu befreien. Und ich habe auch ein logischer Geben Sie für Puffer. Es ist nicht einfach ein Zeichen, das ist ein Byte, das ist das, was wir erwarten, es zu sein. Und hier oben, haben wir eigentlich ein bisschen robuster. Wir sind es nicht, die den Aufruf ein char, - vielleicht, wer weiß - eine andere sein könnte Größe auf verschiedenen Maschinen. Wir sagen, das ist eigentlich genau ein Byte, immer, egal was passiert. Und wenn wir hier sehen, wir machen cp. Uh-oh. Was ist passiert? STUDENT 68: Es könnte eingeschaltet werden. JASON HIRSCHHORN: Was? STUDENT 69: Ist es das? STUDENT 70: Du hast doch nicht definieren sie als eine Art. STUDENT 71: Aber es sollte in Standard definiert werden. STUDENT 72: Was ist los? STUDENT 73: Sollte definieren alle Kappen sein? JASON HIRSCHHORN: Also ist es nicht # define. Eigentlich, in diesem Fall bin ich verwenden wollen typedef. Weil wir sie als eine Art an einem Ort. Also in diesem Fall, die wir wirklich wollen, typedef wie wir Druck eine neue Art Byte, und es ist im Wesentlichen dafür. Es ist ein bisschen anders als # define. Und nun ist unsere Code perfekt. Also, noch einmal, # define nimmt etwas, ersetzt es überall mit der anderen Sache. Es ist nur ein Makro - Kurzformel der magischen Zahlen loszuwerden. Aber in diesem Fall, weil wir Sie es als eine Art - hier - damit, dass die Arbeit, müssen wir zu typedef was Byte ist. Und wir es definieren, genau hier. Es ist nicht eine Struktur, es ist eigentlich nur eine Ganzzahl ohne Vorzeichen. Es ist ein Byte lang. Dieser Code wird online verfügbar sein, und Sie alle sollten es jetzt haben. So haben wir - perfekt - 13 Minuten nach links zu gehen Problem über Set 5. Ich möchte durch copy.c zusammen gehen, und dann werden wir kurz sprechen über die anderen Teile des Problems gesetzt. Also lassen Sie mich nach oben ziehen copy.c. Und das Coole daran ist, wir haben tatsächlich bereits eine Menge von dieser Code geschrieben. Der Code, den wir wörtlich schrieb nur kamen von hier, als ich schreibe dies auf eigene Faust. Aber das ist copy.c, bildet die Grundlage Für die ersten beiden Teile das Problem für whodunit.c, stellen die Sie brauchen, um zu schreiben, und resize.c. Recover.c, die die dritte und letzte ist Teil des Problems gesetzt, ist nicht basierend aus dieser Datei. Sie gehen zu müssen, um die Datei zu schreiben, geben wir Ihnen eine Vorlage für die Datei, aber es hat nichts mit copy.c. tun Aber weil copy.c ist die Grundlage für die ersten beiden Teile, wir gehen , um durch sie jetzt gehen, so haben Sie ein gutes Gefühl dafür, was es tut. Und die Kommentare geben etwas von ihm entfernt. Wir haben schon einige geschrieben. Erstens, sind wir sicher, wir drei Argumente. Als nächstes werden wir die Erinnerung an die Dateinamen. Also diesen Schritt übersprungen, wenn wir wir unser Ding codiert - wenn unsere cp. Aber hier, sie machen es ein bisschen sauberer. Sie sind zu überprüfen, um sicherzustellen, Beide Dateien sind gut, in Zusätzlich zu öffnen. Wir schrieben alle diesen Code gerade jetzt, also bin ich nicht näher auf dieses Codes wohnen. Weiter gibt einige Sachen, die spezifisch ist die Arten von Dateien die wir verwenden, die Bitmap-Dateien sind. Bitmap-Dateien haben einige Metadaten mit ihnen verbunden sind. Also die ersten paar Bytes Ihnen sagen, über die Datei. Sie sind nicht die Farben das Pixel in diesem Bild. Sie sagen Ihnen, über die Datei. Und wenn Sie durch das Problem Satz zu lesen, Sie werden viel mehr Informationen haben, auf welche Arten von Metadaten-Strukturen sind mit Bitmaps enthalten. Aber das ist, warum wir diesen ersten Set - dieser Code hier richtig. Wir lesen die Metadaten - zwei Stücke von Metadaten - die Datei Header und die Info-Header. Und wir werden prüfen einige Teile davon zu sicherzustellen, dass es eine wahre Bitmap-Datei ist bevor Sie fortfahren. Und wieder, das sind Details, die wir müssen nicht jetzt in zu gehen. Wenn Sie über das Problem Satz zu lesen, Sie werden diese zu verstehen. Lange Rede kurzer Sinn, diese werden einfach nur sagen, dies ist eine Bitmap-Datei, und bestätigt, dass. Als nächstes schreiben wir die auf die Datei aus. Wir sehen, dass hier. Wir gehen zum Zeigers schreibt. Als nächstes werden wir die Bestimmung Polsterung. Also noch einmal, wie es mit der Besonderheit, eine Bitmap-Datei, sind einige Linien Polsterung am Ende. Und wenn Sie durch das Problem Satz zu lesen, Sie werden mehr über padding lernen. Das ist die Formel, um Polsterung finden. Wichtig zu erinnern - wenn Sie die Größe einer Bitmap ändern Datei, die Polsterung Veränderungen. Wenn Sie die Größe einer Änderung Datei, die Polsterung Veränderungen. Es ist nie zu sein größer als 3 - es wird 0 bis 3 sein kann, inklusive. Aber wenn Sie die Größe ändern etwas, die Polsterung Veränderungen. Wenn ich nur ein Pixel in dieser Zeile, I müssen drei Bytes der Polsterung, denn jede Reihe hat ein Vielfaches von vier sein Bytes lang in einer Bitmap-Datei. Aber wenn ich es zu verdoppeln, um von einem Pixel gehen zwei Pixel, von denen jedes, sagen wir, ist ein Byte, dann muss ich zwei Bytes der Polsterung zu machen , die gleich vier ist. Also, wenn ich die Größe etwas zu ändern, Ich muss den Betrag ändern Polsterung ich habe. Heißt das Sinn machen, alle? Als nächstes durchlaufen wir in jeder Zeile, oder über alle Reihen. Und dann durch laufen wir jede Spalte in jeder Zeile. Wir behandeln diese wie Bitmap Gitter, wie wir behandelt haben der Vorstand in 15. Wie wir behandelt werden, wenn die Steine wir sie gedruckt auf dem Bildschirm. Ein Raster aus Zeilen und Spalten. Dann - wir sahen dies. Wir haben eigentlich nur diese codiert. Wir haben eine vorübergehende Speicherung. Wir lesen dort, und dann Schreiben wir es aus. Das ist genau das, was wir gerade getan. Weiter, weil ich sagte, jede Zeile endet in einem gewissen Polsterung, wir Überspringen dieser Polsterung - die alte Polsterung. Und dann haben wir es wieder hinzuzufügen. In diesem Fall erstellen wir genau die gleiche Datei. Wir stehen noch kopieren. So ist diese Linie irgendwie albern. Wir konnten buchstäblich nur setzen die Polsterung in. Aber wenn Sie die Größe der Datei zu ändern, Sie wollen immer noch diese Zeile? Also, wenn wir die Größe einer Datei zu ändern, wir überspringen wollen noch über die alte Polsterung? STUDENT 74: Ja. JASON HIRSCHHORN: Also tun wir. Da diese wiederum Angebote mit der Quelldatei. Wir reden nicht über die Polsterung sorgen aus der Quelldatei. Wir wollen in die nächste Zeile zu gehen. Aber wir wollen nicht einfach zurück setzen die alte Höhe der Polsterung. Wir müssen zurück legte die neue Höhe der Polsterung. Also, wenn wir verändern die Größe ein Datei, über die wir überspringen wollen immer noch Polsterung in der alten Datei - was wir lesen gerade in aus. Aber das, was wir zu schreiben, werden wir zu müssen einige andere zurückgestellt Anzahl der Polsterung, die wir haben bestimmt. Ja. STUDENT 75: Die Reihenfolge dieser beiden Linien spielt keine Rolle, oder? Weil du der Handhabung verschiedene Dateien. JASON HIRSCHHORN: Genau. Die Reihenfolge dieser beiden Linien spielt keine Rolle. Wir schreiben diese Linie. Dies ist hier für die Datei wir sind zu schreiben. Das ist wichtig, damit wir die richtige Menge der Polsterung. Das hat mit dem in der Datei umzugehen. Wir wollen Recht überspringen über die Polsterung. Wir wollen nicht zu lesen - wenn wir lesen ein Byte zu einem Zeitpunkt, wir kümmern sich nicht um diesen padding Bytes. Wir wollen in die nächste Zeile zu bewegen. Schließlich genau wie Lucy für uns gegeben hat, wir schließen Sie die Dateien und 0 zurück. Also das ist copy.c. Und wir tatsächlich geschrieben - wir verbrachten die meisten Abschnitt schreibe, im Wesentlichen. Sie machte diese. Also hoffentlich einen guten Sinn haben von dem, was hier los. Der große Unterschied, ehrlich gesagt, ist nur dieser erste Teil, das sich mit Besonderheiten der Bitmap-Dateien. So habe ich, wie meine nächsten Folie, was wollen wir tun? Nun, lassen Sie uns über Krimi denken. Und für jemanden, der durch lesen das Problem eingestellt, was wir tun müssen im Krimi zu tun? Einfach. Aleja. ALEJA: Können Sie den Teil nehmen jedes Pixels, die rot zeigt. Und dann - Art? JASON HIRSCHHORN: OK. So nehmen Sie das Teil von jedem Pixels, die rot zeigt. Das ist nah, aber nicht alles. STUDENT 76: Nun, es gibt verschiedene Möglichkeiten, es zu tun. JASON HIRSCHHORN: OK. Geben Sie mir einen Weg. STUDENT 76: Nehmen Sie alle rot, und dann betonen, die blau und grün. JASON HIRSCHHORN: OK. Also diese beiden Möglichkeiten gegeben - es klingt wie wir es ein Pixel, es hat einen roten, blauen und grünen Ebene. Wir wollen die relativen Pegel ändern die roten, blauen und grünen, je an diesem Pixel. Wo in diesem Code sollten wir ändern die relative rot, blau und grün Ebenen eines gegebenen Pixels. Nachdem wir es zu lesen - bevor wir es zu schreiben? Gib mir die Zeilennummer. Mehrere Schüler: 83. JASON HIRSCHHORN: 83. So finden Sie hier. Für Krimi, der Code, den Sie brauchen Schreib sollten alle gehen recht. Und das ist der einzige Code Sie brauchen, um zu schreiben. Weil, wie wir gehört haben, alles, was Sie brauchen zu tun ist, ändern Sie diese relativ blau, rot, grün und Ebenen von jedem Pixel. Sie haben es zu lesen in, und jetzt bist du gehen, um es zu schreiben. Wie bekomme ich - wenn ich dieses Ding genannten Triple, genau hier, und es ist der Geben RGBTRIPLE - gut, wenn wir in bmp.h sah, was ist RGBTRIPLE? STUDENT 77: Es ist eine Struktur. JASON HIRSCHHORN: RGBTRIPLE ist eine Struktur. Wir sehen, dass hier hin. Und so, wenn ich wollte, den Zugang, sagen wir, die rote Ebene der Struktur, wie kann ich Zugriff auf die rote Ebene dieser Struktur? [CLASS murmelt] STUDENT 78: RGBTRIPLE.rgbtred? JASON HIRSCHHORN: Ist das richtig? STUDENT 79: Es sollte sein Dreifach- Punkt, statt RGBTRIPLE Punkt? JASON HIRSCHHORN: Triple. Dreifach ist der lokale Variable, so hier gibt es keine Zeiger hier. So verwenden wir nur die Punktnotation. Das gibt mir das Niveau der rot. Wenn ich es ändern wollen, ich habe gerade festgelegt sie gleich etwas anderes. Also noch einmal, diese Codezeile zugreift diese Variable in diese Struktur, und wir können es, etwas Neues zu setzen. Also für Krimi, wieder, das ist, im Wesentlichen, was wir tun müssen. Ganz einfach. Ändern Sie einfach einige relativ Ebenen und Dies ist, wo der Code geht. Ändern der Größe auf der anderen Seite, ist ein bisschen schwieriger. In der Tat ist wohl die Größe des schwierigste Teil dieses Problems eingestellt. Wir haben drei Minuten, um über sie gehen. Aber noch einmal, wir bereits geschrieben haben, die meisten von diesem Code, so dass wir sollte recht vertraut sein. Was sind einige der Dinge, die wir tun wollen, um in Größe ändern, wenn Sie über das gelesen habe Problem eingestellt? Wenn Sie sie mir zu geben, haben wir kann über sie zu sprechen. Was sind einige Dinge, die wir tun wollen? STUDENT 80: Vertikal - so muss man horizontal ändern Sie die Größe, aber vertikal ändern Sie die Größe als auch? JASON HIRSCHHORN: Also, wenn uns gegeben ein pixel, und wir wollen es durch eine Größe geändert werden soll Faktor zwei, braucht es nun sein horizontal geändert und in der Größe verändert vertikal. Heißt das Sinn? Ja. Also das ist wohl das größte Herausforderung. Und wir erfahren, dass in einer Sekunde zu sprechen. Ja. STUDENT 81: Die Art, wie ich es gedacht Sie wurde erforderlich, drucken Sie es aus - JASON HIRSCHHORN: Warten. Sie sagen uns nicht, was Sie getan haben. Wir werden in der Logik sprechen. STUDENT 81: OK. Was war die Frage? JASON HIRSCHHORN: Sie haben hob die Hand. Es war keine Frage. Lassen Sie mich präsentieren. Lassen Sie mich nur kurz diskutieren diese. So haben wir ein Pixel, wir wollen replizieren, horizontal und vertikal. Also ideal, was wir hier tun, ist, dass wir in unserer Pixel lesen, schreiben wir es jedoch viele Male. Aber dann haben wir unsere Trick hier, weil dann auf die wollen wir überspringen nächste Zeile und schreiben Sie es auf die Anfang der nächsten Zeile. Wenn wir also beide replizieren möchten horizontal und vertikal, was eine gute Möglichkeit, das zu tun - ein zwar gut, das zu tun? So brauchen wir nicht ständig nach um unsere Datei, um die Dinge zu platzieren. Diese Frage vielleicht nicht haben sinnvoll, aber ich denke, dass ein beantworten, es wird helfen. STUDENT 82: Erstellen Sie ein Array? JASON HIRSCHHORN: Also lassen Sie denken von jeder Datei in einer Reihe. Lassen Sie uns in Bezug auf die Zeilen denken. Wenn wir unsere ersten Reihe aus unserer kleinen Bild, können wir diese Zeile machen in eine große Reihe von einem großen Bild, und replizieren diese Zeile jedoch oft muss sie wiederholt werden, anstatt sich Pixel für Pixel was verwirrend, wenn bekommt Umgang mit Dateien. Weil, wenn wir - Ich aus Platz bin. Wenn das unsere Datei, und wir haben, ein Pixel gibt, und wir wollen es genau dort, wir haben noch einige Dinge Notwendigkeit, dass dort, wenn wir gehen Schreiben und der Erstellung unserer neuen Datei - unsere Datei, die doppelt so groß ist. Aber es ist wirklich schwer mit Dateifunktionen zu überspringen, um neue Zeilen so, und dann wieder hier und die Dinge dort. Es ist fast unmöglich, etwas zu tun so, wenn das Sinn macht. Also, wenn wir in Bezug auf Zeilen denken, können wir nehmen unsere Reihe, und dann legen Sie sie - replizieren Reihen vertikal. Und das ist, wie wir mit der Größenänderung vertikal statt horizontal. Das war irgendwie schnell und ein wenig verwirrend. Leider ist unsere Zeit ist um. Ich werde draußen für die von Ihnen stehen hier, die Fragen über die haben Problem Satz, einschließlich erholen. Also lassen Sie uns jetzt vertagen. Und wieder, wenn Sie irgendwelche Fragen haben, wir können draußen unterhalten.