1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> SPRECHER: Bisher ist es wahrscheinlich, dass die meisten Ihrer Programme 3 00:00:07,870 --> 00:00:10,170 haben ein bisschen vergänglich. 4 00:00:10,170 --> 00:00:13,310 Sie führen ein Programm wie Mario oder gierig. 5 00:00:13,310 --> 00:00:17,350 Es tut etwas, es möglicherweise aufgefordert, der Benutzer nach Informationen, 6 00:00:17,350 --> 00:00:20,400 Drucken etwas auf dem Bildschirm ausgegeben, aber dann, wenn Ihr Programm ist vorbei, 7 00:00:20,400 --> 00:00:23,252 es gibt wirklich keine Beweise gibt es wurde immer in erster Linie laufen. 8 00:00:23,252 --> 00:00:25,960 Ich meine, sicher, könnten Sie verlassen haben, es im Terminal-Fenster zu öffnen, 9 00:00:25,960 --> 00:00:29,770 aber wenn Sie Ihr Bildschirm zu löschen, gibt es wirklich keine Beweise dafür, dass es existierte. 10 00:00:29,770 --> 00:00:33,720 Wir haben nicht ein Mittel zur Speicherung haben persistente Informationen, Daten 11 00:00:33,720 --> 00:00:36,890 nach unserem was existiert Programm nicht mehr läuft, 12 00:00:36,890 --> 00:00:39,241 oder wir müssen nicht bis zu diesem Punkt. 13 00:00:39,241 --> 00:00:41,490 Glücklicherweise aber macht c geben Sie uns die Möglichkeit, 14 00:00:41,490 --> 00:00:44,220 dies durch die Implementierung zu tun so genannte 15 00:00:44,220 --> 00:00:48,330 eine Datei, eine Struktur, die im Grunde eine Datei, die Sie verdoppeln würde 16 00:00:48,330 --> 00:00:53,826 Klicken Sie auf Ihrem Computer, wenn Sie auf einer grafischen Benutzerumgebung. 17 00:00:53,826 --> 00:00:55,700 Generell bei der Arbeit mit c, wir sind tatsächlich 18 00:00:55,700 --> 00:00:59,965 gehen, um mit zu arbeiten Zeiger auf Datei files-- stars-- 19 00:00:59,965 --> 00:01:02,090 außer für ein wenig wenn wir über ein paar sprechen 20 00:01:02,090 --> 00:01:04,560 der Funktionen, arbeiten mit Dateizeiger. 21 00:01:04,560 --> 00:01:08,990 Sie brauchen nicht, um wirklich gegraben haben zu tief in das Verständnis Zeigern 22 00:01:08,990 --> 00:01:09,730 sich. 23 00:01:09,730 --> 00:01:12,870 Es ist ein wenig klein wenig wo wir über sie zu sprechen, 24 00:01:12,870 --> 00:01:18,090 aber im allgemeinen Dateizeiger und Zeiger, während miteinander, 25 00:01:18,090 --> 00:01:20,290 nicht genau dasselbe. 26 00:01:20,290 --> 00:01:22,440 >> Nun, was ich meine, wenn Ich sage, persistente Daten? 27 00:01:22,440 --> 00:01:23,650 Was ist persistenten Daten? 28 00:01:23,650 --> 00:01:25,232 Warum brauchen wir darum kümmern? 29 00:01:25,232 --> 00:01:27,190 Sagen Sie zum Beispiel, dass Sie ein Programm sind 30 00:01:27,190 --> 00:01:29,850 oder Sie umgeschrieben habe ein Programm, das ein Spiel ist, 31 00:01:29,850 --> 00:01:32,960 und Sie den Überblick behalten wollen aller Bewegungen des Benutzers 32 00:01:32,960 --> 00:01:36,620 so dass vielleicht, wenn etwas schief geht, können Sie die Datei nach dem Spiel überprüfen. 33 00:01:36,620 --> 00:01:39,970 Das ist, was wir meinen, wenn wir sprechen über persistente Daten. 34 00:01:39,970 --> 00:01:43,930 >> Im Zuge der Ausführung Ihrer Programm wird eine Datei erstellt. 35 00:01:43,930 --> 00:01:45,680 Und wenn Ihr Programm nicht mehr läuft, 36 00:01:45,680 --> 00:01:48,689 die Datei noch vorhanden ist auf Ihrem System. 37 00:01:48,689 --> 00:01:50,230 Und wir können es zu betrachten und untersuchen es. 38 00:01:50,230 --> 00:01:53,670 Und so, dass Programm würde eingestellt werden haben einige persistente Daten erstellt, 39 00:01:53,670 --> 00:01:57,390 Daten nach dem Programm vorhandenen Ausführung beendet ist. 40 00:01:57,390 --> 00:02:02,320 >> Jetzt alle diese Funktionen, die funktionieren mit dem Erstellen von Dateien und Bearbeiten 41 00:02:02,320 --> 00:02:04,940 sie auf verschiedene Weise leben in Standard io.h, 42 00:02:04,940 --> 00:02:08,210 die eine Header-Datei, Sie haben wahrscheinlich schon Pfund 43 00:02:08,210 --> 00:02:10,910 einschließlich der an der Spitze der hübschen viel alle Ihre Programme 44 00:02:10,910 --> 00:02:14,130 weil es eines der enthält nützlichsten Funktionen für uns, 45 00:02:14,130 --> 00:02:16,130 printf, die auch erlaubt lebt in Standard io.h 46 00:02:16,130 --> 00:02:20,400 So dass Sie nicht brauchen, um zu hämmern schließen zusätzliche Dateien wahrscheinlich 47 00:02:20,400 --> 00:02:23,540 , um mit der Dateizeiger zu arbeiten. 48 00:02:23,540 --> 00:02:29,980 >> Nun jedes einzelne Datei Zeigerfunktion, oder jede einzelne Datei-I / O, Input-Output- 49 00:02:29,980 --> 00:02:33,310 Funktion übernimmt als einer seiner Parameter oder Eingaben 50 00:02:33,310 --> 00:02:35,822 eine Datei pointer-- Ausnahme für ein, fopen, die 51 00:02:35,822 --> 00:02:38,280 ist, was Sie verwenden, um die Datei herunterzuladen Zeiger in den ersten Platz. 52 00:02:38,280 --> 00:02:41,010 Aber nachdem Sie geöffnet haben die Datei und Sie Dateizeiger zu erhalten, 53 00:02:41,010 --> 00:02:43,510 Anschließend können Sie sie als Argumente für die verschiedenen Funktionen, 54 00:02:43,510 --> 00:02:46,720 wir werden darüber reden heute, ebenso wie viele andere 55 00:02:46,720 --> 00:02:48,520 so dass Sie mit Dateien arbeiten können. 56 00:02:48,520 --> 00:02:50,980 >> So gibt es sechs hübsche gemeinsamen grundlegenden diejenigen 57 00:02:50,980 --> 00:02:52,870 dass wir gehen heute sprechen. 58 00:02:52,870 --> 00:02:57,160 fopen und ihre Begleiter Funktion fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 und ihre Begleiter Funktion fputc, und fread und ihre Begleiter-Funktion, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Also lassen Sie uns direkt hinein. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- was tut sie? 63 00:03:07,050 --> 00:03:10,050 Nun, eine Datei öffnet und es gibt Ihnen einen Dateizeiger, um es, 64 00:03:10,050 --> 00:03:14,000 so dass Sie dann verwenden können, dass Datei-Zeiger als Argument 65 00:03:14,000 --> 00:03:16,730 zu einem anderen Datei-I / O-Funktionen. 66 00:03:16,730 --> 00:03:19,100 Das Wichtigste mit fopen erinnern 67 00:03:19,100 --> 00:03:24,222 ist, dass, nachdem Sie geöffnet haben, die Datei oder einen Aufruf wie das hier, 68 00:03:24,222 --> 00:03:26,930 müssen Sie prüfen, um sicherzustellen, dass der Zeiger, die Sie zurückkamen 69 00:03:26,930 --> 00:03:28,320 nicht gleich null. 70 00:03:28,320 --> 00:03:31,320 Wenn Sie das Video auf nicht beobachtet haben Zeiger, könnte dies nicht sinnvoll. 71 00:03:31,320 --> 00:03:35,639 Aber wenn Sie versuchen, dereferenzieren ein Nullzeiger Rückruf 72 00:03:35,639 --> 00:03:38,180 Ihr Programm wird wahrscheinlich leiden eine Segmentierung [unverständlich]. 73 00:03:38,180 --> 00:03:40,540 Wir wollen sicherstellen, dass wir bekam einen legitimen Zeiger zurück. 74 00:03:40,540 --> 00:03:43,665 Die überwiegende Mehrheit der Zeit werden wir haben ein berechtigtes Zeiger bekommen zurück 75 00:03:43,665 --> 00:03:45,280 und es wird kein Problem sein. 76 00:03:45,280 --> 00:03:46,760 >> Wie können wir also einen Anruf an fopen? 77 00:03:46,760 --> 00:03:48,051 Es sieht ziemlich genau so aus. 78 00:03:48,051 --> 00:03:52,690 Datei-Sterne ptr-- als eine generische ptr Namen für die Datei pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 und wir geben in zwei Dinge, einen Dateinamen und eine Operation wollen wir verpflichten. 80 00:03:57,300 --> 00:04:01,690 So könnten wir einen Anruf, das aussieht haben this-- Datei Sterne ptr 1 gleich fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 Und die Operation habe ich gewählt ist r. 83 00:04:07,020 --> 00:04:08,639 >> Also, was tun Sie denken, r ist hier? 84 00:04:08,639 --> 00:04:11,180 Was sind die Arten von Dingen, die wir Möglicherweise können Sie die Dateien zu tun? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 So r ist die Operation, die wir wählen, wenn wir eine Datei lesen wollen. 87 00:04:17,500 --> 00:04:20,260 So würden wir im Grunde, wenn wir einen Anruf wie diese machen 88 00:04:20,260 --> 00:04:25,440 bekommen wir uns einen Dateizeiger so dass wir dann lesen Sie Informationen 89 00:04:25,440 --> 00:04:27,770 von file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> In ähnlicher Weise könnten wir Datei 2.txt öffnen zum Schreiben und so passieren wir können zgr2, 91 00:04:34,190 --> 00:04:38,210 der Dateizeiger Ich habe hier geschaffen, als Argument für jede Funktion, 92 00:04:38,210 --> 00:04:40,080 schreibt Daten in eine Datei. 93 00:04:40,080 --> 00:04:43,767 Und ähnlich wie schriftlich, es gibt auch die Möglichkeit, anzuhängen, ein. 94 00:04:43,767 --> 00:04:45,600 Der Unterschied zwischen Schreiben und Anhängen 95 00:04:45,600 --> 00:04:50,920 ist, dass, wenn Sie in eine Datei schreiben, wenn Sie einen Aufruf zum Schreiben fopen machen 96 00:04:50,920 --> 00:04:54,761 und die Datei bereits vorhanden, es ist gehen, um die gesamte Datei zu überschreiben. 97 00:04:54,761 --> 00:04:56,510 Es wird beginnen ganz am Anfang, 98 00:04:56,510 --> 00:04:58,820 Löschen Sie alle Informationen das ist schon da. 99 00:04:58,820 --> 00:05:02,210 >> Der Erwägung, dass, wenn Sie es zum Anhängen zu öffnen, es wird bis zum Ende der Datei gehen 100 00:05:02,210 --> 00:05:04,340 ob bereits Text in es oder Informationen drin, 101 00:05:04,340 --> 00:05:06,040 und es wird dann starten Schreiben von dort. 102 00:05:06,040 --> 00:05:08,570 So verlieren Sie nicht einen der Informationen, die Sie vorher getan haben. 103 00:05:08,570 --> 00:05:12,110 Egal, ob Sie zu schreiben oder angehängt werden soll Art hängt von der Situation. 104 00:05:12,110 --> 00:05:16,840 Aber Sie werden wahrscheinlich wissen, was die Recht Betrieb ist, wenn die Zeit kommt. 105 00:05:16,840 --> 00:05:18,020 Also das ist, fopen. 106 00:05:18,020 --> 00:05:18,930 >> Was ist mit fclose? 107 00:05:18,930 --> 00:05:21,600 Nun, ziemlich einfach, fclose nur übernimmt den Dateizeiger. 108 00:05:21,600 --> 00:05:24,000 Und wie man erwarten könnte, es die Datei geschlossen wird. 109 00:05:24,000 --> 00:05:29,270 Und sobald wir eine Datei geschlossen wird, können wir nicht führen Sie auch keine weitere Datei-I / O-Funktionen, 110 00:05:29,270 --> 00:05:31,420 Lesen oder Schreiben auf diese Datei. 111 00:05:31,420 --> 00:05:36,444 Wir müssen wieder zu öffnen, die Datei ein weiteres Mal, um 112 00:05:36,444 --> 00:05:38,610 die weitere Zusammenarbeit mit es unter Verwendung der I / O Funktionen. 113 00:05:38,610 --> 00:05:41,520 So fclose mittels wir fertig Arbeit mit dieser Datei. 114 00:05:41,520 --> 00:05:44,690 Und alles, was wir brauchen, um in übergeben wird der Name eines Dateizeigers. 115 00:05:44,690 --> 00:05:50,010 Also auf ein paar Dias vor, wir fopened Datei 1 dot Text zum Lesen 116 00:05:50,010 --> 00:05:52,854 und wir vergeben, dass Dateizeiger auf ptr1. 117 00:05:52,854 --> 00:05:55,020 Jetzt haben wir beschlossen, wir sind getan liest aus dieser Datei. 118 00:05:55,020 --> 00:05:56,561 Wir brauchen nicht noch mehr zu tun. 119 00:05:56,561 --> 00:05:58,890 Wir können einfach fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 Und in ähnlicher Weise konnten wir FDie anderen. 121 00:06:01,950 --> 00:06:02,450 Gut. 122 00:06:02,450 --> 00:06:03,700 So ist das Öffnen und Schließen. 123 00:06:03,700 --> 00:06:05,780 Das sind die beiden Grund Startvorgänge. 124 00:06:05,780 --> 00:06:08,050 >> Jetzt wollen wir eigentlich tun einige interessante Sachen, 125 00:06:08,050 --> 00:06:11,940 und die erste Funktion, die wir sehen, dass tun wird, dass ist fgetc-- 126 00:06:11,940 --> 00:06:14,110 Datei erhalten Sie einen Charakter. 127 00:06:14,110 --> 00:06:17,350 Das ist, was in der Regel fgetc würde zu übersetzen. 128 00:06:17,350 --> 00:06:20,190 Sein Ziel im Leben ist, Lesen Sie das nächste Zeichen, 129 00:06:20,190 --> 00:06:22,079 oder, wenn dies Ihre sehr erste Aufruf fgetc 130 00:06:22,079 --> 00:06:23,870 für eine bestimmte Datei, das erste Zeichen. 131 00:06:23,870 --> 00:06:26,210 Aber dann nach, dass, Sie zum nächsten zu gelangen, 132 00:06:26,210 --> 00:06:31,500 schon am nächsten Zeichen der Datei, und speichert sie in einem Zeichenvariable. 133 00:06:31,500 --> 00:06:34,490 Wie wir hier getan haben, char ch gleich fgetc, 134 00:06:34,490 --> 00:06:36,389 übergeben Sie den Namen eines Dateizeigers. 135 00:06:36,389 --> 00:06:38,180 Wieder ist es sehr hier wichtig zu bedenken, 136 00:06:38,180 --> 00:06:41,430 dass um haben diese Operation erfolgreich zu sein, 137 00:06:41,430 --> 00:06:45,690 der Dateizeiger selbst must've zum Lesen geöffnet. 138 00:06:45,690 --> 00:06:50,589 Wir können ein Zeichen, das nicht aus einer Datei gelesen Zeiger, die wir zum Schreiben geöffnet. 139 00:06:50,589 --> 00:06:52,630 Also das ist eine der Einschränkungen der fopen, nicht wahr? 140 00:06:52,630 --> 00:06:55,470 Wir müssen zu beschränken uns nur die Durchführung 141 00:06:55,470 --> 00:06:57,710 einem Arbeitsgang mit einem Dateizeiger. 142 00:06:57,710 --> 00:07:00,220 Wenn wir lesen wollte und Schreiben aus der gleichen Datei, 143 00:07:00,220 --> 00:07:03,840 würden wir offene zwei getrennte haben Dateizeiger auf den gleichen file-- 144 00:07:03,840 --> 00:07:05,670 eine zum Lesen, eine zum Schreiben. 145 00:07:05,670 --> 00:07:08,400 >> Also noch einmal, der einzige Grund, Ich, dass bringen jetzt 146 00:07:08,400 --> 00:07:11,920 denn wenn wir gehen, um einen Anruf zu tätigen um fgetc, dass Dateizeiger must've 147 00:07:11,920 --> 00:07:14,172 zum Lesen geöffnet. 148 00:07:14,172 --> 00:07:15,880 Und dann recht einfach, alles, was wir tun müssen, 149 00:07:15,880 --> 00:07:17,546 spielte in der Name der Datei-Zeiger. 150 00:07:17,546 --> 00:07:21,060 So char ch gleich fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> Das wird uns der nächste character-- 152 00:07:23,200 --> 00:07:25,575 oder auch, falls dies die erste Mal, dass wir diesen Anruf gemacht, 153 00:07:25,575 --> 00:07:29,750 die erste character-- von was auch immer Datei wird von ptr1 hingewiesen. 154 00:07:29,750 --> 00:07:32,210 Daran erinnern, dass das war Datei 1 Punkt Text. 155 00:07:32,210 --> 00:07:36,490 Es wird das erste Zeichen, dass zu bekommen und wir werden es in der Variablen ch speichern. 156 00:07:36,490 --> 00:07:37,941 Ziemlich einfach. 157 00:07:37,941 --> 00:07:40,190 Also haben wir nur blickte auf drei Funktionen und schon sind wir 158 00:07:40,190 --> 00:07:43,070 etwas recht ordentlich zu tun. 159 00:07:43,070 --> 00:07:46,320 >> Also, wenn wir diese Fähigkeit sich einen Charakter 160 00:07:46,320 --> 00:07:48,943 und wir Schleife es-- so dass wir weiterhin Zeichen erhalten 161 00:07:48,943 --> 00:07:51,390 aus einer Datei über und immer und over-- wir jetzt 162 00:07:51,390 --> 00:07:54,500 kann jede einzelne gelesen Charakter einer Datei. 163 00:07:54,500 --> 00:07:58,670 Und wenn wir jedes Zeichen zu drucken sofort nachdem wir es lesen, 164 00:07:58,670 --> 00:08:01,960 haben wir nun aus einer Datei gelesen und auf den Bildschirm geschrieben seinen Inhalt. 165 00:08:01,960 --> 00:08:05,610 Wir haben effektiv verkettet diese Datei auf dem Bildschirm. 166 00:08:05,610 --> 00:08:09,670 Und das ist, was die Linux Befehl cat tut. 167 00:08:09,670 --> 00:08:13,250 >> Wenn Sie Katze im Dateinamen geben Sie ihn, wird der gesamte Inhalt ausdrucken 168 00:08:13,250 --> 00:08:15,160 der Datei in Ihrem Terminal-Fenster. 169 00:08:15,160 --> 00:08:19,010 Und so dieses kleine Schleife hier, nur drei Zeilen Code, 170 00:08:19,010 --> 00:08:23,270 aber es effektiv dupliziert der Linux-Befehl cat. 171 00:08:23,270 --> 00:08:25,210 Also diese Syntax vielleicht schauen ein wenig seltsam, 172 00:08:25,210 --> 00:08:26,670 aber hier ist, was hier passiert. 173 00:08:26,670 --> 00:08:31,460 Während ch gleich fgetc ist ptr nicht gleich EOF-- es ist ein ganz Bissen, 174 00:08:31,460 --> 00:08:34,669 aber wir brechen sie nur so ist es klar auf der Syntax. 175 00:08:34,669 --> 00:08:37,169 Ich habe es konsolidiert aus Gründen der Raum, 176 00:08:37,169 --> 00:08:39,049 auch wenn es ein wenig syntaktisch tricky. 177 00:08:39,049 --> 00:08:41,194 >> So dass dieser Teil in grün rechts Nun, was ist es denn? 178 00:08:41,194 --> 00:08:42,860 Nun, das ist nur unsere fgetc Anruf, oder? 179 00:08:42,860 --> 00:08:44,530 Wir haben gesehen, dass vor. 180 00:08:44,530 --> 00:08:49,500 Es ist den Erhalt eines Zeichen aus der Datei. 181 00:08:49,500 --> 00:08:53,220 Dann vergleichen wir, dass Zeichen gegen EOF. 182 00:08:53,220 --> 00:08:57,470 EOF ist ein spezieller Wert, der ist in Standard io.h, definiert, 183 00:08:57,470 --> 00:08:59,390 ist das Ende der Datei Charakter. 184 00:08:59,390 --> 00:09:03,450 Also im Grunde, was passieren wird wird diese Schleife wird ein Zeichen zu lesen, 185 00:09:03,450 --> 00:09:07,445 vergleichen Sie es mit EOF das Dateiende Charakter. 186 00:09:07,445 --> 00:09:10,070 Wenn sie nicht übereinstimmen, so haben wir nicht erreicht das Ende der Datei, 187 00:09:10,070 --> 00:09:11,490 wir werden dieses Zeichen auszudrucken. 188 00:09:11,490 --> 00:09:13,740 Dann werden wir wieder auf dem Sprung Anfang der Schleife erneut. 189 00:09:13,740 --> 00:09:18,310 Wir werden einen Charakter erhalten, überprüfen gegen EOF, drucken Sie es aus, und so weiter 190 00:09:18,310 --> 00:09:21,094 und so weiter und so weiter, Durchschleifen auf diese Weise 191 00:09:21,094 --> 00:09:22,760 bis wir das Ende der Datei erreicht. 192 00:09:22,760 --> 00:09:24,593 Und dann von diesem Punkt, wir gedruckt haben 193 00:09:24,593 --> 00:09:26,210 aus dem gesamten Inhalt der Datei. 194 00:09:26,210 --> 00:09:29,450 Also noch einmal, wir nur gesehen haben fopen, fclose und fgetc 195 00:09:29,450 --> 00:09:34,950 und schon können wir duplizieren ein Linux-Terminal-Befehl. 196 00:09:34,950 --> 00:09:38,850 >> Wie ich schon sagte am Anfang, wir hatten fgetc und fputc, 197 00:09:38,850 --> 00:09:41,860 und fputc war der Begleiter Funktion fgetc. 198 00:09:41,860 --> 00:09:44,880 Und so, wie Sie sich vorstellen können, es ist die Schreib äquivalent. 199 00:09:44,880 --> 00:09:49,440 Es ermöglicht uns, einen zu schreiben einzelnes Zeichen in einer Datei. 200 00:09:49,440 --> 00:09:53,290 >> Wieder, wobei die Einschränkung, nur wie es war mit fgetc, die Datei 201 00:09:53,290 --> 00:09:56,660 dass wir zu must've Schreiben gewesen zum Schreiben oder zum Anhängen geöffnet. 202 00:09:56,660 --> 00:10:00,820 Wenn wir versuchen, und verwenden Sie fputc auf eine Datei , dass wir zum Lesen geöffnet haben, 203 00:10:00,820 --> 00:10:02,760 wir werden leiden ein bisschen wie ein Fehler. 204 00:10:02,760 --> 00:10:04,440 Doch der Ruf ist ziemlich einfach. 205 00:10:04,440 --> 00:10:08,000 fputc Kapital A zgr2 alle das geht zu tun, ist es 206 00:10:08,000 --> 00:10:12,040 gehen, um den Brief zu schreiben in A in Datei 2 dot 207 00:10:12,040 --> 00:10:14,760 Text, der den Namen der war Datei, die wir geöffnet und zugewiesen 208 00:10:14,760 --> 00:10:17,280 der Zeiger auf PTR2. 209 00:10:17,280 --> 00:10:20,430 So werden wir ein zu schreiben Kapital A bis 2 dot Textdatei. 210 00:10:20,430 --> 00:10:24,592 Und wir werden ein Ausrufezeichen zu schreiben weisen auf 3 dot-Datei 211 00:10:24,592 --> 00:10:27,330 Text, der durch ptr3 hingewiesen wurde. 212 00:10:27,330 --> 00:10:29,730 Also noch einmal, ziemlich einfach hier. 213 00:10:29,730 --> 00:10:32,727 >> Aber jetzt können wir noch etwas zu tun. 214 00:10:32,727 --> 00:10:34,560 Wir haben diese beispiels wir waren gerade dabei über 215 00:10:34,560 --> 00:10:38,950 über die Möglichkeit, die Katze zu replizieren Linux Befehl derjenige ausdruckt 216 00:10:38,950 --> 00:10:40,500 auf den Bildschirm. 217 00:10:40,500 --> 00:10:43,510 Nun, jetzt, wo wir die Möglichkeit haben, Zeichen aus Dateien lesen 218 00:10:43,510 --> 00:10:46,590 und schreiben Sie Zeichen auf Dateien, warum wir nicht ersetzen weiß nur, dass 219 00:10:46,590 --> 00:10:50,720 anrufen, um mit einem Aufruf an fputc printf. 220 00:10:50,720 --> 00:10:54,090 >> Und jetzt haben wir cp dupliziert, eine sehr grundlegende Linux-Befehl 221 00:10:54,090 --> 00:10:59,100 dass wir sprachen über so lange Vor der Linux-Befehle Video. 222 00:10:59,100 --> 00:11:01,070 Wir haben effektiv dupliziert, dass genau hier. 223 00:11:01,070 --> 00:11:04,790 Wir lesen einen Charakter und dann sind wir Schreiben dieses Zeichen in einer anderen Datei. 224 00:11:04,790 --> 00:11:07,660 Lesen aus einer Datei, Schreiben zum anderen, immer 225 00:11:07,660 --> 00:11:11,350 und immer wieder, bis wir getroffen EOF. 226 00:11:11,350 --> 00:11:14,250 Wir haben bis zum Ende der bekam Datei wir versuchen, aus kopieren. 227 00:11:14,250 --> 00:11:18,500 Und damit wir alle geschrieben haben der Charaktere, die wir brauchen, um die Datei 228 00:11:18,500 --> 00:11:19,500 dass wir, um zu schreiben. 229 00:11:19,500 --> 00:11:24,270 Das ist also cp, die Kopierbefehl Linux. 230 00:11:24,270 --> 00:11:26,550 >> Am Anfang der Dieses Video hatte ich die Einschränkung 231 00:11:26,550 --> 00:11:29,840 dass wir a reden wenig über Zeiger. 232 00:11:29,840 --> 00:11:32,480 Hier ist zwar dort, wo wir sind gehen, um über Zeiger sprechen 233 00:11:32,480 --> 00:11:34,800 zusätzlich zu den Dateizeiger. 234 00:11:34,800 --> 00:11:37,870 Also diese Funktion sieht irgendwie beängstigend. 235 00:11:37,870 --> 00:11:39,120 Es hat mehrere Parameter. 236 00:11:39,120 --> 00:11:40,430 Es gibt eine Menge los. 237 00:11:40,430 --> 00:11:42,760 Es gibt eine Menge von verschiedenen Farben und Texte zurückzugreifen. 238 00:11:42,760 --> 00:11:47,100 Aber wirklich, es ist nur die generische Version von fgetc 239 00:11:47,100 --> 00:11:50,110 dass erlaubt uns, jeder zu erhalten Menge an Informationen. 240 00:11:50,110 --> 00:11:53,560 Es kann ein wenig ineffizient, wenn wir sein immer Zeichen ein zu einer Zeit, 241 00:11:53,560 --> 00:11:55,770 Durchlaufen der Datei ein Zeichen zu einem Zeitpunkt. 242 00:11:55,770 --> 00:12:00,230 Wäre es nicht schöner, zu bekommen, 100 zu einem Zeitpunkt oder 500 zu einem Zeitpunkt? 243 00:12:00,230 --> 00:12:03,250 >> Nun, fread und ihre Begleiter Funktion fwrite, auf die wir sprechen 244 00:12:03,250 --> 00:12:05,490 in einem zweiten, ermöglichen es uns, genau das zu tun. 245 00:12:05,490 --> 00:12:08,480 Wir können eine beliebige Menge zu lesen von Informationen aus einer Datei 246 00:12:08,480 --> 00:12:10,290 und wir speichern sie irgendwo vorübergehend. 247 00:12:10,290 --> 00:12:12,980 Anstatt nur in der Lage passen sie in einer einzigen Variablen, 248 00:12:12,980 --> 00:12:15,790 wir brauchen, um es in einem Array zu speichern. 249 00:12:15,790 --> 00:12:19,980 Und so, in vier passieren wir Argumente einen Zeiger fread-- 250 00:12:19,980 --> 00:12:23,940 an den Ort, wo wir sind gehen, um Informationen zu speichern, 251 00:12:23,940 --> 00:12:29,180 wie groß jede Informationseinheit werden, wie viele Informationseinheiten 252 00:12:29,180 --> 00:12:35,192 wir wollen, zu erwerben, und von die Datei, die wir wollen, um sie zu bekommen. 253 00:12:35,192 --> 00:12:37,150 Wahrscheinlich am besten veranschaulicht mit einem Beispiel hier. 254 00:12:37,150 --> 00:12:41,640 Also lassen Sie uns sagen, dass wir erklären, ein Array von 10 Zahlen. 255 00:12:41,640 --> 00:12:45,080 Wir sind gerade auf der ausgewiesenen Stapel beliebig int arr 10. 256 00:12:45,080 --> 00:12:46,970 Also das ist ziemlich einfach. 257 00:12:46,970 --> 00:12:51,970 Nun, was wir tun, wenn die frecall ist wir lesen Größe int 258 00:12:51,970 --> 00:12:54,180 mal 10 Bytes an Informationen. 259 00:12:54,180 --> 00:12:59,040 Größe int Befinden four-- das ist, die Größe einer ganzen Zahl in c. 260 00:12:59,040 --> 00:13:02,790 >> Also, was wir tun, ist wir lesen 40 Byte im Wert von Informationen 261 00:13:02,790 --> 00:13:05,850 aus der Datei auf den ptr zeigt. 262 00:13:05,850 --> 00:13:08,600 Und wir sind diejenigen, die Speicherung 40 Bytes irgendwo 263 00:13:08,600 --> 00:13:12,080 wo wir beiseite 40 Byte an Speicher. 264 00:13:12,080 --> 00:13:15,970 Glücklicherweise haben wir bereits getan haben, indem erklärt arr, dass Array recht. 265 00:13:15,970 --> 00:13:19,770 Dh fähig Halte 10 vier-Byte-Einheiten. 266 00:13:19,770 --> 00:13:22,860 Also insgesamt kann sie 40 halten Bytes im Wert von Informationen. 267 00:13:22,860 --> 00:13:26,540 Und wir sind jetzt liest 40 Byte Informationen aus der Datei, 268 00:13:26,540 --> 00:13:30,330 und wir sind es die Speicherung in arr. 269 00:13:30,330 --> 00:13:35,470 >> Daran erinnern, aus dem Video-on-Zeiger, der Name eines Arrays wie arr, 270 00:13:35,470 --> 00:13:38,370 ist eigentlich nur ein Zeiger auf das erste Element. 271 00:13:38,370 --> 00:13:43,680 Also, wenn wir in arr Pass gibt, wir sind in der Tat auf und übergibt einen Zeiger. 272 00:13:43,680 --> 00:13:46,120 >> Ebenso können wir this-- tun wir tun nicht notwendigerweise 273 00:13:46,120 --> 00:13:51,200 müssen unsere Puffer auf dem Stack zu speichern. 274 00:13:51,200 --> 00:13:54,990 Wir könnten auch dynamisch zuzuweisen einen Puffer wie diese, mit malloc. 275 00:13:54,990 --> 00:13:57,340 Denken Sie daran, wenn wir dynamisch Speicher zuweisen, 276 00:13:57,340 --> 00:14:00,550 wir sparen Sie es auf die Haufen, nicht den Stapel. 277 00:14:00,550 --> 00:14:02,110 Aber es ist noch ein Puffer. 278 00:14:02,110 --> 00:14:06,810 >> Es immer noch, in diesem Fall ist hält 640 Bytes Informationen 279 00:14:06,810 --> 00:14:09,230 weil ein Doppel nimmt acht Bytes. 280 00:14:09,230 --> 00:14:11,570 Und wir sind für 80 von ihnen zu fragen. 281 00:14:11,570 --> 00:14:13,770 Wir wollen Platz haben 80 Doppelzimmer zu halten. 282 00:14:13,770 --> 00:14:17,210 So 80 mal 8 ist 640 Byte Daten. 283 00:14:17,210 --> 00:14:21,880 Und das Aufruf fread ist Sammeln von 640 Bytes Informationen 284 00:14:21,880 --> 00:14:27,770 aus der Datei, auf die ptr und Speichern nun in arr2. 285 00:14:27,770 --> 00:14:32,770 >> Jetzt können wir auch zu behandeln fread gerade wie ein Aufruf an fgetc. 286 00:14:32,770 --> 00:14:37,140 In diesem Fall sind wir nur versuchen, bekommen ein Zeichen aus der Datei. 287 00:14:37,140 --> 00:14:40,070 Und wir brauchen nicht ein Array, um ein Zeichen zu halten. 288 00:14:40,070 --> 00:14:43,170 Wir können einfach speichern sie in eine Zeichenvariable. 289 00:14:43,170 --> 00:14:46,390 >> Der Haken ist jedoch, dass wenn wir einfach nur eine Variable, 290 00:14:46,390 --> 00:14:50,290 wir brauchen, um in den Pass Adresse dieser variablen 291 00:14:50,290 --> 00:14:52,550 weil erinnern, dass die erste Argument für fread 292 00:14:52,550 --> 00:14:59,210 ist ein Zeiger auf den Ort und die Speicher wo wir wollen, um die Informationen zu speichern. 293 00:14:59,210 --> 00:15:01,550 Auch der Name eines Array ist ein Zeiger. 294 00:15:01,550 --> 00:15:04,200 Wir wissen also nicht nötig, Und-Zeichen-Array zu tun. 295 00:15:04,200 --> 00:15:07,270 Aber c, wird das Zeichen c hier ist kein Array. 296 00:15:07,270 --> 00:15:08,390 Es ist nur eine Variable. 297 00:15:08,390 --> 00:15:11,840 Und so müssen wir ein übergeben Und-Zeichen c, um anzuzeigen, 298 00:15:11,840 --> 00:15:15,350 , dass das ist die Adresse, wo wir wollen, dieses ein Byte an Informationen zu speichern, 299 00:15:15,350 --> 00:15:20,479 dies ein Zeichen, wir von ptr sammeln. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Ich werde durchmachen dies etwas mehr 301 00:15:22,270 --> 00:15:25,440 quickly-- ist so ziemlich das genaue Äquivalent fread 302 00:15:25,440 --> 00:15:27,720 außer es ist zum Schreiben anstatt zu lesen, nur 303 00:15:27,720 --> 00:15:31,610 wie die other-- wir offen hatten und in der Nähe, einen Charakter, 304 00:15:31,610 --> 00:15:32,530 einen Charakter. 305 00:15:32,530 --> 00:15:35,040 Jetzt ist es zu willkürlichen Informationsmenge, 306 00:15:35,040 --> 00:15:37,170 rechts beliebige Menge an Informationen. 307 00:15:37,170 --> 00:15:39,790 So wie zuvor, können wir haben eine Reihe von 10 Zahlen 308 00:15:39,790 --> 00:15:43,210 wo wir bereits haben Informationen gespeichert, vielleicht. 309 00:15:43,210 --> 00:15:46,580 >> Es war wahrscheinlich ein paar Zeilen Code , dass zwischen diesen beiden gehen sollten 310 00:15:46,580 --> 00:15:49,990 wo ich zu füllen arr mit etwas Sinnvolles. 311 00:15:49,990 --> 00:15:51,880 Ich fülle ihn mit 10 verschiedenen Zahlen. 312 00:15:51,880 --> 00:15:54,920 Und statt, was ich Dabei wird aus arr schreiben 313 00:15:54,920 --> 00:15:58,600 und Sammeln der Informationen von arr. 314 00:15:58,600 --> 00:16:02,390 Und ich nehme diese Informationen und legt es in die Datei ein. 315 00:16:02,390 --> 00:16:05,410 >> Also anstatt es aus die Datei in den Puffer, 316 00:16:05,410 --> 00:16:08,790 Wir werden jetzt aus der Puffer in die Datei. 317 00:16:08,790 --> 00:16:10,580 So ist es gerade umgekehrt. 318 00:16:10,580 --> 00:16:16,680 Also noch einmal, wie zuvor, können wir auch einen Heap-Teil des Speichers 319 00:16:16,680 --> 00:16:19,600 dass wir dynamisch haben zugeordnet und von diesem zu lesen 320 00:16:19,600 --> 00:16:21,570 und schreiben, dass in der Datei. 321 00:16:21,570 --> 00:16:24,900 >> Und wir haben auch eine einzelne Variable der Lage ist, ein Byte 322 00:16:24,900 --> 00:16:27,200 von Informationen, wie etwa ein Zeichen. 323 00:16:27,200 --> 00:16:29,830 Aber auch hier müssen wir weitergeben müssen in die Adresse dieser variablen 324 00:16:29,830 --> 00:16:31,840 wenn wir von ihr lesen wollen. 325 00:16:31,840 --> 00:16:35,280 So können wir die Informationen zu schreiben finden wir an dieser Adresse 326 00:16:35,280 --> 00:16:39,050 auf den Dateizeiger PTR. 327 00:16:39,050 --> 00:16:41,630 >> Es gibt viele andere große Datei-I / O-Funktionen 328 00:16:41,630 --> 00:16:44,650 dass verschiedene Dinge neben tun die, die wir heute gesprochen haben. 329 00:16:44,650 --> 00:16:46,450 Ein paar von denen, Ihnen nützlich sein könnten 330 00:16:46,450 --> 00:16:50,840 gibt fgets und fputs, was sind das Äquivalent 331 00:16:50,840 --> 00:16:56,190 von fgetc und fputc aber zum Lesen eine einzelne Zeichenfolge aus einer Datei. 332 00:16:56,190 --> 00:16:59,020 Statt eines einzelnen Zeichens, es wird eine ganze Zeichenkette zu lesen. 333 00:16:59,020 --> 00:17:02,940 fprintf, die im Grunde erlaubt Sie printf verwenden, um Datei schreiben. 334 00:17:02,940 --> 00:17:05,619 So wie können Sie das tun, Variablensubstitution mit 335 00:17:05,619 --> 00:17:09,900 die Platzhalter Prozent i und Prozent D, und so weiter, mit printf 336 00:17:09,900 --> 00:17:14,690 Sie können in ähnlicher Weise nehmen die printf String und Druck etwas 337 00:17:14,690 --> 00:17:16,800 wie die in einer Datei. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- wenn Sie einen DVD-Player ist die Analogie Normalerweise verwende ich hier-- 339 00:17:20,720 --> 00:17:23,109 ist ein bisschen wie mit Ihrem vor- und zurückspulen 340 00:17:23,109 --> 00:17:25,819 Tasten, um rund um den Film zu bewegen. 341 00:17:25,819 --> 00:17:28,369 Ebenso können Sie rund um die Datei zu bewegen. 342 00:17:28,369 --> 00:17:30,250 Eines der Dinge, innen dass Dateistruktur 343 00:17:30,250 --> 00:17:34,270 , dass c für Sie erstellt ein Indikator ist, wo Sie sind in der Datei. 344 00:17:34,270 --> 00:17:36,420 Sind Sie ganz am beginnend bei Byte-Null? 345 00:17:36,420 --> 00:17:39,290 Sind Sie bei Byte 100, Byte-1000, und so weiter? 346 00:17:39,290 --> 00:17:44,340 Sie können fseek willkürlich bewegen daß Indikator nach vorne oder hinten. 347 00:17:44,340 --> 00:17:46,744 >> Und ftell wieder ähnlich einem DVD-Spieler, 348 00:17:46,744 --> 00:17:49,660 ist wie eine kleine Uhr, die sagt, Sie, wie viele Minuten und Sekunden 349 00:17:49,660 --> 00:17:52,480 sind in einen bestimmten Film. 350 00:17:52,480 --> 00:17:56,990 In ähnlicher Weise sagt ftell Sie, wie viele Bytes Sie in die Datei. 351 00:17:56,990 --> 00:18:00,210 feof ist eine andere Version der Nachweis, ob Sie haben, 352 00:18:00,210 --> 00:18:01,700 erreicht das Ende der Datei. 353 00:18:01,700 --> 00:18:03,600 Und ferror ist eine Funktion, die Sie verwenden können 354 00:18:03,600 --> 00:18:06,959 zu erkennen, ob etwas hat schiefgegangen Arbeits mit einer Datei. 355 00:18:06,959 --> 00:18:08,750 Wiederum ist dies nur Kratzer auf der Oberfläche. 356 00:18:08,750 --> 00:18:12,730 Es gibt noch viel mehr Datei-I / O Funktionen in der Standard io.h 357 00:18:12,730 --> 00:18:16,620 Aber das wird wahrscheinlich erhalten Sie begann die Arbeit mit Dateizeiger. 358 00:18:16,620 --> 00:18:17,640 Ich bin Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Dies ist CS50. 360 00:18:19,750 --> 00:18:21,669