1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [SECTION 5: weniger komfortabel] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Dies ist CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 So willkommen zurück, Jungs. 5 00:00:11,690 --> 00:00:16,320 Willkommen in Abschnitt 5. 6 00:00:16,320 --> 00:00:20,220 An diesem Punkt, nach Abschluss Quiz 0 und gesehen zu haben, wie du getan hast, 7 00:00:20,220 --> 00:00:25,770 hoffentlich ein gutes Gefühl, weil ich war sehr beeindruckt von den Partituren in diesem Abschnitt beeindruckt. 8 00:00:25,770 --> 00:00:28,050 Für unsere Online-Zuschauer, wir hatten ein paar Fragen 9 00:00:28,050 --> 00:00:33,680 über die letzten zwei Probleme auf das Problem set - oder auf das Quiz, eher. 10 00:00:33,680 --> 00:00:39,690 So werden wir über die wirklich schnell gehen, so dass jeder sieht, was passiert 11 00:00:39,690 --> 00:00:45,060 und wie durch die aktuelle Lösung nicht nur betrachten die Lösung selbst zu gehen. 12 00:00:45,060 --> 00:00:50,330 Wir werden in den letzten paar Probleme wirklich schnell gehen, 32 und 33. 13 00:00:50,330 --> 00:00:53,240 Just, kann wieder so, dass die Online-Zuschauer sehen dies. 14 00:00:53,240 --> 00:00:59,080 >> Wenn Sie Ihr Problem 32, die auf Seite 13 ist wiederum, 15 00:00:59,080 --> 00:01:02,730 13 von 16, liegt das Problem 32 alles über Swaps. 16 00:01:02,730 --> 00:01:05,010 Es ging um das Wechseln von zwei ganzen Zahlen. 17 00:01:05,010 --> 00:01:08,740 Es ist das Problem, dass wir hatten über ein paar Mal in der Vorlesung gegangen. 18 00:01:08,740 --> 00:01:13,590 Und hier, was wir bitten Sie tun müssen, ist eine schnelle Speicher-Trace. 19 00:01:13,590 --> 00:01:17,000 Um die Werte der Variablen zu füllen, wie sie auf dem Stapel sind 20 00:01:17,000 --> 00:01:20,250 da der Code durch diesen Swap-Funktion geht. 21 00:01:20,250 --> 00:01:24,500 Insbesondere, was wir gerade sehen - ich werde dieses iPad legte - 22 00:01:24,500 --> 00:01:29,650 insbesondere, was wir suchen, ist diese Zeile nummeriert 6 hier richtig. 23 00:01:29,650 --> 00:01:36,740 Und es ist 6 für nur Kontiguität mit dem vorherigen Problem nummeriert. 24 00:01:36,740 --> 00:01:41,720 Was wir wollen, ist anzuzeigen oder beschriften den Zustand des Speichers 25 00:01:41,720 --> 00:01:46,090 wie es ist zu dem Zeitpunkt, wenn wir diese Linie 6 auszuführen, 26 00:01:46,090 --> 00:01:52,540 was effektiv eine Rückkehr von unserer Swap-Funktion finden Sie hier. 27 00:01:52,540 --> 00:01:59,450 Wenn wir hier unten scrollen, sahen wir, dass die Adressen der alles im Speicher für uns zur Verfügung gestellt. 28 00:01:59,450 --> 00:02:02,540 Dies ist sehr Schlüssel, wir kommen wieder, um es in einem Moment. 29 00:02:02,540 --> 00:02:09,240 Und dann hier unten am Boden, hatten wir eine kleine Erinnerung Diagramm, dass wir gehen, um zu verweisen. 30 00:02:09,240 --> 00:02:12,490 Ich habe tatsächlich das getan auf meinem iPad. 31 00:02:12,490 --> 00:02:20,720 Also werde ich hin und her wechseln zwischen dem iPad und dieser Code nur als Referenz. 32 00:02:20,720 --> 00:02:26,540 >> Lassen Sie uns beginnen. Lassen Sie uns zuerst auf den ersten paar Zeilen der wichtigsten hier zu konzentrieren. 33 00:02:26,540 --> 00:02:30,220 Um zu beginnen, werden wir x um 1 und y initialisieren 2. 34 00:02:30,220 --> 00:02:33,040 Also haben wir zwei Integer-Variablen haben, sind sie beide gehen auf den Stapel gelegt werden. 35 00:02:33,040 --> 00:02:36,050 Wir werden eine 1 und eine 2 in sie setzen. 36 00:02:36,050 --> 00:02:43,150 Also, wenn ich umdrehen zu meinem iPad, hoffentlich, mal sehen - 37 00:02:43,150 --> 00:02:48,660 Apple TV Spiegelung, und es geht los. Okay. 38 00:02:48,660 --> 00:02:51,670 Also, wenn ich umdrehen zu meinem iPad, 39 00:02:51,670 --> 00:02:56,220 Ich möchte x und y bis 1 zu 2 zu initialisieren. 40 00:02:56,220 --> 00:03:00,580 Wir machen das ganz einfach durch Schreiben einer 1 in das Feld x 41 00:03:00,580 --> 00:03:07,730 und eine 2 in das Feld y. Ziemlich einfach. 42 00:03:07,730 --> 00:03:11,620 So, jetzt gehen wir zurück zu dem Laptop, zu sehen, was als nächstes passiert. 43 00:03:11,620 --> 00:03:15,810 Also das nächste Zeile ist, wo die Dinge schwierig zu bekommen. 44 00:03:15,810 --> 00:03:28,110 Wir übergeben die Adresse von x und die Adresse von y als der Parameter a und b der Swap-Funktion. 45 00:03:28,110 --> 00:03:32,380 Die Adresse von x und der Adresse y gibt Dinge, die wir nicht berechnen können, 46 00:03:32,380 --> 00:03:36,360 ohne Bezugnahme auf diese Stichpunkte rechten hier unten. 47 00:03:36,360 --> 00:03:39,750 Und zum Glück, sagen die ersten zwei Stichpunkte uns genau das, was die Antworten sind. 48 00:03:39,750 --> 00:03:44,740 Die Adresse des im Speicher x ist 10, und die Adresse von y im Speicher 14 ist. 49 00:03:44,740 --> 00:03:51,870 Das sind also die Werte, die in so bekommen weitergegeben a und b bis oben in unserer Swap-Funktion. 50 00:03:51,870 --> 00:04:00,760 Also noch einmal, Wechsel zurück zu unserem Diagramm, kann ich eine 10 in einem 51 00:04:00,760 --> 00:04:07,400 und eine 14 in b. 52 00:04:07,400 --> 00:04:11,610 Nun ist dieser Punkt, wo wir mit der Swap. 53 00:04:11,610 --> 00:04:14,520 So blätterte zurück an den Laptop wieder 54 00:04:14,520 --> 00:04:21,079 sehen wir, dass die Art und Weise der Swap funktioniert Ich erste Dereferenzierung ist ein und speichern das Ergebnis in tmp. 55 00:04:21,079 --> 00:04:27,650 So Dereferenzierungsoperator sagt: "Hey. Behandeln Sie die Inhalte der Variable a als Adresse. 56 00:04:27,650 --> 00:04:33,830 Zum, was ist an dieser Adresse gespeichert, und laden Sie es. " 57 00:04:33,830 --> 00:04:41,720 Was Sie laden aus dem variable wird in unsere tmp-Variable gespeichert werden. 58 00:04:41,720 --> 00:04:45,150 Flipping zurück zum iPad. 59 00:04:45,150 --> 00:04:51,690 Wenn wir 10 Adresse zu gehen, wissen wir, dass die Adresse 10 die varible x 60 00:04:51,690 --> 00:04:55,480 weil wir uns Punkt, dass die Adresse von x im Speicher 10 ist gesagt. 61 00:04:55,480 --> 00:05:00,180 So können wir dorthin gehen, erhalten Sie den Wert davon, die 1 ist, wie wir auf unserer iPad sehen 62 00:05:00,180 --> 00:05:06,300 und dass in tmp laden. 63 00:05:06,300 --> 00:05:08,250 Auch dies ist nicht die endgültige Inhalt. 64 00:05:08,250 --> 00:05:14,350 Wir gehen zu Fuß durch und wir zu unserem letzten Zustand des Programms am Ende bekommen. 65 00:05:14,350 --> 00:05:17,210 Aber jetzt haben wir den Wert 1 in tmp gespeichert. 66 00:05:17,210 --> 00:05:19,210 >> Und es gibt eine kurze Frage hier. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Ist das Dereferenzierungsoperator - das ist nur der Stern direkt vor der Variablen? 68 00:05:23,980 --> 00:05:27,600 >> Ja. So Dereferenzierungsoperator, als wir zurück blättern, um unseren Laptop wieder 69 00:05:27,600 --> 00:05:33,780 ist dieser Stern direkt vor. 70 00:05:33,780 --> 00:05:37,460 In diesem Sinne ist es - Sie kontrastieren mit der Multiplikations-Operator 71 00:05:37,460 --> 00:05:42,400 das erfordert zwei Dinge, die Dereferenzierungsoperator ist eine unäre Operator. 72 00:05:42,400 --> 00:05:46,130 Nur um einen Wert angewandt werden wie auf einem binären Operator Gegensatz 73 00:05:46,130 --> 00:05:48,810 wo Sie zwei unterschiedliche Werte gelten. 74 00:05:48,810 --> 00:05:52,080 Also das ist, was passiert in dieser Linie. 75 00:05:52,080 --> 00:05:58,390 Wir luden den Wert 1 und lagerte sie in unsere temporäre Integer-Variable. 76 00:05:58,390 --> 00:06:05,800 Die nächste Zeile, speichern wir den Inhalt von b in - 77 00:06:05,800 --> 00:06:12,630 oder vielmehr, speichern wir die Inhalte, die b wird auf den Hinweis in den Ort, wo ein zu zeigt. 78 00:06:12,630 --> 00:06:17,690 Wenn wir das von rechts nach links zu analysieren, werden wir zu dereferenzieren b gehen, 79 00:06:17,690 --> 00:06:23,580 werden wir 14 anzugehen, werden wir die ganze Zahl, die es zu packen, 80 00:06:23,580 --> 00:06:26,900 und dann werden wir an die Adresse 10 gehen, 81 00:06:26,900 --> 00:06:34,240 und wir werden das Ergebnis unserer Dereferenzierung von b in diesem Raum zu werfen. 82 00:06:34,240 --> 00:06:40,080 Flipping zurück zu unserem iPad, wo wir dies ein wenig konkreter werden, 83 00:06:40,080 --> 00:06:44,070 könnte es helfen, wenn ich Zahlen auf alle Adressen hier schreiben. 84 00:06:44,070 --> 00:06:53,820 So wissen wir, dass bei y wir an der Adresse 14 sind, ist x an der Adresse 10. 85 00:06:53,820 --> 00:07:00,180 Als wir bei b beginnen, werden wir dereference b, werden wir den Wert 2 greifen. 86 00:07:00,180 --> 00:07:08,320 Wir werden diesen Wert zu greifen, denn das ist der Wert, der an der Adresse 14 lebt. 87 00:07:08,320 --> 00:07:15,700 Und wir werden es in die Variable, die an der Adresse 10 lebt setzen, 88 00:07:15,700 --> 00:07:19,160 das ist genau dort, entsprechend unserer Variablen x. 89 00:07:19,160 --> 00:07:21,810 So können wir tun, ein wenig zu überschreiben hier 90 00:07:21,810 --> 00:07:35,380 wo wir loswerden unserer 1 und stattdessen schreiben wir ein 2. 91 00:07:35,380 --> 00:07:39,560 So ist alles schön und gut in der Welt, obwohl wir überschrieben x hab jetzt. 92 00:07:39,560 --> 00:07:44,890 Wir haben x alten Wert in unserer tmp-Variable gespeichert. 93 00:07:44,890 --> 00:07:50,210 So können wir den Swap mit der nächsten Zeile zu vervollständigen. 94 00:07:50,210 --> 00:07:53,030 Flipping zurück zu unserem Laptop. 95 00:07:53,030 --> 00:07:58,150 Jetzt bleibt nur die Inhalte nehmen aus unserer temporären Integer-Variable 96 00:07:58,150 --> 00:08:05,630 und speichert sie in der Variablen, die an die Adresse, die b hält lebt. 97 00:08:05,630 --> 00:08:10,230 Daher freuen wir uns, um effektiv dereference b gehen, um den Zugriff auf die Variablen zu erhalten 98 00:08:10,230 --> 00:08:14,340 das ist die Adresse, die b hält darin, 99 00:08:14,340 --> 00:08:19,190 und wir werden den Wert, den tmp in sie halten zu stopfen. 100 00:08:19,190 --> 00:08:23,280 Flipping zurück zum iPad noch einmal. 101 00:08:23,280 --> 00:08:31,290 Ich kann diesen Wert hier zu löschen, 2, 102 00:08:31,290 --> 00:08:41,010 und stattdessen werden wir die 1 direkt hinein kopieren. 103 00:08:41,010 --> 00:08:43,059 Dann wird die nächste Zeile, die ausgeführt wird, natürlich - 104 00:08:43,059 --> 00:08:47,150 wenn wir wieder klappen mit dem Laptop - ist dieser Punkt 6, 105 00:08:47,150 --> 00:08:52,500 das ist der Punkt, an dem wir haben wollten unserem Diagramm vollständig ausgefüllt. 106 00:08:52,500 --> 00:08:58,940 So blätterte zurück zum iPad noch einmal, nur so können Sie sehen, das ausgefüllte Diagramm 107 00:08:58,940 --> 00:09:06,610 sieht man, dass man eine 10 in eine, eine in 14 b, a 1 in tmp, a 2 in x und in y ein 1 haben. 108 00:09:06,610 --> 00:09:11,000 Gibt es irgendwelche Fragen dazu? 109 00:09:11,000 --> 00:09:14,640 Bedeutet dies mehr Sinn machen, die über sie ging? 110 00:09:14,640 --> 00:09:24,850 Weniger Sinn? Hoffentlich nicht. Okay. 111 00:09:24,850 --> 00:09:28,230 >> Zeiger sind ein sehr heikles Thema. 112 00:09:28,230 --> 00:09:33,420 Einer der Jungs mit denen wir arbeiten ist eine sehr häufige Sprichwort: 113 00:09:33,420 --> 00:09:36,590 "Um Zeiger zu verstehen, müssen Sie zuerst verstehen, Zeiger." 114 00:09:36,590 --> 00:09:40,530 Was ich denke, ist sehr wahr. Es dauert eine Weile, bis sich daran zu gewöhnen. 115 00:09:40,530 --> 00:09:45,360 Die Ziehung von Bildern, zeichnen viel Speicher Diagramme wie dieses ein sehr hilfreich, 116 00:09:45,360 --> 00:09:49,480 und nach wandern Sie durch ein Beispiel nach dem nach dem Beispiel 117 00:09:49,480 --> 00:09:54,450 es wird beginnen, ein wenig mehr Sinn und ein wenig mehr Sinn und ein wenig mehr Sinn machen. 118 00:09:54,450 --> 00:10:01,560 Endlich, eines Tages wirst du alles haben komplett gemeistert. 119 00:10:01,560 --> 00:10:13,800 Haben Sie Fragen, bevor wir zum nächsten Problem? Gut. 120 00:10:13,800 --> 00:10:18,840 Also zurück blättern, um den Laptop. 121 00:10:18,840 --> 00:10:23,300 Das nächste Problem, das wir haben, ist Problem Nummer 33 auf Datei-I / O. 122 00:10:23,300 --> 00:10:26,350 Zoomen Sie in diesem ein wenig. 123 00:10:26,350 --> 00:10:28,710 Problem 33 - Ja? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Ich hatte gerade eine kurze Frage. Dieser Stern, oder der Stern, 125 00:10:32,110 --> 00:10:35,590 es heißt Dereferenzierung, wenn Sie ein Sternchen vor dem Gebrauch. 126 00:10:35,590 --> 00:10:38,820 Wie heißt es, wenn Sie das kaufmännische, bevor benutzen? 127 00:10:38,820 --> 00:10:43,140 >> Das kaufmännische vor ist die Adreßoperator. 128 00:10:43,140 --> 00:10:45,880 Also lasst uns blättern wieder nach oben. 129 00:10:45,880 --> 00:10:49,310 Oops. Ich bin im Zoom-Modus, so kann ich nicht wirklich blättern. 130 00:10:49,310 --> 00:10:52,780 Wenn wir uns auf diesen Code sehr schnell hier, 131 00:10:52,780 --> 00:10:54,980 wieder geschieht dasselbe. 132 00:10:54,980 --> 00:10:59,180 Wenn wir diesen Code hier schauen, auf dieser Linie, wo wir das Gespräch zu tauschen, 133 00:10:59,180 --> 00:11:10,460 das kaufmännische ist einfach nur sagen "erhalten die Adresse, an die Variable x lebt." 134 00:11:10,460 --> 00:11:14,460 Wenn Ihr Compiler kompiliert den Code, 135 00:11:14,460 --> 00:11:20,590 es muss tatsächlich physisch markieren einen Platz im Speicher für alle Ihre Variablen zu leben. 136 00:11:20,590 --> 00:11:24,910 Und was kann der Compiler dann tun, wenn es alles zusammengestellt ist, 137 00:11:24,910 --> 00:11:31,110 sie weiß, "Oh, I x legte an der Adresse 10. habe ich y an der Adresse 14." 138 00:11:31,110 --> 00:11:34,640 Es kann dann in diese Werte für Sie zu füllen. 139 00:11:34,640 --> 00:11:44,740 So können Sie dann - kann es dann passieren diese in und Pass & y als gut. 140 00:11:44,740 --> 00:11:50,730 Diese Jungs bekommen die Adresse, sondern auch, wenn Sie geben sie in die Swap-Funktion, 141 00:11:50,730 --> 00:11:55,690 diese Art Information, diese int * genau hier, sagt dem Compiler, 142 00:11:55,690 --> 00:12:01,350 "Okay, wir gehen zu interpretieren diese Adresse als eine Adresse einer Integer-Variable." 143 00:12:01,350 --> 00:12:05,900 Als Adresse einer int ist, die sich von der Adresse eines Zeichenvariable 144 00:12:05,900 --> 00:12:09,930 weil ein int nimmt, auf einem 32-Bit-Maschine, nimmt 4 Byte Speicherplatz, 145 00:12:09,930 --> 00:12:13,310 während ein Charakter benötigt nur 1 Byte. 146 00:12:13,310 --> 00:12:17,310 So ist es wichtig zu wissen auch, was ist - was lebt, welche Art von Wert 147 00:12:17,310 --> 00:12:20,340 an der Adresse, die übergeben wurde leben 148 00:12:20,340 --> 00:12:22,020 Oder die Adresse, die Sie zu tun haben. 149 00:12:22,020 --> 00:12:29,020 So wissen Sie, wie viele Bytes an Informationen tatsächlich zu laden aus dem RAM. 150 00:12:29,020 --> 00:12:31,780 Und dann, ja, wurden diese Dereferenzierungsoperator, wie Sie fragen, 151 00:12:31,780 --> 00:12:37,200 geht und auf Informationen zugreift, an einer bestimmten Adresse. 152 00:12:37,200 --> 00:12:42,820 So ist es, so mit diesem eine Variable hier, behandeln Sie die Inhalte einer als Adresse, 153 00:12:42,820 --> 00:12:47,880 gehen an diese Adresse, und ziehen Sie, laden Sie in den Prozessor, Last in ein Register 154 00:12:47,880 --> 00:12:56,340 die tatsächlichen Werte oder der Inhalt, die unter dieser Adresse wohnen. 155 00:12:56,340 --> 00:12:59,620 Noch Fragen? Das sind gute Fragen. 156 00:12:59,620 --> 00:13:01,650 Es gibt eine Menge neue Terminologie zu. 157 00:13:01,650 --> 00:13:09,800 Es ist auch eine Art funky, sehen & und * an verschiedenen Orten. 158 00:13:09,800 --> 00:13:13,180 >> Gut. 159 00:13:13,180 --> 00:13:18,530 Also zurück zum Problem 33, Datei-I / O. 160 00:13:18,530 --> 00:13:22,540 Dies war eines jener Probleme, dass ich denke, ein paar Dinge passiert. 161 00:13:22,540 --> 00:13:25,400 One, es ist ein ziemlich neues Thema. 162 00:13:25,400 --> 00:13:30,590 Es wurde ziemlich bald vor dem Quiz präsentiert, 163 00:13:30,590 --> 00:13:33,400 und dann denke ich, es war ein bisschen wie eine jener Textaufgaben in Mathematik 164 00:13:33,400 --> 00:13:39,720 wo sie Ihnen eine Vielzahl von Informationen, aber man eigentlich nicht am Ende mit einer Tonne zu nutzen. 165 00:13:39,720 --> 00:13:44,060 Der erste Teil dieses Problems ist zu beschreiben, was eine CSV-Datei ist. 166 00:13:44,060 --> 00:13:50,620 Nun, eine CSV-Datei, nach der Beschreibung, ist eine durch Kommata getrennte Werte-Datei. 167 00:13:50,620 --> 00:13:55,300 Der Grund sind überhaupt interessant, und der Grund, die Sie jemals verwenden sie, 168 00:13:55,300 --> 00:14:00,800 ist, weil, wie viele von euch schon mal Sachen wie Excel verwendet? 169 00:14:00,800 --> 00:14:03,240 Abbildung meisten von euch haben, wahrscheinlich oder an einem gewissen Punkt in Ihrem Leben verwenden. 170 00:14:03,240 --> 00:14:06,430 Du wirst so etwas wie Excel. 171 00:14:06,430 --> 00:14:10,940 Um die Daten zu bekommen aus einer Excel-Tabelle oder tun jede Art der Verarbeitung mit sich, 172 00:14:10,940 --> 00:14:17,240 wenn man wollte ein C-Programm oder Python-Programm, Java-Programm schreiben, 173 00:14:17,240 --> 00:14:20,070 mit den Daten, die Sie dort gespeichert haben umzugehen, 174 00:14:20,070 --> 00:14:23,170 eine der gängigsten Methoden, um es aus in einer CSV-Datei. 175 00:14:23,170 --> 00:14:26,850 Und Sie können öffnen Sie Excel, und wenn du gehst, um den Dialog "Speichern unter", 176 00:14:26,850 --> 00:14:32,840 Sie können sich aus einer tatsächlichen CSV-Datei. 177 00:14:32,840 --> 00:14:35,890 >> Gut zu wissen, wie man mit diesen Dingen umzugehen. 178 00:14:35,890 --> 00:14:42,010 Wie es funktioniert, ist, dass es ähnlich ist - ich meine, es ist im wesentlichen imitiert eine Tabellenkalkulation, 179 00:14:42,010 --> 00:14:47,590 wo, wie wir hier sehen, in der ganz links fast Stück, 180 00:14:47,590 --> 00:14:49,910 Wir haben alle Nachnamen. 181 00:14:49,910 --> 00:14:54,670 So haben wir Malan, dann Hardison und dann Bowden, MacWilliam und dann Chan. 182 00:14:54,670 --> 00:14:59,470 Alle Nachnamen. Und dann ein Komma trennt die Nachnamen von den Vornamen. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy und Zamyla. 184 00:15:02,970 --> 00:15:06,850 Ich habe immer durcheinander Robby und Tom. 185 00:15:06,850 --> 00:15:10,940 Und dann, endlich, die dritte Spalte ist die E-Mail-Adressen. 186 00:15:10,940 --> 00:15:18,500 Sobald Sie das verstehen, ist der Rest des Programms recht einfach zu implementieren. 187 00:15:18,500 --> 00:15:23,850 Was wir getan haben, um diese gleiche Struktur in unser C-Programm zu imitieren 188 00:15:23,850 --> 00:15:27,510 ist haben wir eine Struktur verwendet. 189 00:15:27,510 --> 00:15:30,520 Wir spielen mit diesen ein wenig mehr als gut. 190 00:15:30,520 --> 00:15:35,790 Wir sahen sie zum ersten etwas in problematischen Satz 3, als wir mit den Wörterbüchern zu tun haben. 191 00:15:35,790 --> 00:15:40,290 Aber das Personal struct speichert einen Nachnamen, einen Vornamen und eine E-Mail. 192 00:15:40,290 --> 00:15:44,500 Genau wie unsere CSV-Datei wurde die Speicherung. 193 00:15:44,500 --> 00:15:47,950 Das ist also nur das Umwandeln von einem Format in ein anderes. 194 00:15:47,950 --> 00:15:54,630 Wir haben zum Konvertieren, in diesem Fall einen Stab struct in eine Leitung, 195 00:15:54,630 --> 00:15:59,060 eine durch Komma getrennte Linie, einfach so. 196 00:15:59,060 --> 00:16:01,500 Macht das Sinn? Ihr habt all das Quiz genommen, 197 00:16:01,500 --> 00:16:07,680 so dass ich denke, Sie haben zumindest hatte etwas Zeit, um darüber nachzudenken. 198 00:16:07,680 --> 00:16:16,410 >> In der Miete Funktion, fragt das Problem uns in zu nehmen - wir werden zoom in dieser ein wenig - 199 00:16:16,410 --> 00:16:22,480 nehmen an einem Mitarbeiter-Struktur, ein Mitarbeiter struct, mit dem Namen s, 200 00:16:22,480 --> 00:16:30,900 und fügen Sie den Inhalt unserer staff.csv Datei. 201 00:16:30,900 --> 00:16:34,230 Es stellt sich heraus, dass diese relativ einfach zu bedienen ist. 202 00:16:34,230 --> 00:16:37,430 Wir Art von herumspielen mit diesen Funktionen ein wenig mehr heute. 203 00:16:37,430 --> 00:16:44,510 Aber in diesem Fall ist die fprintf Funktion wirklich der Schlüssel. 204 00:16:44,510 --> 00:16:51,960 Also mit fprintf, können wir drucken, so wie du Jungs haben mit printf dieses gesamten Laufzeit. 205 00:16:51,960 --> 00:16:55,050 Sie können printf eine Zeile in einer Datei. 206 00:16:55,050 --> 00:16:59,030 Anstatt also nur machen die üblichen printf wo man ihm den Format-String 207 00:16:59,030 --> 00:17:05,380 und dann ersetzen Sie alle Variablen mit den folgenden Argumenten, 208 00:17:05,380 --> 00:17:11,290 mit fprintf ist Ihre erste Argument anstelle die gewünschte Datei zu schreiben. 209 00:17:11,290 --> 00:17:21,170 Wenn wir auf diese in das Gerät schauen, zum Beispiel, man fprintf, 210 00:17:21,170 --> 00:17:25,980 können wir den Unterschied zwischen printf und fprintf. 211 00:17:25,980 --> 00:17:28,960 Ich werde hier heranzoomen ein wenig. 212 00:17:28,960 --> 00:17:33,140 Also mit printf, geben wir ihm einen Format-String, und dann die folgenden Argumente 213 00:17:33,140 --> 00:17:37,580 sind alle Variablen für Ersatz oder Substitution in unserem Format-String. 214 00:17:37,580 --> 00:17:47,310 Während bei fprintf, ist das erste Argument der Tat diese Datei * bezeichnet ein Strom. 215 00:17:47,310 --> 00:17:51,800 >> Verschieben wieder über hier, um unsere Miete, 216 00:17:51,800 --> 00:17:54,550 haben wir bereits unsere Datei * stream eröffnet für uns. 217 00:17:54,550 --> 00:17:57,810 Das ist, was diese erste Zeile macht, es öffnet die staff.csv Datei, 218 00:17:57,810 --> 00:18:01,690 Es öffnet es im Append-Modus, und alles, was noch für uns zu tun hat ist 219 00:18:01,690 --> 00:18:08,640 schreiben Sie die personelle Struktur der Datei. 220 00:18:08,640 --> 00:18:10,870 Und mal sehen, will ich das iPad benutzen? 221 00:18:10,870 --> 00:18:17,900 Ich benutze das iPad. Wir haben Leere - lasst uns diese auf den Tisch legen, damit ich ein wenig besser schreiben können - 222 00:18:17,900 --> 00:18:33,680 Erlöschen mieten und es dauert ein Argument, ein Mitarbeiter Struktur namens s. 223 00:18:33,680 --> 00:18:44,120 Haben unsere Hosenträger, haben wir unsere Datei * abgerufenen Datei, 224 00:18:44,120 --> 00:18:48,380 wir haben unsere fopen Linie, die uns gegeben, 225 00:18:48,380 --> 00:18:51,890 und ich werde einfach schreiben Sie es als Punkte, da es bereits in der pedia. 226 00:18:51,890 --> 00:19:00,530 Und dann auf unserer nächsten Zeile, werden wir um einen Anruf zu fprintf machen 227 00:19:00,530 --> 00:19:03,700 und wir werden in der Datei passieren, dass wir drucken wollen, 228 00:19:03,700 --> 00:19:10,290 und dann unsere Format-String, die - 229 00:19:10,290 --> 00:19:14,300 Ich lasse euch mir sagen, wie es aussieht. 230 00:19:14,300 --> 00:19:20,500 Was meinen Sie, Stella? Weißt du, was der erste Teil der Format-String aussieht? 231 00:19:20,500 --> 00:19:24,270 [Stella] Ich bin mir nicht sicher. >> Fühlen Sie sich frei, um Jimmy zu fragen. 232 00:19:24,270 --> 00:19:27,690 Weißt du, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Wäre es nur der Letzte sein? Ich weiß nicht. Ich bin mir nicht ganz sicher. 234 00:19:31,000 --> 00:19:39,020 >> Okay. Wie wäre es, hat jemand bekommen diese korrekt auf der Prüfung? 235 00:19:39,020 --> 00:19:41,770 Nr. Ordnung. 236 00:19:41,770 --> 00:19:47,920 Es stellt sich heraus, dass hier alles, was wir tun müssen, ist, dass wir wollen, dass jeder Teil unserer Mitarbeiterstruktur 237 00:19:47,920 --> 00:19:53,290 um als eine Zeichenkette in unserer Datei ausgedruckt werden. 238 00:19:53,290 --> 00:19:59,900 Wir verwenden einfach die Zeichenfolge Ersetzungszeichen drei verschiedenen Zeiten, weil wir einen Nachnamen haben 239 00:19:59,900 --> 00:20:07,160 gefolgt von Komma und dann ein Vorname gefolgt von einem Komma, 240 00:20:07,160 --> 00:20:12,430 und schließlich die E-Mail-Adresse, die gefolgt wird - was nicht 241 00:20:12,430 --> 00:20:15,140 Montage auf meinem Bildschirm - aber es ist von einem Zeilenumbruch. 242 00:20:15,140 --> 00:20:20,060 So werde ich es einfach da unten schreiben. 243 00:20:20,060 --> 00:20:23,560 Und dann nach unserer Format-String, 244 00:20:23,560 --> 00:20:27,880 wir müssen nur die Substitutionen, die wir mit der Punktnotation zugreifen 245 00:20:27,880 --> 00:20:31,370 , die wir sahen in problematischen Satz 3. 246 00:20:31,370 --> 00:20:48,820 Wir können s.last, s.first und s.email 247 00:20:48,820 --> 00:20:58,990 in diesen drei Werten in unser Format-String ersetzen. 248 00:20:58,990 --> 00:21:06,190 Also, wie war das? Sinn? 249 00:21:06,190 --> 00:21:09,700 Ja? Nein? Möglicherweise? Okay. 250 00:21:09,700 --> 00:21:14,180 >> Die letzte Sache, die wir tun, nachdem wir gedruckt und habe nachdem wir unsere Datei geöffnet: 251 00:21:14,180 --> 00:21:17,370 wenn wir eine Datei geöffnet, wir haben immer daran zu erinnern, um es zu schließen. 252 00:21:17,370 --> 00:21:19,430 Denn sonst werden wir am Ende undicht den Speicher 253 00:21:19,430 --> 00:21:22,500 mit bis Dateideskriptoren. 254 00:21:22,500 --> 00:21:25,950 So um es zu schließen, welche Funktion verwenden wir? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, genau. 256 00:21:30,120 --> 00:21:37,520 So der letzte Teil dieses Problems war richtig schließen Sie die Datei mit dem fclose Funktion 257 00:21:37,520 --> 00:21:40,370 das sieht einfach so. 258 00:21:40,370 --> 00:21:43,880 Nicht zu verrückt. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Also das ist Problem 33 am Quiz. 261 00:21:49,520 --> 00:21:52,480 Wir müssen auf jeden Fall mehr Datei-I / O kommen. 262 00:21:52,480 --> 00:21:55,130 Wir ein bisschen mehr zu tun in der Vorlesung, heute oder in Abschnitt heute 263 00:21:55,130 --> 00:22:01,710 weil das ist, was los ist, um den Großteil des kommenden pset bilden. 264 00:22:01,710 --> 00:22:05,020 Gehen wir von der Quiz an dieser Stelle. Ja? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Warum fclose (Datei) anstelle von fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Denn es stellt sich heraus, dass - so die Frage, was ist ein großer, 267 00:22:19,100 --> 00:22:27,800 warum, wenn wir fclose schreiben, schreiben wir fclose (Datei) star variable 268 00:22:27,800 --> 00:22:33,680 um den Dateinamen, staff.csv dagegen? Ist das richtig? Yeah. 269 00:22:33,680 --> 00:22:39,570 Werfen wir also einen Blick. Wenn ich wieder zurück in meinem Laptop, 270 00:22:39,570 --> 00:22:45,040 und lasst uns an der fclose Funktion anschauen. 271 00:22:45,040 --> 00:22:51,460 Also das fclose Funktion schließt einen Strom, und es dauert in der Zeiger auf den Strom, die wir schließen möchten, 272 00:22:51,460 --> 00:22:57,010 um den tatsächlichen Dateinamen, dass wir schließen möchten entgegen. 273 00:22:57,010 --> 00:23:01,620 Und das ist, weil hinter den Kulissen, wenn Sie einen Anruf zu tätigen, um fopen 274 00:23:01,620 --> 00:23:12,020 wenn Sie eine Datei öffnen, werden Sie tatsächlich Zuweisung von Speicher, um Informationen über die Datei speichern. 275 00:23:12,020 --> 00:23:16,380 So haben Sie Dateizeiger, die Informationen über die Datei hat, 276 00:23:16,380 --> 00:23:23,080 wie es geöffnet ist, seine Größe, wo Sie sind derzeit in der Datei, 277 00:23:23,080 --> 00:23:29,100 so dass man das Lesen und Schreiben von Anrufen an diesen bestimmten Ort innerhalb der Datei. 278 00:23:29,100 --> 00:23:38,060 Sie enden Schließen der Zeiger anstelle der Schließung des Dateinamens. 279 00:23:38,060 --> 00:23:48,990 >> Ja? [Daniel] Also, um Miete zu verwenden, würden Sie sagen - wie geht es bekommen die Eingabe des Benutzers? 280 00:23:48,990 --> 00:23:53,830 Hat fprintf wie GetString handeln im Sinne, dass es dann nur für die Benutzereingaben warten 281 00:23:53,830 --> 00:23:57,180 und bitten Sie, dies zu geben - oder warten Sie diese drei Dinge in eingeben, um? 282 00:23:57,180 --> 00:24:00,480 Oder benötigen Sie etwas verwenden, um Miete zu implementieren? 283 00:24:00,480 --> 00:24:04,100 >> Ja. So sind wir nicht - die Frage war, wie bekommen wir die Eingabe des Benutzers 284 00:24:04,100 --> 00:24:09,220 zur Umsetzung mieten? Und was wir hier haben, ist der Aufrufer mieten, 285 00:24:09,220 --> 00:24:17,690 bestanden in dieser Mitarbeiter struct mit all den Daten, die in der Struktur gespeicherten schon. 286 00:24:17,690 --> 00:24:22,990 So fprintf kann nur schreiben, dass die Daten direkt in die Datei. 287 00:24:22,990 --> 00:24:25,690 Es gibt keine Wartezeiten für Benutzereingaben. 288 00:24:25,690 --> 00:24:32,110 Der Benutzer hat bereits die Eingabe durch richtig, es in dieser Mitarbeiter struct gegeben. 289 00:24:32,110 --> 00:24:36,510 Und die Dinge natürlich brechen würde, wenn einer dieser Zeiger waren null, 290 00:24:36,510 --> 00:24:40,370 so scrollen wir wieder hier, und wir schauen Sie sich unsere Struktur. 291 00:24:40,370 --> 00:24:43,640 Wir haben String letzten, string erste, string E-Mail. 292 00:24:43,640 --> 00:24:48,530 Wir wissen jetzt, dass alle diejenigen, wirklich, unter der Haube sind char * Variablen. 293 00:24:48,530 --> 00:24:53,470 Das kann oder auch nicht zeigen, um null. 294 00:24:53,470 --> 00:24:55,800 Sie können den Speicher auf dem Heap gerichtet sein, 295 00:24:55,800 --> 00:24:59,650 vielleicht Speicher auf dem Stapel. 296 00:24:59,650 --> 00:25:04,580 Wir wissen nicht wirklich wissen, aber wenn dieser Zeiger sind null oder ungültig, 297 00:25:04,580 --> 00:25:08,120 , dass das definitiv abstürzen werden unser Verleih-Funktion. 298 00:25:08,120 --> 00:25:11,050 Das war etwas, das Art über den Umfang der Prüfung war. 299 00:25:11,050 --> 00:25:16,440 Wir sind nicht Sorgen darüber. 300 00:25:16,440 --> 00:25:22,170 Great. Okay. So bewegen auf dem Quiz. 301 00:25:22,170 --> 00:25:25,760 >> Schließen wir diesen Kerl, und wir gehen auf pset 4 aussehen. 302 00:25:25,760 --> 00:25:34,700 Also, wenn ihr Jungs am pset spec aussehen, wenn Sie darauf zugreifen können, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 werden wir durch ein paar der Abschnitt Probleme heute gehen. 304 00:25:42,730 --> 00:25:52,240 Ich bin unten scrollen - Abschnitt von Fragen beginnt auf der dritten Seite des pset spec. 305 00:25:52,240 --> 00:25:57,800 Und der erste Teil fordert Sie auf, zu gehen und beobachten Sie die kurz auf Umleiten und Rohre. 306 00:25:57,800 --> 00:26:02,820 Welche war irgendwie kühl kurz, zeigt Ihnen einige neue, coole Befehlszeile Tricks, die Sie verwenden können. 307 00:26:02,820 --> 00:26:06,050 Und dann haben wir ein paar Fragen für Sie als gut. 308 00:26:06,050 --> 00:26:10,860 Diese erste Frage zu Streams, um die printf schreibt standardmäßig 309 00:26:10,860 --> 00:26:15,920 wir irgendwie auf nur ein wenig berührt vor einem Augenblick. 310 00:26:15,920 --> 00:26:22,380 Diese fprintf, dass wir gerade diskutieren erfolgt in einer Datei * stream als Argument. 311 00:26:22,380 --> 00:26:26,580 fclose erfolgt in einer Datei * stream als gut, 312 00:26:26,580 --> 00:26:32,660 und der Rückgabewert von fopen gibt Ihnen eine Datei * stream als gut. 313 00:26:32,660 --> 00:26:36,060 Der Grund, warum wir nicht diejenigen gesehen haben, wenn wir mit printf behandelt habe 314 00:26:36,060 --> 00:26:39,450 Denn printf hat einen Standardwert Stream. 315 00:26:39,450 --> 00:26:41,810 Und das Standard-Stream auf die sie schreibt 316 00:26:41,810 --> 00:26:45,190 finden Sie heraus, zu kurz. 317 00:26:45,190 --> 00:26:50,080 Also auf jeden Fall einen Blick auf sie. 318 00:26:50,080 --> 00:26:53,010 >> In der heutigen Abschnitt wollen wir ein wenig über GDB reden, 319 00:26:53,010 --> 00:26:57,720 da die mehr vertraut Sie mit ihm sind, desto mehr Übung mit ihm zu bekommen, 320 00:26:57,720 --> 00:27:01,390 desto besser können Sie sein, um tatsächlich jagen Bugs in Ihrem eigenen Code. 321 00:27:01,390 --> 00:27:05,540 Dies beschleunigt das Verfahren der Fehlersuche bis enorm. 322 00:27:05,540 --> 00:27:09,230 So mit printf, jedes Mal, wenn Sie das tun, um Ihren Code neu kompilieren müssen, 323 00:27:09,230 --> 00:27:13,000 Sie haben es wieder zu laufen, manchmal muss man die printf bewegen, 324 00:27:13,000 --> 00:27:17,100 Kommentar von Code, es dauert nur eine Weile. 325 00:27:17,100 --> 00:27:20,850 Unser Ziel ist es zu versuchen und zu überzeugen, dass mit GDB, Sie im Wesentlichen kann 326 00:27:20,850 --> 00:27:26,810 printf nichts an beliebiger Stelle in Ihrem Code und Sie müssen nie um sie neu zu kompilieren. 327 00:27:26,810 --> 00:27:35,120 Sie haben nie zu starten und zu halten erraten, wo die printf nächsten. 328 00:27:35,120 --> 00:27:40,910 Das erste, was zu tun ist, um diese Zeile zu kopieren und sich den Abschnitt Code aus der Bahn. 329 00:27:40,910 --> 00:27:47,530 Ich bin Kopieren dieser Codezeile, die sagt: "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ich werde es zu kopieren. 331 00:27:49,510 --> 00:27:55,950 Ich gehe hin zu meinem Gerät, Verkleinern, so dass Sie sehen können, was ich tue, 332 00:27:55,950 --> 00:28:01,890 Einfügen es dort, und wenn ich Enter drücken, diese wget Befehl ist buchstäblich ein Web zu bekommen. 333 00:28:01,890 --> 00:28:06,210 Es wird nach unten ziehen diese Datei aus der Internet, 334 00:28:06,210 --> 00:28:11,790 und es wird sie in das aktuelle Verzeichnis zu speichern. 335 00:28:11,790 --> 00:28:21,630 Nun, wenn ich meinen aktuellen Verzeichnis Liste können Sie sehen, dass ich habe dieses section5.zip Datei direkt dort. 336 00:28:21,630 --> 00:28:25,260 Die Art und Weise, mit diesem Kerl umzugehen ist, sie zu entpacken, 337 00:28:25,260 --> 00:28:27,650 mit der Sie in der Befehlszeile zu tun, genau wie dieser. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Das wird sie zu entpacken, den Ordner für mich, 340 00:28:36,980 --> 00:28:40,410 Aufblasen der gesamte Inhalt, steckte sie in dort. 341 00:28:40,410 --> 00:28:47,410 So, jetzt kann ich in meinem Abschnitt 5 Verzeichnis mit dem Befehl cd zu gehen. 342 00:28:47,410 --> 00:28:58,310 Löschen Sie den Bildschirm mit klar. So löschen Sie den Bildschirm. 343 00:28:58,310 --> 00:29:02,280 Jetzt habe ich ein schönes, sauberes Terminal zu behandeln. 344 00:29:02,280 --> 00:29:06,200 >> Nun, wenn ich eine Liste aller Dateien, die ich in diesem Verzeichnis 345 00:29:06,200 --> 00:29:12,270 Sie sehen, dass ich habe vier Dateien: buggy1, buggy2, buggy3 und buggy4. 346 00:29:12,270 --> 00:29:16,180 Ich habe auch die entsprechenden. C Dateien. 347 00:29:16,180 --> 00:29:20,400 Wir gehen nicht auf den. C Dateien für jetzt aussehen. 348 00:29:20,400 --> 00:29:24,140 Stattdessen werden wir sie benutzen, wenn wir GDB öffnen. 349 00:29:24,140 --> 00:29:28,220 Wir haben sie immer um, so dass wir den Zugang zum eigentlichen Quellcode haben, wenn wir mit GDB sind, 350 00:29:28,220 --> 00:29:32,740 aber das Ziel dieses Teils des Abschnitts zu basteln, um mit GDB 351 00:29:32,740 --> 00:29:40,370 und sehen, wie wir können es verwenden, um herauszufinden, was falsch läuft mit jeder dieser vier fehlerhafte Programme. 352 00:29:40,370 --> 00:29:43,380 So sind wir gerade dabei, den Raum sehr schnell, 353 00:29:43,380 --> 00:29:47,000 und ich werde jemanden bitten, eine der fehlerhafte Programme laufen, 354 00:29:47,000 --> 00:29:54,730 und dann werden wir als Gruppe durch GDB gehen, und wir werden sehen, was wir tun können, um diese Programme zu beheben, 355 00:29:54,730 --> 00:29:58,460 oder zumindest erkennen, was falsch läuft in jedem von ihnen. 356 00:29:58,460 --> 00:30:04,760 Lasst uns beginnen hier mit Daniel. Laufen Sie buggy1? Mal sehen, was passiert. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Er sagt, es ist eine Anwendung Fehler. >> Ja. Genau. 358 00:30:09,470 --> 00:30:12,460 Also, wenn ich buggy1 ausführen, bekomme ich einen Segmentation Fehler. 359 00:30:12,460 --> 00:30:16,210 An dieser Stelle könnte ich gehen und eröffnen buggy1.c, 360 00:30:16,210 --> 00:30:19,450 versuchen, herauszufinden, was falsch läuft, 361 00:30:19,450 --> 00:30:22,000 aber einer der abscheulichen Dinge über dieses Segment Fehlerfehler 362 00:30:22,000 --> 00:30:27,610 ist, dass es Ihnen nicht sagen, was Zeile des Programms Dinge tatsächlich falsch gelaufen ist und zerbrach. 363 00:30:27,610 --> 00:30:29,880 Sie Art müssen auf den Code schauen 364 00:30:29,880 --> 00:30:33,990 und außen mit guess herausfinden und prüfen oder printf, um zu sehen, was falsch läuft. 365 00:30:33,990 --> 00:30:37,840 Eines der coolsten Dinge über GDB ist, dass es wirklich, wirklich einfach ist 366 00:30:37,840 --> 00:30:42,170 um herauszufinden, die Linie, an der das Programm stürzt ab. 367 00:30:42,170 --> 00:30:46,160 Es ist jeden Cent wert, es zu benutzen, wenn auch nur für diese. 368 00:30:46,160 --> 00:30:56,190 So zum Hochfahren GDB, Typ I GDB, und dann gebe ich es den Pfad zur ausführbaren Datei, die ich ausführen möchten. 369 00:30:56,190 --> 00:31:01,960 Hier bin ich der Eingabe gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Drücken Sie die Eingabetaste. Gibt mir all diese Copyright-Informationen, 371 00:31:06,600 --> 00:31:13,000 und hier unten sehen Sie diese Zeile, die sagt: "Lesen Symbole aus / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Und wenn alles gut geht, werden Sie sehen, es ausdrucken eine Nachricht, die wie folgt aussieht. 374 00:31:22,060 --> 00:31:25,500 Es wird Symbole zu lesen, es wird sagen: "Ich bin Lesen von Symbolen aus der ausführbaren Datei" 375 00:31:25,500 --> 00:31:29,900 und dann wird es dieses "done" Nachricht über hier zu haben. 376 00:31:29,900 --> 00:31:35,410 Wenn Sie eine andere Variante dieses sehen, oder sehen Sie es nicht finden konnten, die Symbole 377 00:31:35,410 --> 00:31:41,460 oder so ähnlich, was das bedeutet ist, dass Sie nur noch nicht die ausführbare Datei kompiliert einwandfrei. 378 00:31:41,460 --> 00:31:49,980 Wenn wir Programme für die Verwendung mit GDB zu kompilieren, müssen wir diese spezielle Option-g verwenden, 379 00:31:49,980 --> 00:31:54,540 und das ist standardmäßig möglich, wenn Sie Ihre Programme zu kompilieren, indem Sie einfach machen 380 00:31:54,540 --> 00:31:59,320 oder machen Buggy oder zu erholen, eine von denen. 381 00:31:59,320 --> 00:32:07,800 Aber wenn Sie manuell Kompilieren mit Clang, dann haben Sie zu gehen und beinhalten, dass-g-Flag. 382 00:32:07,800 --> 00:32:10,310 >> An diesem Punkt, dass wir jetzt haben unsere GDB Eingabeaufforderung 383 00:32:10,310 --> 00:32:12,310 Es ist ziemlich einfach, das Programm auszuführen. 384 00:32:12,310 --> 00:32:19,740 Wir können entweder laufen, oder wir können geben Sie einfach r. 385 00:32:19,740 --> 00:32:22,820 Die meisten GDB-Befehle können abgekürzt werden. 386 00:32:22,820 --> 00:32:25,940 Regel nur ein oder ein paar Briefe, die sehr schön ist. 387 00:32:25,940 --> 00:32:30,980 So Saad, wenn Sie r eingeben und die Eingabetaste drücken, was passiert? 388 00:32:30,980 --> 00:32:39,390 [Saad] Ich habe SIGSEGV, Segmentation Fault, und dann all diese Kauderwelsch. 389 00:32:39,390 --> 00:32:43,650 >> Ja. 390 00:32:43,650 --> 00:32:47,990 Wie wir auf dem Bildschirm sehen, gerade jetzt, und wie Saad sagte, 391 00:32:47,990 --> 00:32:53,430 wenn wir laufen oder r eingeben und Enter drücken wir immer noch die gleichen Segment Schuld. 392 00:32:53,430 --> 00:32:55,830 Also mit GDB nicht lösen unser Problem. 393 00:32:55,830 --> 00:32:59,120 Aber es gibt uns einige Kauderwelsch, und es stellt sich heraus, dass dieses Kauderwelsch 394 00:32:59,120 --> 00:33:03,080 tatsächlich sagt uns, wo es passiert. 395 00:33:03,080 --> 00:33:10,680 Um diese ein wenig zu analysieren, ist dieser erste Bit die Funktion, in der alles, was falsch ist. 396 00:33:10,680 --> 00:33:20,270 Es ist das __ strcmp_sse4_2, und es sagt uns, dass es in dieser Datei geschieht 397 00:33:20,270 --> 00:33:29,450 genannt sysdeps/i386, all dies wieder eine Art Katastrophe - aber die Leitung 254. 398 00:33:29,450 --> 00:33:31,670 Das ist ziemlich schwer zu analysieren. Normalerweise, wenn Sie sehen, Sachen wie diese, 399 00:33:31,670 --> 00:33:38,770 das bedeutet, dass es seg fehlgeschlagenes in einer der System-Bibliotheken. 400 00:33:38,770 --> 00:33:43,220 So etwas mit strcmp tun. Ihr habt strcmp gesehen. 401 00:33:43,220 --> 00:33:52,730 Nicht zu verrückt, aber bedeutet dies, dass strcmp defekt ist oder dass es ein Problem mit strcmp? 402 00:33:52,730 --> 00:33:57,110 Was denkst du, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Ist das - ist 254 die Linie? Und das - nicht das binäre, aber es ist nicht ihre Decken, 404 00:34:04,890 --> 00:34:10,590 und dann gibt es eine andere Sprache für jede Funktion. Ist das 254 in dieser Funktion, oder -? 405 00:34:10,590 --> 00:34:21,460 >> Es ist Zeile 254. Es sieht aus wie in diesem. S Datei, so ist es Assembler-Code wahrscheinlich. 406 00:34:21,460 --> 00:34:25,949 >> Aber ich denke, die dringender Sache ist, weil wir eine seg Fehler bekommen haben, 407 00:34:25,949 --> 00:34:29,960 und es sieht aus wie aus dem strcmp Funktion kommt, 408 00:34:29,960 --> 00:34:38,030 Bedeutet das dann, ist, dass strcmp gebrochen? 409 00:34:38,030 --> 00:34:42,290 Es sollte nicht, hoffentlich. Also nur weil du einen Segmentation Fault 410 00:34:42,290 --> 00:34:49,480 in einem der System-Funktionen, bedeutet in der Regel, dass Sie es nur noch nicht korrekt aufgerufen. 411 00:34:49,480 --> 00:34:52,440 Das schnellste, was zu tun, um herauszufinden, was eigentlich vor sich geht 412 00:34:52,440 --> 00:34:55,500 wenn Sie etwas Verrücktes wie diese finden, wenn Sie eine seg Fehler zu sehen, 413 00:34:55,500 --> 00:34:59,800 besonders wenn Sie ein Programm, das mit mehr als nur Main, 414 00:34:59,800 --> 00:35:03,570 ist eine Rückverfolgung verwenden. 415 00:35:03,570 --> 00:35:13,080 Ich abkürzen backtrace schriftlich bt, um den vollen Backtrace Wort entgegen. 416 00:35:13,080 --> 00:35:16,510 Aber Charlotte, was passiert, wenn Sie bt eingeben und Enter drücken? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Es zeigt mir, zwei Linien, Linie 0 und Linie 1. 418 00:35:23,200 --> 00:35:26,150 >> Ja. So Linie 0 und Linie 1. 419 00:35:26,150 --> 00:35:34,560 Dies sind die eigentlichen Stack-Frames, die derzeit im Spiel waren, als das Programm abgestürzt ist. 420 00:35:34,560 --> 00:35:42,230 Ausgehend von der obersten Rahmen, Rahmen 0, und Gehen zum untersten, der Rahmen 1 ist. 421 00:35:42,230 --> 00:35:45,140 Unsere obersten Rahmen ist das strcmp Rahmen. 422 00:35:45,140 --> 00:35:50,080 Sie können sich das denken, ähnlich wie dieses Problem, das wir gerade dabei auf das Quiz mit den Zeigern wurden, 423 00:35:50,080 --> 00:35:54,890 wo wir Stapelrahmen auf der Oberseite des Haupt Stapelrahmen tauschen, 424 00:35:54,890 --> 00:35:59,700 und wir hatten die Variablen, die Swap wurde am Anfang der Variablen, die wichtigsten wurde mit verwenden. 425 00:35:59,700 --> 00:36:08,440 Hier unsere Absturz passiert in unserem strcmp Funktion, die durch unsere Funktion aufgerufen wurde, 426 00:36:08,440 --> 00:36:14,370 und Backtrace gibt uns nicht nur die Funktionen, in denen die Dinge nicht, 427 00:36:14,370 --> 00:36:16,440 aber es ist auch uns mitzuteilen, wo alles von genannt wurde. 428 00:36:16,440 --> 00:36:18,830 Also, wenn ich scrollen Sie über ein wenig mehr nach rechts, 429 00:36:18,830 --> 00:36:26,110 können wir sehen, dass ja, wir on line 254 dieser strcmp-sse4.s Datei wäre. 430 00:36:26,110 --> 00:36:32,540 Doch der Ruf wurde buggy1.c, Zeile 6 gemacht. 431 00:36:32,540 --> 00:36:35,960 Das heißt also, wir tun können - ist, dass wir gerade gehen können Check-out und sehen, was los war 432 00:36:35,960 --> 00:36:39,930 am buggy1.c, Zeile 6. 433 00:36:39,930 --> 00:36:43,780 Auch hier gibt es ein paar Möglichkeiten, dies zu tun. Eine besteht darin, Ausfahrt aus GDB 434 00:36:43,780 --> 00:36:49,460 oder Ihren Code in einem anderen Fenster und Cross-Reference zu öffnen. 435 00:36:49,460 --> 00:36:54,740 Das an und für sich ist ziemlich praktisch, denn jetzt, wenn Sie im Büro Stunden sind 436 00:36:54,740 --> 00:36:57,220 und du hast eine seg Fehler und Ihre TF fragt sich, wo alles brach, 437 00:36:57,220 --> 00:36:59,710 Sie können einfach sagen: "Oh, Zeile 6. Ich weiß nicht, was los ist, 438 00:36:59,710 --> 00:37:03,670 aber etwas über die Leitung 6 verursacht mein Programm zu brechen. " 439 00:37:03,670 --> 00:37:10,430 Der andere Weg, es zu tun ist, können Sie diesen Befehl als Liste in GDB benutzen. 440 00:37:10,430 --> 00:37:13,650 Sie können auch abgekürzt mit l. 441 00:37:13,650 --> 00:37:18,910 Also, wenn wir l getroffen, was haben wir hier? 442 00:37:18,910 --> 00:37:21,160 Wir bekommen eine ganze Reihe von weird stuff. 443 00:37:21,160 --> 00:37:26,030 Dies ist die eigentliche Assembler-Code 444 00:37:26,030 --> 00:37:29,860 das ist in strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Das sieht irgendwie funky, 446 00:37:32,440 --> 00:37:36,520 und der Grund, warum wir immer diese sind, weil gerade jetzt, 447 00:37:36,520 --> 00:37:40,160 GDB hat uns in Frame 0. 448 00:37:40,160 --> 00:37:43,070 >> So jederzeit betrachten wir Variablen, zu jeder Zeit schauen wir uns Quellcode, 449 00:37:43,070 --> 00:37:50,530 Wir sind am Quellcode suchen, die sich auf dem Stapelrahmen wir sind momentan in. 450 00:37:50,530 --> 00:37:53,200 Also, um etwas Sinnvolles zu bekommen, müssen wir 451 00:37:53,200 --> 00:37:57,070 zu bewegen, um einen Stack-Frames, mehr Sinn macht. 452 00:37:57,070 --> 00:38:00,180 In diesem Fall wäre der wichtigste Stapelrahmen machen ein wenig mehr Sinn, 453 00:38:00,180 --> 00:38:02,680 denn das war tatsächlich der Code, den wir geschrieben haben. 454 00:38:02,680 --> 00:38:05,330 Nicht die strcmp Code. 455 00:38:05,330 --> 00:38:08,650 Die Art und Weise zwischen den Bildern bewegen können, in diesem Fall, weil wir zwei haben, 456 00:38:08,650 --> 00:38:10,430 Wir haben 0 und 1, 457 00:38:10,430 --> 00:38:13,650 Sie tun, dass mit dem oben und unten Befehle. 458 00:38:13,650 --> 00:38:18,480 Wenn ich nach oben ein Rahmen, 459 00:38:18,480 --> 00:38:21,770 jetzt bin ich in der Haupt-Stack-Frame. 460 00:38:21,770 --> 00:38:24,330 Ich kann nach unten zurück zu gehen, wo ich war, 461 00:38:24,330 --> 00:38:32,830 wieder hinauf, wieder hinunter und wieder hinauf. 462 00:38:32,830 --> 00:38:39,750 Wenn Sie jemals tun Ihr Programm in GDB Sie einen Absturz erhalten, erhalten Sie den Backtrace, 463 00:38:39,750 --> 00:38:42,380 und Sie sehen, dass es in einigen Datei, die Sie nicht wissen, was los ist. 464 00:38:42,380 --> 00:38:45,460 Sie versuchen Liste der Code nicht bekannt vor, 465 00:38:45,460 --> 00:38:48,150 einen Blick auf Ihre Bilder und herauszufinden, wo Sie sind. 466 00:38:48,150 --> 00:38:51,010 Du bist wahrscheinlich in der falschen Stack-Frame. 467 00:38:51,010 --> 00:38:58,760 Oder zumindest, du bist in einem Stack-Frame, der nicht ein, dass Sie wirklich debuggen können. 468 00:38:58,760 --> 00:39:03,110 Jetzt, da wir in dem entsprechenden Stack-Frame sind, sind wir in den wichtigsten, 469 00:39:03,110 --> 00:39:08,100 Jetzt können wir mit dem Befehl list, um herauszufinden, was der Linie war. 470 00:39:08,100 --> 00:39:13,590 Und Sie können es sehen, es druckte es für uns hier richtig. 471 00:39:13,590 --> 00:39:19,470 Aber wir können Hitliste alle die gleiche, und die Liste gibt uns dieses schöne Ausdruck 472 00:39:19,470 --> 00:39:23,920 der eigentliche Quellcode, was los ist hier. 473 00:39:23,920 --> 00:39:26,420 >> Insbesondere können wir in Zeile 6 aussehen. 474 00:39:26,420 --> 00:39:29,330 Wir können sehen, was hier los ist. 475 00:39:29,330 --> 00:39:31,250 Und wie es aussieht machen wir einen String-Vergleich sind 476 00:39:31,250 --> 00:39:41,050 zwischen den String "CS50 rocks" und argv [1]. 477 00:39:41,050 --> 00:39:45,700 Etwas über diese stürzte. 478 00:39:45,700 --> 00:39:54,120 So Missy, hast du keine Gedanken darüber, was sein könnte denn hier los? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ich weiß nicht, warum es abstürzt ist. >> Du weißt nicht, warum es abstürzt ist? 480 00:39:59,400 --> 00:40:02,700 Jimmy, alle Gedanken? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Ich bin nicht ganz sicher, aber das letzte Mal, dass wir Zeichenfolge vergleichen, 482 00:40:06,240 --> 00:40:10,260 oder strcmp, hatten wir wie drei verschiedene Fälle unter ihm. 483 00:40:10,260 --> 00:40:12,800 Wir haben nicht ein ==, ich glaube nicht, direkt in dieser ersten Zeile. 484 00:40:12,800 --> 00:40:16,700 Stattdessen wurde in drei getrennt und man war == 0, 485 00:40:16,700 --> 00:40:19,910 war <0, denke ich, und man war> 0. 486 00:40:19,910 --> 00:40:22,590 Also vielleicht so etwas? >> Ja. Also gibt es dieses Problem 487 00:40:22,590 --> 00:40:27,200 der machen wir den Vergleich richtig? 488 00:40:27,200 --> 00:40:31,660 Stella? Irgendwelche Gedanken? 489 00:40:31,660 --> 00:40:38,110 [Stella] Ich bin mir nicht sicher. >> Nicht sicher. Daniel? Gedanken? Okay. 490 00:40:38,110 --> 00:40:44,770 Es stellt sich heraus, was hier passiert, ist, wenn wir das Programm lief 491 00:40:44,770 --> 00:40:48,370 und wir haben die seg Fehler, wenn Sie das Programm zum ersten Mal, Daniel lief, 492 00:40:48,370 --> 00:40:50,800 hast du ihm keine Befehlszeilenargumente? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> Nr. In diesem Fall, was ist der Wert von argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Es gibt keinen Wert. >> Richtig. 495 00:41:00,920 --> 00:41:06,120 Nun, es gibt keine entsprechenden String-Wert. 496 00:41:06,120 --> 00:41:10,780 Aber es gibt einen gewissen Wert. Was ist der Wert, der den dort gespeicherten wird? 497 00:41:10,780 --> 00:41:15,130 >> Eine Garbage Wert? >> Es ist entweder ein Garbage Wert oder, in diesem Fall, 498 00:41:15,130 --> 00:41:19,930 das Ende des argv-Array wird immer mit null beendet. 499 00:41:19,930 --> 00:41:26,050 So was tatsächlich wurde gespeichert ist null. 500 00:41:26,050 --> 00:41:30,810 Die andere Möglichkeit, dieses Problem lösen, anstatt zu Ende denken, 501 00:41:30,810 --> 00:41:33,420 ist zu versuchen, es auszudrucken. 502 00:41:33,420 --> 00:41:35,880 Dies ist, wo ich gesagt habe, dass die Verwendung GDB ist groß, 503 00:41:35,880 --> 00:41:40,640 weil Sie ausdrucken können alle Variablen, alle Werte, die Sie 504 00:41:40,640 --> 00:41:43,230 Verwendung dieses handy-dandy p Befehl. 505 00:41:43,230 --> 00:41:48,520 Also, wenn ich p eingeben und dann tippe ich den Wert einer Variablen oder den Namen einer Variablen, 506 00:41:48,520 --> 00:41:55,320 sagen, argc, sehe ich, dass argc 1 ist. 507 00:41:55,320 --> 00:42:01,830 Wenn ich den Ausdruck argv wollen [0], kann ich tun, einfach so. 508 00:42:01,830 --> 00:42:04,840 Und wie wir gesehen haben, argv [0] ist immer der Name des Programms, 509 00:42:04,840 --> 00:42:06,910 immer der Name der ausführbaren Datei. 510 00:42:06,910 --> 00:42:09,740 Hier sehen Sie es bekommen hat den vollständigen Pfad. 511 00:42:09,740 --> 00:42:15,920 Ich kann auch ausdrucken argv [1] und sehen, was passiert. 512 00:42:15,920 --> 00:42:20,890 >> Hier bekamen wir diese Art von mystischen Wert. 513 00:42:20,890 --> 00:42:23,890 Wir haben dieses 0x0. 514 00:42:23,890 --> 00:42:27,850 Angemeldet am Beginn der Laufzeit, wenn wir über Hexadezimalzahlen gesprochen? 515 00:42:27,850 --> 00:42:34,680 Oder dass kleine Frage am Ende des pset 0 darüber, wie 50 in hex dar? 516 00:42:34,680 --> 00:42:39,410 Die Art und Weise schreiben wir Hexadezimalzahlen in CS, nur um nicht zu verwechseln uns 517 00:42:39,410 --> 00:42:46,080 mit Dezimalzahlen, ist, dass wir immer voranstellen sie mit 0x. 518 00:42:46,080 --> 00:42:51,420 Also das Präfix 0x immer nur bedeutet, interpretieren die folgende Zahl als Hexadezimalzahl 519 00:42:51,420 --> 00:42:57,400 nicht als String, nicht als Dezimalzahl, nicht als Binärzahl. 520 00:42:57,400 --> 00:43:02,820 Da die Zahl 5-0 ist eine gültige Nummer in Hexadezimal. 521 00:43:02,820 --> 00:43:06,240 Und es ist eine Zahl in dezimaler, 50. 522 00:43:06,240 --> 00:43:10,050 So ist dies nur, wie wir eindeutig zu machen. 523 00:43:10,050 --> 00:43:14,860 So 0x0 Mittel hexadezimal 0, ebenfalls dezimal 0, binäre 0 ist. 524 00:43:14,860 --> 00:43:17,030 Es ist nur der Wert 0. 525 00:43:17,030 --> 00:43:22,630 Es stellt sich heraus, dass das ist, was null, ist eigentlich in Erinnerung. 526 00:43:22,630 --> 00:43:25,940 Null ist nur 0. 527 00:43:25,940 --> 00:43:37,010 Hier wird das Element an argv [1] gespeichert ist null. 528 00:43:37,010 --> 00:43:45,220 Also werden wir versuchen, unsere "CS50 rocks" String in eine leere Zeichenfolge zu vergleichen. 529 00:43:45,220 --> 00:43:48,130 So Dereferenzierung null, versucht, die Dinge auf null zuzugreifen, 530 00:43:48,130 --> 00:43:55,050 diese sind in der Regel werde eine Art Segmentation Fault oder andere schlimme Dinge passieren verursachen. 531 00:43:55,050 --> 00:43:59,350 Und es stellt sich heraus, dass strcmp nicht überprüfen, 532 00:43:59,350 --> 00:44:04,340 ob du in einem Wert, der null ist vergangen. 533 00:44:04,340 --> 00:44:06,370 Vielmehr, es geht voran, versucht, seine Sache zu tun, 534 00:44:06,370 --> 00:44:14,640 und wenn es Fehler seg, seg es Fehler, und es ist Ihr Problem. Du musst gehen zu beheben. 535 00:44:14,640 --> 00:44:19,730 Wirklich schnell, vielleicht, wie wir dieses Problem beheben? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Sie können mit if. 537 00:44:23,540 --> 00:44:32,240 Also, wenn argv [1] ist null, == 0, dann wieder 1 oder etwas [unverständlich]. 538 00:44:32,240 --> 00:44:34,590 >> Ja. Also das ist ein guter Weg, es zu tun, wie können wir überprüfen, um zu sehen, 539 00:44:34,590 --> 00:44:39,230 der Wert wir im Begriff, in strcmp passieren, argv [1], wird es null? 540 00:44:39,230 --> 00:44:45,830 Wenn es null, dann können wir sagen, okay, abzubrechen. 541 00:44:45,830 --> 00:44:49,450 >> Ein üblicher Weg, um dies zu tun ist, um die argc Wert zu verwenden. 542 00:44:49,450 --> 00:44:52,040 Sie können hier sehen, zu Beginn der Haupt-, 543 00:44:52,040 --> 00:44:58,040 wir weggelassen diesen ersten Test, dass wir in der Regel tun, wenn wir Befehlszeilenargumente verwenden, 544 00:44:58,040 --> 00:45:05,240 was zu testen, ob unsere argc Wert ist, was wir erwarten. 545 00:45:05,240 --> 00:45:10,290 In diesem Fall erwarten wir mindestens zwei Argumente, 546 00:45:10,290 --> 00:45:13,660 der Name des Programms plus einer anderen. 547 00:45:13,660 --> 00:45:17,140 Weil wir über das zweite Argument hier verwenden. 548 00:45:17,140 --> 00:45:21,350 So mit einer Art von Test vorher, bevor unsere strcmp Anruf 549 00:45:21,350 --> 00:45:37,390 dass die Tests, ob argv mindestens 2 ist, würde auch die gleiche Art von Ding. 550 00:45:37,390 --> 00:45:40,620 Wir können sehen, ob das funktioniert, indem Sie das Programm erneut. 551 00:45:40,620 --> 00:45:45,610 Sie können jederzeit starten Sie Ihr Programm in GDB, das ist wirklich schön. 552 00:45:45,610 --> 00:45:49,310 Sie können laufen, und wenn Sie übergeben Argumente, um Ihr Programm, 553 00:45:49,310 --> 00:45:53,060 Sie geben sie in, wenn Sie anrufen laufen, nicht, wenn Sie booten GDB. 554 00:45:53,060 --> 00:45:57,120 Auf diese Weise können Sie halten den Aufruf Ihres Programms mit verschiedenen Argumenten jeder Zeit. 555 00:45:57,120 --> 00:46:08,080 So laufen, oder wieder, ich kann r eingeben und mal sehen, was passiert, wenn wir "Hallo". 556 00:46:08,080 --> 00:46:11,140 Es wird immer gefragt, ob Sie es wieder von vorne beginnen wollen. 557 00:46:11,140 --> 00:46:17,490 Normalerweise wollen Sie es wieder von vorne beginnen. 558 00:46:17,490 --> 00:46:25,010 Und an diesem Punkt, es startet ihn wieder, druckt sie aus 559 00:46:25,010 --> 00:46:28,920 das Programm, das wir laufen, buggy1, mit dem Argument, hallo, 560 00:46:28,920 --> 00:46:32,720 und es gibt diese Norm aus, es sagt: "Sie können ein D bekommen", trauriges Gesicht. 561 00:46:32,720 --> 00:46:37,610 Aber wir haben nicht seg Fehler. Er sagte, dass Prozess beendet normal. 562 00:46:37,610 --> 00:46:39,900 Also das sieht ziemlich gut aus. 563 00:46:39,900 --> 00:46:43,050 No more seg Fehler, wir haben es geschafft Vergangenheit 564 00:46:43,050 --> 00:46:48,190 so wie es aussieht, das war in der Tat die seg Fehler Bug, den wir bekamen. 565 00:46:48,190 --> 00:46:51,540 Leider sagt es uns, dass wir immer ein D. 566 00:46:51,540 --> 00:46:54,090 >> Wir können gehen Sie zurück und schauen Sie sich den Code und sehen, was dort vor sich geht 567 00:46:54,090 --> 00:46:57,980 um herauszufinden, was war - warum es erzählt wurde, dass wir eine D. bekam 568 00:46:57,980 --> 00:47:03,690 Mal sehen, hier wurde diese printf sagen, dass Sie ein D. bekam 569 00:47:03,690 --> 00:47:08,540 Wenn wir Liste eingeben, wie Sie mit der Eingabe der Liste zu behalten, hält es Iteration nach unten durch das Programm, 570 00:47:08,540 --> 00:47:10,940 so zeigen Ihnen die ersten paar Zeilen des Programms. 571 00:47:10,940 --> 00:47:15,450 Dann wird es zeigen Ihnen die nächsten paar Zeilen, und das nächste Segment und das nächste Stück. 572 00:47:15,450 --> 00:47:18,240 Und es wird immer wieder versuchen zu gehen. 573 00:47:18,240 --> 00:47:21,180 Und nun bekommen wir auf "line Nummer 16 liegt außerhalb des Bereichs." 574 00:47:21,180 --> 00:47:23,940 Denn es hat nur 15 Zeilen. 575 00:47:23,940 --> 00:47:30,310 Wenn Sie zu diesem Punkt und Ihr fragen: "Was soll ich tun?" können Sie den Befehl help. 576 00:47:30,310 --> 00:47:34,340 Verwenden Sie helfen, und dann geben sie den Namen eines Befehls. 577 00:47:34,340 --> 00:47:36,460 Und du siehst die GDB gibt uns all diese Art von Sachen. 578 00:47:36,460 --> 00:47:43,870 Er sagt: "Ohne Argument, listet zehn Zeilen nach oder rund um den früheren Eintrag. 579 00:47:43,870 --> 00:47:47,920 List - listet die zehn Zeilen vor - " 580 00:47:47,920 --> 00:47:52,960 Lassen Sie uns also versuchen, mit Liste minus. 581 00:47:52,960 --> 00:47:57,000 Und das listet die 10 Zeilen zurück, Sie können spielen, um mit der Liste ein wenig. 582 00:47:57,000 --> 00:48:02,330 Können Sie die Liste, Liste zu tun -, können Sie sogar Liste eine Nummer, wie list 8, 583 00:48:02,330 --> 00:48:07,500 und es wird die 10 Linien um die Linie 8 aufzulisten. 584 00:48:07,500 --> 00:48:10,290 Und Sie können sehen, was hier los ist du ist eine einfache if else habe. 585 00:48:10,290 --> 00:48:13,980 Wenn Sie in CS50 Felsen geben, druckt es aus "Sie können einen A. bekommen" 586 00:48:13,980 --> 00:48:16,530 Ansonsten druckt "Sie können eine D. bekommen" 587 00:48:16,530 --> 00:48:23,770 Bummer Stadt. Gut. Ja? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] So, wenn ich tue CS50 Felsen ohne die Anführungszeichen versucht, 589 00:48:26,730 --> 00:48:29,290 er sagt: "Sie können eine D. bekommen" 590 00:48:29,290 --> 00:48:32,560 Ich brauchte die Anführungszeichen, um es zu arbeiten, warum ist das so? 591 00:48:32,560 --> 00:48:38,490 >> Ja. Es stellt sich heraus, dass, wenn - das ist ein lustiges kleines Schmankerl - 592 00:48:38,490 --> 00:48:47,900 wenn Sie das Programm ausführen, wenn wir es laufen und wir geben in CS50 Felsen, 593 00:48:47,900 --> 00:48:50,800 wie Daniel sagte er getan hat, und Sie die Eingabetaste drücken, 594 00:48:50,800 --> 00:48:52,870 es immer noch sagt, wir erhalten einen D. 595 00:48:52,870 --> 00:48:55,580 Und die Frage ist, warum? 596 00:48:55,580 --> 00:49:02,120 Und es stellt sich heraus, dass sowohl unsere Terminal und GDB diese als zwei getrennte Argumente zu analysieren. 597 00:49:02,120 --> 00:49:04,800 Denn wenn es einen Raum, der als implizit ist 598 00:49:04,800 --> 00:49:08,730 das erste Argument beendet, das nächste Argument ist zu beginnen. 599 00:49:08,730 --> 00:49:13,260 Der Weg zu den in zwei kombinieren oder sorry, in ein Argument, 600 00:49:13,260 --> 00:49:18,510 ist es, die Zitate zu verwenden. 601 00:49:18,510 --> 00:49:29,560 So jetzt, wenn wir es in Anführungszeichen und führen Sie es erneut, bekommen wir einen A. 602 00:49:29,560 --> 00:49:38,780 Also nur zur Erinnerung, sind keine Anführungszeichen, CS50 und Felsen als zwei getrennte Argumente analysiert. 603 00:49:38,780 --> 00:49:45,320 Mit Zitaten, ist es als ein Argument überhaupt analysiert. 604 00:49:45,320 --> 00:49:53,070 >> Wir können dies mit einem Haltepunkt zu sehen. 605 00:49:53,070 --> 00:49:54,920 Bisher haben wir läuft unser Programm, und es läuft 606 00:49:54,920 --> 00:49:58,230 bis sie entweder seg Fehler oder Zugriffe einen Fehler 607 00:49:58,230 --> 00:50:05,930 oder bis es beendet wurde und alle war völlig in Ordnung. 608 00:50:05,930 --> 00:50:08,360 Dies ist nicht unbedingt die hilfreiche Sache, denn manchmal 609 00:50:08,360 --> 00:50:11,840 Sie haben einen Fehler in Ihrem Programm, aber es ist nicht die Ursache einen Segmentation Fault. 610 00:50:11,840 --> 00:50:16,950 Es ist nicht die Ursache Ihres Programms zu stoppen oder so etwas. 611 00:50:16,950 --> 00:50:20,730 Der Weg zum GDB zu pausieren Sie Ihr Programm an einer bestimmten Stelle 612 00:50:20,730 --> 00:50:23,260 ist es, einen Haltepunkt zu setzen. 613 00:50:23,260 --> 00:50:26,520 Sie können dies entweder, indem Sie einen Haltepunkt auf einem Funktionsnamen 614 00:50:26,520 --> 00:50:30,770 oder Sie können einen Haltepunkt für einen bestimmten Code-Zeile gesetzt. 615 00:50:30,770 --> 00:50:34,450 Ich mag, um Haltepunkte in Funktionsnamen gesetzt, weil - leicht zu merken, 616 00:50:34,450 --> 00:50:37,700 und wenn Sie tatsächlich gehen und ändern Sie Ihren Quellcode up ein wenig, 617 00:50:37,700 --> 00:50:42,020 dann ist dein Haltepunkt wird tatsächlich an der gleichen Stelle im Code zu bleiben. 618 00:50:42,020 --> 00:50:44,760 Während, wenn Sie mit Zeilennummern und die Zeilennummern ändern 619 00:50:44,760 --> 00:50:51,740 weil Sie hinzufügen oder löschen einen Code, dann wird Ihre Haltepunkte sind alle total vermasselt. 620 00:50:51,740 --> 00:50:58,590 Einer der häufigsten Dinge, die ich tun müssen, ist einen Haltepunkt an der Hauptfunktion gesetzt. 621 00:50:58,590 --> 00:51:05,300 Oft werde ich hochfahren GDB, werde ich geben b Haupt-, Enter drücken, und dass dann einen Haltepunkt setzen 622 00:51:05,300 --> 00:51:10,630 auf der Hauptfunktion, die nur sagt, "das Programm anzuhalten, sobald Sie laufen beginnen" 623 00:51:10,630 --> 00:51:17,960 und auf diese Weise, wenn ich mein Programm laufen mit, sagen wir, CS50 Felsen als zwei Argumente 624 00:51:17,960 --> 00:51:24,830 und drücken Sie Enter, wird es an die Hauptfunktion und es hält direkt vor der ersten Zeile, 625 00:51:24,830 --> 00:51:30,620 rechts, bevor es wertet die strcmp Funktion. 626 00:51:30,620 --> 00:51:34,940 >> Da ich angehalten bin, jetzt kann ich anfangen herumschlagen und zu sehen, was los ist 627 00:51:34,940 --> 00:51:40,250 mit all den verschiedenen Variablen, die in mein Programm übergeben werden. 628 00:51:40,250 --> 00:51:43,670 Hier kann ich drucken argc und sehen, was los ist. 629 00:51:43,670 --> 00:51:50,030 Seht zu, dass argc 3 ist, denn es hat die 3 verschiedene Werte drin. 630 00:51:50,030 --> 00:51:54,060 Es den Namen des Programms hat, ist es das erste Argument und das zweite Argument bekam. 631 00:51:54,060 --> 00:52:09,330 Wir können die auszudrucken Dazu suchen Sie in argv [0], argv [1] und argv [2]. 632 00:52:09,330 --> 00:52:12,030 So, jetzt können Sie auch sehen, warum dies strcmp Anruf wird zum Scheitern verurteilt, 633 00:52:12,030 --> 00:52:21,650 weil Sie sehen, dass es hat den CS50 und die Felsen in zwei getrennte Argumente aufgeteilt. 634 00:52:21,650 --> 00:52:27,250 An diesem Punkt, wenn Sie einen Haltepunkt getroffen haben, können Sie weiterhin durch Ihr Programm fort 635 00:52:27,250 --> 00:52:32,920 Zeile für Zeile, wie dem Starten Sie das Programm erneut gegenüber. 636 00:52:32,920 --> 00:52:35,520 Also, wenn Sie nicht möchten, dass Sie das Programm erneut und starten Sie einfach weiter von hier, 637 00:52:35,520 --> 00:52:41,970 können Sie die continue-Befehl und weiterhin wird das Programm bis zum Ende laufen. 638 00:52:41,970 --> 00:52:45,010 So wie es hier getan hat. 639 00:52:45,010 --> 00:52:54,880 Allerdings, wenn ich das Programm, CS50 Felsen starten, trifft es meiner Haltepunkt wieder 640 00:52:54,880 --> 00:52:59,670 und dieses Mal, wenn ich will nicht einfach gehen den ganzen Weg durch den Rest des Programms, 641 00:52:59,670 --> 00:53:08,040 Ich kann den nächsten Befehl, die ich auch mit n abkürzen. 642 00:53:08,040 --> 00:53:12,960 Und dies wird durch das Programm Zeile für Zeile fort. 643 00:53:12,960 --> 00:53:17,530 So können Sie sehen, wie die Dinge auszuführen, als Variablen ändern, wie die Dinge aktualisiert. 644 00:53:17,530 --> 00:53:21,550 Welches ist ziemlich nett. 645 00:53:21,550 --> 00:53:26,570 Die andere coole Sache ist, anstatt wiederholen Sie den gleichen Befehl immer und immer und immer wieder, 646 00:53:26,570 --> 00:53:30,670 wenn Sie traf nur eingeben - so hier sehen, habe ich an nichts eingegeben - 647 00:53:30,670 --> 00:53:33,780 wenn ich getroffen Geben Sie einfach wird es wiederholen Sie den vorherigen Befehl 648 00:53:33,780 --> 00:53:36,900 oder die vorherige GDB Befehl, dass ich gerade auf in. 649 00:53:36,900 --> 00:53:56,000 Ich kann mich Enter drücken und es wird immer das Schreiten durch meinen Code Zeile für Zeile. 650 00:53:56,000 --> 00:53:59,310 Ich möchte Sie ermutigen euch zu gehen einige der anderen buggy Programme. 651 00:53:59,310 --> 00:54:01,330 Wir haben keine Zeit, um durch alle von ihnen heute in Abschnitt erhalten. 652 00:54:01,330 --> 00:54:05,890 Der Quellcode ist es, so kann man irgendwie sehen, was los ist 653 00:54:05,890 --> 00:54:07,730 Blick hinter die Kulissen, wenn Sie wirklich nicht weiterkommen, 654 00:54:07,730 --> 00:54:11,940 aber zumindest, nur üben Hochfahren GDB, 655 00:54:11,940 --> 00:54:13,940 läuft das Programm bis es auf Sie bricht, 656 00:54:13,940 --> 00:54:18,260 immer die Rückverfolgung, herauszufinden, welche Funktion der Absturz war, 657 00:54:18,260 --> 00:54:24,450 welche Linie war es, der Druck einige Variablenwerte 658 00:54:24,450 --> 00:54:30,140 nur damit du ein Gefühl dafür bekommen, weil das wirklich helfen Ihnen für die Zukunft. 659 00:54:30,140 --> 00:54:36,340 An dieser Stelle werden wir beenden von GDB, die Sie mit zu beenden oder einfach nur q. 660 00:54:36,340 --> 00:54:40,460 Ist Ihr Programm in der Mitte läuft noch, und es hat nicht verlassen, 661 00:54:40,460 --> 00:54:43,510 es wird immer fragen: "Sind Sie sicher, dass Sie wirklich wollen, zu beenden?" 662 00:54:43,510 --> 00:54:48,770 Sie können einfach auf yes. 663 00:54:48,770 --> 00:54:55,250 >> Jetzt werden wir bei der nächsten Problem, das wir haben, was die Katze Programm aussehen. 664 00:54:55,250 --> 00:54:59,880 Wenn Sie die Kurzform zum Umleiten und Rohre zu sehen, werden Sie sehen, dass Tommy dieses Programm verwendet 665 00:54:59,880 --> 00:55:07,540 das im Grunde druckt alle die Ausgabe einer Datei auf dem Bildschirm. 666 00:55:07,540 --> 00:55:12,660 Also, wenn ich cat laufen, ist dies eigentlich ein eingebautes Programm auf das Gerät, 667 00:55:12,660 --> 00:55:16,860 und wenn du Macs haben, können Sie diese auf Ihrem Mac zu tun, wenn Sie eröffnen Terminal. 668 00:55:16,860 --> 00:55:25,630 Und wir - Katze, sagen wir mal, cp.c, und drücken Sie Enter. 669 00:55:25,630 --> 00:55:29,640 Was dies tat, wenn wir nach oben ein wenig und sehen, wo wir die Linie lief, 670 00:55:29,640 --> 00:55:40,440 oder wo wir den Befehl cat lief es buchstäblich nur den Inhalt des cp.c unsere Siebdruck. 671 00:55:40,440 --> 00:55:44,140 Wir können es wieder zu laufen und Sie können in mehrere Dateien zusammen. 672 00:55:44,140 --> 00:55:49,880 So kann man tun, cat cp.c, und dann können wir auch verketten Sie die Cat.C Datei, 673 00:55:49,880 --> 00:55:53,250 das ist das Programm, die wir hier schreiben, 674 00:55:53,250 --> 00:55:58,140 und es wird beide Dateien zurück drucken zu unserem Bildschirm zurück. 675 00:55:58,140 --> 00:56:05,490 Also, wenn wir ein wenig blättern, sehen wir, dass, wenn wir liefen diese Katze cp.c, Cat.C, 676 00:56:05,490 --> 00:56:17,110 Zuerst ausgedruckt der cp-Datei, und dann darunter, druckte es aus den Cat.C Datei direkt hier unten. 677 00:56:17,110 --> 00:56:19,650 Wir werden diese nutzen, um nur unsere Füße nass. 678 00:56:19,650 --> 00:56:25,930 Spielen Sie mit einfachen Druck auf das Terminal, zu sehen, wie das funktioniert. 679 00:56:25,930 --> 00:56:39,170 Wenn euch eröffnen mit gedit Cat.C, drücken Sie Enter, 680 00:56:39,170 --> 00:56:43,760 Sie können das Programm sehen, dass wir über Sie schreiben sollen. 681 00:56:43,760 --> 00:56:48,980 Wir haben dieses schöne Kesselblech enthalten, so haben wir keine Zeit zu verbringen Eingabe all diese heraus. 682 00:56:48,980 --> 00:56:52,310 Wir prüfen auch die Anzahl der übergebenen Argumente in. 683 00:56:52,310 --> 00:56:56,910 Wir drucken eine schöne Nutzung Nachricht. 684 00:56:56,910 --> 00:57:00,950 >> Dies ist die Art von Dingen, die wieder, wie über die wir gesprochen haben, 685 00:57:00,950 --> 00:57:04,490 es ist fast wie Muskel-Speicher. 686 00:57:04,490 --> 00:57:07,190 Denken Sie daran zu halten, die die gleiche Art von Sachen 687 00:57:07,190 --> 00:57:11,310 und immer Ausdruck einer Art hilfreiche Botschaft 688 00:57:11,310 --> 00:57:17,670 so, dass die Menschen wissen, wie man das Programm auszuführen. 689 00:57:17,670 --> 00:57:21,630 Mit Katze, ist es recht einfach, wir sind gerade dabei, durch all die verschiedenen Argumente gehen 690 00:57:21,630 --> 00:57:24,300 Das waren unsere Programm übergeben, und wir Drucklegung 691 00:57:24,300 --> 00:57:29,950 deren Inhalte heraus zu dem Bildschirm nacheinander. 692 00:57:29,950 --> 00:57:35,670 Um Dateien ausdrucken, um den Bildschirm, werden wir etwas sehr Ähnliches zu tun 693 00:57:35,670 --> 00:57:38,120 was wir haben am Ende des Quiz. 694 00:57:38,120 --> 00:57:45,350 Am Ende des Quiz, das Programm einzustellen, mussten wir öffnen eine Datei, 695 00:57:45,350 --> 00:57:48,490 und dann mussten wir sie zu drucken. 696 00:57:48,490 --> 00:57:54,660 In diesem Fall werden wir eröffnen eine Datei aus, und wir werden von ihm lesen, statt. 697 00:57:54,660 --> 00:58:00,630 Dann haben wir Drucklegung, statt in einer Datei sind, werden wir auf dem Bildschirm auszugeben. 698 00:58:00,630 --> 00:58:05,830 So Drucken auf dem Bildschirm alles getan habe, bevor mit printf. 699 00:58:05,830 --> 00:58:08,290 Also das ist nicht zu verrückt. 700 00:58:08,290 --> 00:58:12,190 Aber das Lesen einer Datei ist irgendwie seltsam. 701 00:58:12,190 --> 00:58:17,300 Wir werden durch die ein wenig in einer Zeit, zu gehen. 702 00:58:17,300 --> 00:58:20,560 Wenn euch zurück zu diesem letzten Problem auf Ihrem Quiz, Problem 33, 703 00:58:20,560 --> 00:58:27,280 die erste Zeile, dass wir hier tun, die Datei zu öffnen, ist sehr ähnlich zu dem, was wir taten es. 704 00:58:27,280 --> 00:58:36,370 So Stella, was bedeutet, dass die Zeile aussehen, wenn wir eine Datei zu öffnen? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, Datei - >> Okay. >> - Gleich fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Die in diesem Fall? Es ist in dem Kommentar. 707 00:58:55,980 --> 00:59:06,930 >> Es ist in dem Kommentar? argv [i] und r? 708 00:59:06,930 --> 00:59:11,300 >> Genau. Right on. So Stella ist völlig richtig. 709 00:59:11,300 --> 00:59:13,720 Dies ist, was die Linie aussieht. 710 00:59:13,720 --> 00:59:19,670 Wir werden ein Datei-Stream Variablen zu erhalten, bewahren Sie sie in einem FILE *, so dass alle Kappen, 711 00:59:19,670 --> 00:59:25,720 FILE, * und der Name dieser Variable Datei zu sein. 712 00:59:25,720 --> 00:59:32,250 Wir könnten es, was wir wollen. Wir könnten es first_file oder file_i, was wir möchten. 713 00:59:32,250 --> 00:59:37,590 Und dann der Name der Datei in der Kommandozeile zu diesem Programm weitergegeben. 714 00:59:37,590 --> 00:59:44,450 So ist es in argv gespeicherten [i] und dann werden wir diese Datei im Lese-Modus öffnen. 715 00:59:44,450 --> 00:59:48,100 Nun, da wir die Datei geöffnet, was ist das, was wir immer daran denken, zu tun 716 00:59:48,100 --> 00:59:52,230 wenn wir eine Datei geöffnet? Schließen Sie es. 717 00:59:52,230 --> 00:59:57,220 So Missy, wie können wir eine Datei schließen? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (Datei) >> fclose (Datei). Genau. 719 01:00:01,020 --> 01:00:05,340 Great. Okay. Wenn wir uns dies Kommentar hier tun, 720 01:00:05,340 --> 01:00:11,940 es sagt, "Open argv [i], und drucken den Inhalt auf die Standardausgabe." 721 01:00:11,940 --> 01:00:15,460 >> Standardausgabe ist ein komischer Name. Stdout ist nur unsere Art zu sagen, 722 01:00:15,460 --> 01:00:22,880 wir wollen es auf dem Terminal, wir wollen es auf die Standardausgabe zu drucken. 723 01:00:22,880 --> 01:00:26,450 Wir können tatsächlich loszuwerden dieser Kommentar hier richtig. 724 01:00:26,450 --> 01:00:36,480 Ich werde es zu kopieren und da das ist, was wir taten. 725 01:00:36,480 --> 01:00:41,290 An diesem Punkt, jetzt haben wir die Datei Bit für Bit zu lesen. 726 01:00:41,290 --> 01:00:46,300 Wir haben ein paar Möglichkeiten, das Lesen von Dateien diskutiert. 727 01:00:46,300 --> 01:00:51,830 Welche sind Ihre Favoriten so weit? 728 01:00:51,830 --> 01:00:57,960 Welche Möglichkeiten haben Sie gesehen oder erinnern Sie sich an, um Dateien zu lesen? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? So fread ist eins. Jimmy, kennen Sie einen anderen? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Nein >> Okay. Nope. Charlotte? Alexander? Alle anderen? Okay. 731 01:01:12,150 --> 01:01:20,740 So die anderen sind fgetc, wird ein, dass wir eine Menge zu verwenden. 732 01:01:20,740 --> 01:01:26,410 Es gibt auch fscanf; euch hier ein Muster? 733 01:01:26,410 --> 01:01:29,170 Sie sind alle mit f beginnen. Alles, was mit einer Datei zu tun. 734 01:01:29,170 --> 01:01:35,260 Es gibt fread, fgetc, fscanf. Das sind all die Lesefunktionen. 735 01:01:35,260 --> 01:01:49,120 Zum Schreiben haben wir fwrite, haben wir fputc statt fgetc. 736 01:01:49,120 --> 01:01:58,250 Wir haben auch fprintf wie wir sahen, auf dem Quiz. 737 01:01:58,250 --> 01:02:01,680 Da es sich um ein Problem, das Lesen von einer Datei umfasst, 738 01:02:01,680 --> 01:02:04,940 werden wir eine dieser drei Funktionen zu nutzen. 739 01:02:04,940 --> 01:02:10,890 Wir gehen nicht, um diese Funktionen zu nutzen hier unten. 740 01:02:10,890 --> 01:02:14,880 Diese Funktionen sind alle in der Standard-I / O Bibliothek gefunden. 741 01:02:14,880 --> 01:02:17,510 Also, wenn Sie schauen an der Spitze dieses Programms 742 01:02:17,510 --> 01:02:24,110 Sie können sehen, dass wir bereits die Header-Datei für die Standard I / O-Bibliothek enthalten. 743 01:02:24,110 --> 01:02:27,120 Wenn wir herausfinden wollen, welche, die wir verwenden möchten, 744 01:02:27,120 --> 01:02:29,690 können wir immer öffnen die man pages. 745 01:02:29,690 --> 01:02:34,350 So können wir geben Menschen stdio 746 01:02:34,350 --> 01:02:43,180 und lesen Sie alles über die stdio Input-und Output-Funktionen in C. 747 01:02:43,180 --> 01:02:49,870 Und jetzt können wir sehen, oh, schau mal. Es ist zu erwähnen fgetc, es zu erwähnen fputc. 748 01:02:49,870 --> 01:02:57,220 So können Sie einen Drilldown ein wenig und schauen, sagen wir, fgetc 749 01:02:57,220 --> 01:03:00,060 und ihrem Mann zu sehen. 750 01:03:00,060 --> 01:03:03,430 Sie können sehen, dass es entlang geht mit einer ganzen Reihe von anderen Funktionen: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, bekommt, ungetc, und seine Eingabe von Zeichen und Zeichenketten. 752 01:03:12,640 --> 01:03:19,180 Also das ist, wie wir in Zeichen und Zeichenketten gelesen von Dateien von der Standardeingabe, 753 01:03:19,180 --> 01:03:21,990 die im wesentlichen von dem Benutzer. 754 01:03:21,990 --> 01:03:24,780 Und dies ist, wie wir es tun in der tatsächlichen C. 755 01:03:24,780 --> 01:03:30,850 So ist dies nicht mit der GetString und GetChar Funktionen 756 01:03:30,850 --> 01:03:36,840 dass wir verwendet von der CS50-Bibliothek. 757 01:03:36,840 --> 01:03:39,710 Wir werden dieses Problem in ein paar Möglichkeiten zu tun 758 01:03:39,710 --> 01:03:43,430 so dass Sie sehen können auf zwei verschiedene Arten, es zu tun. 759 01:03:43,430 --> 01:03:48,490 Sowohl die fread Funktion, Daniel erwähnt und fgetc sind gute Möglichkeiten, es zu tun. 760 01:03:48,490 --> 01:03:53,790 Ich denke fgetc ist ein wenig einfacher, weil es nur, wie Sie sehen, 761 01:03:53,790 --> 01:03:59,660 ein Argument, das FILE *, dass wir versuchen, den Charakter von dieser gelesen 762 01:03:59,660 --> 01:04:02,740 und der Rückgabewert ist ein int. 763 01:04:02,740 --> 01:04:05,610 Und das ist ein wenig verwirrend, nicht wahr? 764 01:04:05,610 --> 01:04:11,450 >> Weil wir immer ein Zeichen sind, also warum nicht diese Rückkehr ein char? 765 01:04:11,450 --> 01:04:18,700 Ihr habt irgendwelche Ideen, woran das liegen könnte nicht wieder ein char? 766 01:04:18,700 --> 01:04:25,510 [Missy Antworten unverständlich] >> Ja. So Missy ist völlig richtig. 767 01:04:25,510 --> 01:04:31,570 Wenn es ASCII ist, dann ist diese Zahl könnte zu einem tatsächlichen char zugeordnet werden. 768 01:04:31,570 --> 01:04:33,520 Könnte ein ASCII-Zeichen sein, und das ist richtig. 769 01:04:33,520 --> 01:04:36,220 Das ist genau das, was passiert. 770 01:04:36,220 --> 01:04:39,190 Wir verwenden einen int einfach weil es mehr Bits hat. 771 01:04:39,190 --> 01:04:44,750 Es ist größer als ein char, unsere char nur 8 Bit, dass 1 Byte auf unserer 32-Bit-Maschinen. 772 01:04:44,750 --> 01:04:48,520 Und ein int hat alle 4 bytes 'im Wert von Raum. 773 01:04:48,520 --> 01:04:50,940 Und es stellt sich heraus, dass der Weg fgetc funktioniert, 774 01:04:50,940 --> 01:04:53,940 Wenn wir in unserem Exposé blättern in dieser Manpage ein wenig, 775 01:04:53,940 --> 01:05:05,000 scrollen Sie ganz nach unten. Es stellt sich heraus, dass sie diesen besonderen Wert namens EOF verwenden. 776 01:05:05,000 --> 01:05:09,640 Es ist eine spezielle Konstante als Rückgabewert der fgetc Funktion 777 01:05:09,640 --> 01:05:14,570 wenn Sie traf das Ende der Datei oder, wenn Sie eine Fehlermeldung erhalten. 778 01:05:14,570 --> 01:05:18,170 Und es stellt sich heraus, dass diese Vergleiche mit EOF richtig zu machen, 779 01:05:18,170 --> 01:05:24,060 Sie wollen, dass zusätzliche Menge an Informationen, die Sie in einem int haben 780 01:05:24,060 --> 01:05:28,420 um mit einem char-Variable entgegen. 781 01:05:28,420 --> 01:05:32,130 Obwohl fgetc effektiv immer ein Zeichen aus einer Datei, 782 01:05:32,130 --> 01:05:38,450 Sie wollen sich daran zu erinnern, dass es wieder etwas, das vom Typ int ist für Sie. 783 01:05:38,450 --> 01:05:41,360 Das heißt, es ist ziemlich einfach zu bedienen. 784 01:05:41,360 --> 01:05:44,960 Es wird uns ein Zeichen, so alles, was wir tun müssen, ist immer wieder die Datei, 785 01:05:44,960 --> 01:05:48,440 "Gib mir das nächste Zeichen, gib mir das nächste Zeichen, gib mir das nächste Zeichen" 786 01:05:48,440 --> 01:05:51,400 bis wir an das Ende der Datei erhalten. 787 01:05:51,400 --> 01:05:54,730 Und das wird in ein Zeichen zu einem Zeitpunkt aus unserer Datei ziehen, 788 01:05:54,730 --> 01:05:56,250 und dann können wir tun, was wir mit ihm gefällt. 789 01:05:56,250 --> 01:06:00,160 Wir können es speichern, können wir es in einen String hinzufügen, können wir es auszudrucken. 790 01:06:00,160 --> 01:06:04,630 Führen Sie dafür. 791 01:06:04,630 --> 01:06:09,600 >> Zoomen wieder aus und gehen zurück zu unserem Cat.C Programm 792 01:06:09,600 --> 01:06:16,170 wenn wir gehen zu fgetc verwenden, 793 01:06:16,170 --> 01:06:21,710 wie können wir nähern dieses nächste Codezeile? 794 01:06:21,710 --> 01:06:26,020 Wir gehen zu bedienen - fread etwas etwas anders zu tun. 795 01:06:26,020 --> 01:06:32,600 Und dieses Mal sind wir gerade dabei, fgetc verwenden, um ein Zeichen zu einem Zeitpunkt erhalten. 796 01:06:32,600 --> 01:06:40,910 Um eine komplette Datei zu verarbeiten, könnte das, was wir zu tun haben? 797 01:06:40,910 --> 01:06:44,030 Wie viele Zeichen sind in einer Datei? 798 01:06:44,030 --> 01:06:47,390 Es gibt eine Menge. So wollen Sie wahrscheinlich, eins zu bekommen 799 01:06:47,390 --> 01:06:49,860 und erhalten dann eine andere und bekommen eine andere und bekommen eine andere. 800 01:06:49,860 --> 01:06:53,330 Welche Art von Algorithmus denken Sie, wir müssten hier verwenden? 801 01:06:53,330 --> 01:06:55,470 Welche Art von -? [Alexander] Eine for-Schleife? >> Genau. 802 01:06:55,470 --> 01:06:57,500 Eine bestimmte Art der Schleife. 803 01:06:57,500 --> 01:07:03,380 Eine for-Schleife ist eigentlich toll, in diesem Fall. 804 01:07:03,380 --> 01:07:08,620 Und wie du sagst, es klingt wie Sie eine Schleife über die gesamte Datei möchten, 805 01:07:08,620 --> 01:07:11,820 immer ein Zeichen in einer Zeit. 806 01:07:11,820 --> 01:07:13,850 Irgendwelche Vorschläge auf, was das aussehen könnte? 807 01:07:13,850 --> 01:07:22,090 [Alexander, unverständlich] 808 01:07:22,090 --> 01:07:30,050 >> Okay, sag mir in Englisch, was du versuchst zu tun? [Alexander, unverständlich] 809 01:07:30,050 --> 01:07:36,270 Also in diesem Fall, es klingt wie wir nur versuchen, eine Schleife über die gesamte Datei. 810 01:07:36,270 --> 01:07:45,330 [Alexander] So i > Die Größe -? 811 01:07:45,330 --> 01:07:49,290 Ich denke, die Größe der Datei, nicht wahr? Die Größe - wir werden einfach schreiben es so. 812 01:07:49,290 --> 01:07:57,470 Größe der Datei für die vorerst i + +. 813 01:07:57,470 --> 01:08:04,610 So stellt sich heraus, dass die Möglichkeit, dies mit nicht fgetc, und das ist neu, 814 01:08:04,610 --> 01:08:10,460 ist, dass es keine einfache Möglichkeit, nur erhalten, die Größe einer Datei 815 01:08:10,460 --> 01:08:16,979 mit diesem "sizeof" Art der Konstruktion, dass Sie bisher gesehen haben. 816 01:08:16,979 --> 01:08:20,910 Wenn wir diese fgetc Funktion zu nutzen, sind wir die Einführung eine Art von 817 01:08:20,910 --> 01:08:29,069 neuen, funky Syntax diese for-Schleife, wo anstatt nur eine einfache Zähler 818 01:08:29,069 --> 01:08:33,920 zum Zeichen für Zeichen zu gehen, werden wir ein Zeichen in einer Zeit zu ziehen, 819 01:08:33,920 --> 01:08:37,120 ein Zeichen in einer Zeit, und die Art, wie wir wissen, dass wir am Ende 820 01:08:37,120 --> 01:08:41,290 nicht, wenn wir eine bestimmte Anzahl von Zeichen gezählt, 821 01:08:41,290 --> 01:08:49,939 aber wenn der Charakter ziehen wir darauf hin, dass spezielle Ende der Datei Zeichen ist. 822 01:08:49,939 --> 01:08:58,689 So können wir dies tun, indem Sie - ich nenne diese ch, und wir werden um es zu initialisieren 823 01:08:58,689 --> 01:09:08,050 mit unserem ersten Anruf um das erste Zeichen aus der Datei zu erhalten. 824 01:09:08,050 --> 01:09:14,979 So dass dieser Teil hier, das wird ein Zeichen raus aus der Datei 825 01:09:14,979 --> 01:09:20,840 und speichern Sie es in die Variable ch. 826 01:09:20,840 --> 01:09:25,420 Wir werden weiter machen, bis wir an das Ende der Datei, 827 01:09:25,420 --> 01:09:41,170 denen wir durch die Prüfung für den Charakter nicht gleich zu diesem speziellen EOF-Zeichen. 828 01:09:41,170 --> 01:09:48,750 Und dann anstatt das zu tun ch + +, würde die nur erhöhen Sie den Wert, 829 01:09:48,750 --> 01:09:52,710 so, wenn wir lesen, ein A aus der Datei, ein großes A, sagen wir, 830 01:09:52,710 --> 01:09:56,810 ch + + würde uns b, und dann würden wir c und dann d erhalten. 831 01:09:56,810 --> 01:09:59,310 Das ist eindeutig nicht das, was wir wollen. Was wir wollen hier 832 01:09:59,310 --> 01:10:05,830 in diesem letzten Bit wollen wir das nächste Zeichen aus der Datei zu erhalten. 833 01:10:05,830 --> 01:10:09,500 >> Also, wie können wir Sie das nächste Zeichen aus der Datei? 834 01:10:09,500 --> 01:10:13,470 Wie bekommen wir das erste Zeichen aus der Datei? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc oder, sorry, du warst ganz rechts. 836 01:10:17,200 --> 01:10:20,470 I falsch es genau dort. So yeah. 837 01:10:20,470 --> 01:10:26,240 Hier anstatt das zu tun ch + +, 838 01:10:26,240 --> 01:10:29,560 wir gerade dabei, fgetc (Datei) erneut aufrufen 839 01:10:29,560 --> 01:10:39,180 und speichern das Ergebnis in unserem selben Lm variabel. 840 01:10:39,180 --> 01:10:43,730 [Studenten Frage unverständlich] 841 01:10:43,730 --> 01:10:52,390 >> Das ist, wo diese FILE * Jungs Besonderes sind. 842 01:10:52,390 --> 01:10:59,070 Die Art, wie sie arbeiten, ist, dass sie - wenn man zum ersten Mal öffnen - wenn Sie zunächst, dass fopen Anruf 843 01:10:59,070 --> 01:11:04,260 Die Datei * dient effektiv als ein Zeiger auf den Anfang der Datei. 844 01:11:04,260 --> 01:11:12,830 Und dann jedes Mal, rufen Sie fgetc, bewegt sie sich ein Charakter durch die Datei. 845 01:11:12,830 --> 01:11:23,280 Also, wenn Sie diese aufrufen, du Inkrementieren der Dateizeiger um ein Zeichen. 846 01:11:23,280 --> 01:11:26,210 Und wenn du dich wieder fgetc, du Verschieben anderes Zeichen 847 01:11:26,210 --> 01:11:28,910 und ein anderer Charakter und einen anderen Charakter und ein anderes Zeichen. 848 01:11:28,910 --> 01:11:32,030 [Studenten Frage unverständlich] >> Und that's - yeah. 849 01:11:32,030 --> 01:11:34,810 Es ist eine Art dieser Magie unter der Haube. 850 01:11:34,810 --> 01:11:37,930 Sie halten gerade Inkrementieren durch. 851 01:11:37,930 --> 01:11:46,510 An diesem Punkt sind Sie in der Lage, tatsächlich mit einem Charakter zu arbeiten. 852 01:11:46,510 --> 01:11:52,150 Also, wie können wir drucken Sie auf den Bildschirm, jetzt? 853 01:11:52,150 --> 01:11:58,340 Wir können die gleiche printf, was wir vorher benutzt. 854 01:11:58,340 --> 01:12:00,330 Dass wir seit über alle Semester. 855 01:12:00,330 --> 01:12:05,450 Wir können printf nennen, 856 01:12:05,450 --> 01:12:21,300 und wir können in den Charakter einfach so passieren. 857 01:12:21,300 --> 01:12:27,430 Ein anderer Weg, es zu tun, anstatt printf und mit diesen Format-String zu tun, 858 01:12:27,430 --> 01:12:29,490 können wir auch eine der anderen Funktionen. 859 01:12:29,490 --> 01:12:40,090 Wir können fputc, die ein Zeichen auf dem Bildschirm ausgibt, 860 01:12:40,090 --> 01:12:52,580 außer wenn wir fputc aussehen - lassen Sie mich Verkleinern ein wenig. 861 01:12:52,580 --> 01:12:56,430 Wir sehen, was schön ist, dauert es im Charakter, dass wir lesen mit fgetc, 862 01:12:56,430 --> 01:13:05,100 aber dann müssen wir ihm einen Stream zu drucken. 863 01:13:05,100 --> 01:13:11,850 Wir können auch die putchar Funktion, die direkt gestellt wird die Standardausgabe. 864 01:13:11,850 --> 01:13:16,070 So gibt es eine ganze Reihe von verschiedenen Optionen, die wir für den Druck verwenden können. 865 01:13:16,070 --> 01:13:19,580 Sie sind alle in der Standard-I / O-Bibliothek. 866 01:13:19,580 --> 01:13:25,150 Wann immer Sie drucken wollen - so printf, standardmäßig wird die spezielle Standard-Out-Stream zu drucken, 867 01:13:25,150 --> 01:13:27,910 nämlich dass stdout. 868 01:13:27,910 --> 01:13:41,300 So können wir nur darauf verweisen, wie Art dieser magischen Wert, stdout hier. 869 01:13:41,300 --> 01:13:48,410 Oops. Legen Sie das Semikolon außen. 870 01:13:48,410 --> 01:13:52,790 >> Das ist eine Menge von neuen, funky Informationen hier. 871 01:13:52,790 --> 01:13:58,600 Eine Menge davon ist sehr idiomatisch, in dem Sinne, daß dieser Code ist 872 01:13:58,600 --> 01:14:05,700 das ist so geschrieben, nur weil es sauber ist zu lesen, leicht zu lesen. 873 01:14:05,700 --> 01:14:11,520 Es gibt viele verschiedene Möglichkeiten, es zu tun, viele verschiedene Funktionen, die Sie nutzen können, 874 01:14:11,520 --> 01:14:14,680 aber wir neigen dazu, folgen Sie einfach diesen gleichen Muster über und über. 875 01:14:14,680 --> 01:14:20,180 Also nicht wundern, wenn Sie Code wie diesen kommen immer wieder sehen werden. 876 01:14:20,180 --> 01:14:25,690 Gut. An diesem Punkt müssen wir für den Tag zu brechen. 877 01:14:25,690 --> 01:14:31,300 Danke fürs Kommen. Danke fürs Zuschauen, wenn Sie online sind. Und wir sehen uns nächste Woche. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]