SPRECHER: Bisher ist es wahrscheinlich, dass die meisten Ihrer Programme haben ein bisschen vergänglich. Sie führen ein Programm wie Mario oder gierig. Es tut etwas, es möglicherweise aufgefordert, der Benutzer nach Informationen, Drucken etwas auf dem Bildschirm ausgegeben, aber dann, wenn Ihr Programm ist vorbei, es gibt wirklich keine Beweise gibt es wurde immer in erster Linie laufen. Ich meine, sicher, könnten Sie verlassen haben, es im Terminal-Fenster zu öffnen, aber wenn Sie Ihr Bildschirm zu löschen, gibt es wirklich keine Beweise dafür, dass es existierte. Wir haben nicht ein Mittel zur Speicherung haben persistente Informationen, Daten nach unserem was existiert Programm nicht mehr läuft, oder wir müssen nicht bis zu diesem Punkt. Glücklicherweise aber macht c geben Sie uns die Möglichkeit, dies durch die Implementierung zu tun so genannte eine Datei, eine Struktur, die im Grunde eine Datei, die Sie verdoppeln würde Klicken Sie auf Ihrem Computer, wenn Sie auf einer grafischen Benutzerumgebung. Generell bei der Arbeit mit c, wir sind tatsächlich gehen, um mit zu arbeiten Zeiger auf Datei files-- stars-- außer für ein wenig wenn wir über ein paar sprechen der Funktionen, arbeiten mit Dateizeiger. Sie brauchen nicht, um wirklich gegraben haben zu tief in das Verständnis Zeigern sich. Es ist ein wenig klein wenig wo wir über sie zu sprechen, aber im allgemeinen Dateizeiger und Zeiger, während miteinander, nicht genau dasselbe. Nun, was ich meine, wenn Ich sage, persistente Daten? Was ist persistenten Daten? Warum brauchen wir darum kümmern? Sagen Sie zum Beispiel, dass Sie ein Programm sind oder Sie umgeschrieben habe ein Programm, das ein Spiel ist, und Sie den Überblick behalten wollen aller Bewegungen des Benutzers so dass vielleicht, wenn etwas schief geht, können Sie die Datei nach dem Spiel überprüfen. Das ist, was wir meinen, wenn wir sprechen über persistente Daten. Im Zuge der Ausführung Ihrer Programm wird eine Datei erstellt. Und wenn Ihr Programm nicht mehr läuft, die Datei noch vorhanden ist auf Ihrem System. Und wir können es zu betrachten und untersuchen es. Und so, dass Programm würde eingestellt werden haben einige persistente Daten erstellt, Daten nach dem Programm vorhandenen Ausführung beendet ist. Jetzt alle diese Funktionen, die funktionieren mit dem Erstellen von Dateien und Bearbeiten sie auf verschiedene Weise leben in Standard io.h, die eine Header-Datei, Sie haben wahrscheinlich schon Pfund einschließlich der an der Spitze der hübschen viel alle Ihre Programme weil es eines der enthält nützlichsten Funktionen für uns, printf, die auch erlaubt lebt in Standard io.h So dass Sie nicht brauchen, um zu hämmern schließen zusätzliche Dateien wahrscheinlich , um mit der Dateizeiger zu arbeiten. Nun jedes einzelne Datei Zeigerfunktion, oder jede einzelne Datei-I / O, Input-Output- Funktion übernimmt als einer seiner Parameter oder Eingaben eine Datei pointer-- Ausnahme für ein, fopen, die ist, was Sie verwenden, um die Datei herunterzuladen Zeiger in den ersten Platz. Aber nachdem Sie geöffnet haben die Datei und Sie Dateizeiger zu erhalten, Anschließend können Sie sie als Argumente für die verschiedenen Funktionen, wir werden darüber reden heute, ebenso wie viele andere so dass Sie mit Dateien arbeiten können. So gibt es sechs hübsche gemeinsamen grundlegenden diejenigen dass wir gehen heute sprechen. fopen und ihre Begleiter Funktion fclose, fgetc und ihre Begleiter Funktion fputc, und fread und ihre Begleiter-Funktion, fwrite. Also lassen Sie uns direkt hinein. fopen-- was tut sie? Nun, eine Datei öffnet und es gibt Ihnen einen Dateizeiger, um es, so dass Sie dann verwenden können, dass Datei-Zeiger als Argument zu einem anderen Datei-I / O-Funktionen. Das Wichtigste mit fopen erinnern ist, dass, nachdem Sie geöffnet haben, die Datei oder einen Aufruf wie das hier, müssen Sie prüfen, um sicherzustellen, dass der Zeiger, die Sie zurückkamen nicht gleich null. Wenn Sie das Video auf nicht beobachtet haben Zeiger, könnte dies nicht sinnvoll. Aber wenn Sie versuchen, dereferenzieren ein Nullzeiger Rückruf Ihr Programm wird wahrscheinlich leiden eine Segmentierung [unverständlich]. Wir wollen sicherstellen, dass wir bekam einen legitimen Zeiger zurück. Die überwiegende Mehrheit der Zeit werden wir haben ein berechtigtes Zeiger bekommen zurück und es wird kein Problem sein. Wie können wir also einen Anruf an fopen? Es sieht ziemlich genau so aus. Datei-Sterne ptr-- als eine generische ptr Namen für die Datei pointer-- fopen und wir geben in zwei Dinge, einen Dateinamen und eine Operation wollen wir verpflichten. So könnten wir einen Anruf, das aussieht haben this-- Datei Sterne ptr 1 gleich fopen file1.txt. Und die Operation habe ich gewählt ist r. Also, was tun Sie denken, r ist hier? Was sind die Arten von Dingen, die wir Möglicherweise können Sie die Dateien zu tun? So r ist die Operation, die wir wählen, wenn wir eine Datei lesen wollen. So würden wir im Grunde, wenn wir einen Anruf wie diese machen bekommen wir uns einen Dateizeiger so dass wir dann lesen Sie Informationen von file1.txt. In ähnlicher Weise könnten wir Datei 2.txt öffnen zum Schreiben und so passieren wir können zgr2, der Dateizeiger Ich habe hier geschaffen, als Argument für jede Funktion, schreibt Daten in eine Datei. Und ähnlich wie schriftlich, es gibt auch die Möglichkeit, anzuhängen, ein. Der Unterschied zwischen Schreiben und Anhängen ist, dass, wenn Sie in eine Datei schreiben, wenn Sie einen Aufruf zum Schreiben fopen machen und die Datei bereits vorhanden, es ist gehen, um die gesamte Datei zu überschreiben. Es wird beginnen ganz am Anfang, Löschen Sie alle Informationen das ist schon da. Der Erwägung, dass, wenn Sie es zum Anhängen zu öffnen, es wird bis zum Ende der Datei gehen ob bereits Text in es oder Informationen drin, und es wird dann starten Schreiben von dort. So verlieren Sie nicht einen der Informationen, die Sie vorher getan haben. Egal, ob Sie zu schreiben oder angehängt werden soll Art hängt von der Situation. Aber Sie werden wahrscheinlich wissen, was die Recht Betrieb ist, wenn die Zeit kommt. Also das ist, fopen. Was ist mit fclose? Nun, ziemlich einfach, fclose nur übernimmt den Dateizeiger. Und wie man erwarten könnte, es die Datei geschlossen wird. Und sobald wir eine Datei geschlossen wird, können wir nicht führen Sie auch keine weitere Datei-I / O-Funktionen, Lesen oder Schreiben auf diese Datei. Wir müssen wieder zu öffnen, die Datei ein weiteres Mal, um die weitere Zusammenarbeit mit es unter Verwendung der I / O Funktionen. So fclose mittels wir fertig Arbeit mit dieser Datei. Und alles, was wir brauchen, um in übergeben wird der Name eines Dateizeigers. Also auf ein paar Dias vor, wir fopened Datei 1 dot Text zum Lesen und wir vergeben, dass Dateizeiger auf ptr1. Jetzt haben wir beschlossen, wir sind getan liest aus dieser Datei. Wir brauchen nicht noch mehr zu tun. Wir können einfach fclose ptr1. Und in ähnlicher Weise konnten wir FDie anderen. Gut. So ist das Öffnen und Schließen. Das sind die beiden Grund Startvorgänge. Jetzt wollen wir eigentlich tun einige interessante Sachen, und die erste Funktion, die wir sehen, dass tun wird, dass ist fgetc-- Datei erhalten Sie einen Charakter. Das ist, was in der Regel fgetc würde zu übersetzen. Sein Ziel im Leben ist, Lesen Sie das nächste Zeichen, oder, wenn dies Ihre sehr erste Aufruf fgetc für eine bestimmte Datei, das erste Zeichen. Aber dann nach, dass, Sie zum nächsten zu gelangen, schon am nächsten Zeichen der Datei, und speichert sie in einem Zeichenvariable. Wie wir hier getan haben, char ch gleich fgetc, übergeben Sie den Namen eines Dateizeigers. Wieder ist es sehr hier wichtig zu bedenken, dass um haben diese Operation erfolgreich zu sein, der Dateizeiger selbst must've zum Lesen geöffnet. Wir können ein Zeichen, das nicht aus einer Datei gelesen Zeiger, die wir zum Schreiben geöffnet. Also das ist eine der Einschränkungen der fopen, nicht wahr? Wir müssen zu beschränken uns nur die Durchführung einem Arbeitsgang mit einem Dateizeiger. Wenn wir lesen wollte und Schreiben aus der gleichen Datei, würden wir offene zwei getrennte haben Dateizeiger auf den gleichen file-- eine zum Lesen, eine zum Schreiben. Also noch einmal, der einzige Grund, Ich, dass bringen jetzt denn wenn wir gehen, um einen Anruf zu tätigen um fgetc, dass Dateizeiger must've zum Lesen geöffnet. Und dann recht einfach, alles, was wir tun müssen, spielte in der Name der Datei-Zeiger. So char ch gleich fgetc ptr1. Das wird uns der nächste character-- oder auch, falls dies die erste Mal, dass wir diesen Anruf gemacht, die erste character-- von was auch immer Datei wird von ptr1 hingewiesen. Daran erinnern, dass das war Datei 1 Punkt Text. Es wird das erste Zeichen, dass zu bekommen und wir werden es in der Variablen ch speichern. Ziemlich einfach. Also haben wir nur blickte auf drei Funktionen und schon sind wir etwas recht ordentlich zu tun. Also, wenn wir diese Fähigkeit sich einen Charakter und wir Schleife es-- so dass wir weiterhin Zeichen erhalten aus einer Datei über und immer und over-- wir jetzt kann jede einzelne gelesen Charakter einer Datei. Und wenn wir jedes Zeichen zu drucken sofort nachdem wir es lesen, haben wir nun aus einer Datei gelesen und auf den Bildschirm geschrieben seinen Inhalt. Wir haben effektiv verkettet diese Datei auf dem Bildschirm. Und das ist, was die Linux Befehl cat tut. Wenn Sie Katze im Dateinamen geben Sie ihn, wird der gesamte Inhalt ausdrucken der Datei in Ihrem Terminal-Fenster. Und so dieses kleine Schleife hier, nur drei Zeilen Code, aber es effektiv dupliziert der Linux-Befehl cat. Also diese Syntax vielleicht schauen ein wenig seltsam, aber hier ist, was hier passiert. Während ch gleich fgetc ist ptr nicht gleich EOF-- es ist ein ganz Bissen, aber wir brechen sie nur so ist es klar auf der Syntax. Ich habe es konsolidiert aus Gründen der Raum, auch wenn es ein wenig syntaktisch tricky. So dass dieser Teil in grün rechts Nun, was ist es denn? Nun, das ist nur unsere fgetc Anruf, oder? Wir haben gesehen, dass vor. Es ist den Erhalt eines Zeichen aus der Datei. Dann vergleichen wir, dass Zeichen gegen EOF. EOF ist ein spezieller Wert, der ist in Standard io.h, definiert, ist das Ende der Datei Charakter. Also im Grunde, was passieren wird wird diese Schleife wird ein Zeichen zu lesen, vergleichen Sie es mit EOF das Dateiende Charakter. Wenn sie nicht übereinstimmen, so haben wir nicht erreicht das Ende der Datei, wir werden dieses Zeichen auszudrucken. Dann werden wir wieder auf dem Sprung Anfang der Schleife erneut. Wir werden einen Charakter erhalten, überprüfen gegen EOF, drucken Sie es aus, und so weiter und so weiter und so weiter, Durchschleifen auf diese Weise bis wir das Ende der Datei erreicht. Und dann von diesem Punkt, wir gedruckt haben aus dem gesamten Inhalt der Datei. Also noch einmal, wir nur gesehen haben fopen, fclose und fgetc und schon können wir duplizieren ein Linux-Terminal-Befehl. Wie ich schon sagte am Anfang, wir hatten fgetc und fputc, und fputc war der Begleiter Funktion fgetc. Und so, wie Sie sich vorstellen können, es ist die Schreib äquivalent. Es ermöglicht uns, einen zu schreiben einzelnes Zeichen in einer Datei. Wieder, wobei die Einschränkung, nur wie es war mit fgetc, die Datei dass wir zu must've Schreiben gewesen zum Schreiben oder zum Anhängen geöffnet. Wenn wir versuchen, und verwenden Sie fputc auf eine Datei , dass wir zum Lesen geöffnet haben, wir werden leiden ein bisschen wie ein Fehler. Doch der Ruf ist ziemlich einfach. fputc Kapital A zgr2 alle das geht zu tun, ist es gehen, um den Brief zu schreiben in A in Datei 2 dot Text, der den Namen der war Datei, die wir geöffnet und zugewiesen der Zeiger auf PTR2. So werden wir ein zu schreiben Kapital A bis 2 dot Textdatei. Und wir werden ein Ausrufezeichen zu schreiben weisen auf 3 dot-Datei Text, der durch ptr3 hingewiesen wurde. Also noch einmal, ziemlich einfach hier. Aber jetzt können wir noch etwas zu tun. Wir haben diese beispiels wir waren gerade dabei über über die Möglichkeit, die Katze zu replizieren Linux Befehl derjenige ausdruckt auf den Bildschirm. Nun, jetzt, wo wir die Möglichkeit haben, Zeichen aus Dateien lesen und schreiben Sie Zeichen auf Dateien, warum wir nicht ersetzen weiß nur, dass anrufen, um mit einem Aufruf an fputc printf. Und jetzt haben wir cp dupliziert, eine sehr grundlegende Linux-Befehl dass wir sprachen über so lange Vor der Linux-Befehle Video. Wir haben effektiv dupliziert, dass genau hier. Wir lesen einen Charakter und dann sind wir Schreiben dieses Zeichen in einer anderen Datei. Lesen aus einer Datei, Schreiben zum anderen, immer und immer wieder, bis wir getroffen EOF. Wir haben bis zum Ende der bekam Datei wir versuchen, aus kopieren. Und damit wir alle geschrieben haben der Charaktere, die wir brauchen, um die Datei dass wir, um zu schreiben. Das ist also cp, die Kopierbefehl Linux. Am Anfang der Dieses Video hatte ich die Einschränkung dass wir a reden wenig über Zeiger. Hier ist zwar dort, wo wir sind gehen, um über Zeiger sprechen zusätzlich zu den Dateizeiger. Also diese Funktion sieht irgendwie beängstigend. Es hat mehrere Parameter. Es gibt eine Menge los. Es gibt eine Menge von verschiedenen Farben und Texte zurückzugreifen. Aber wirklich, es ist nur die generische Version von fgetc dass erlaubt uns, jeder zu erhalten Menge an Informationen. Es kann ein wenig ineffizient, wenn wir sein immer Zeichen ein zu einer Zeit, Durchlaufen der Datei ein Zeichen zu einem Zeitpunkt. Wäre es nicht schöner, zu bekommen, 100 zu einem Zeitpunkt oder 500 zu einem Zeitpunkt? Nun, fread und ihre Begleiter Funktion fwrite, auf die wir sprechen in einem zweiten, ermöglichen es uns, genau das zu tun. Wir können eine beliebige Menge zu lesen von Informationen aus einer Datei und wir speichern sie irgendwo vorübergehend. Anstatt nur in der Lage passen sie in einer einzigen Variablen, wir brauchen, um es in einem Array zu speichern. Und so, in vier passieren wir Argumente einen Zeiger fread-- an den Ort, wo wir sind gehen, um Informationen zu speichern, wie groß jede Informationseinheit werden, wie viele Informationseinheiten wir wollen, zu erwerben, und von die Datei, die wir wollen, um sie zu bekommen. Wahrscheinlich am besten veranschaulicht mit einem Beispiel hier. Also lassen Sie uns sagen, dass wir erklären, ein Array von 10 Zahlen. Wir sind gerade auf der ausgewiesenen Stapel beliebig int arr 10. Also das ist ziemlich einfach. Nun, was wir tun, wenn die frecall ist wir lesen Größe int mal 10 Bytes an Informationen. Größe int Befinden four-- das ist, die Größe einer ganzen Zahl in c. Also, was wir tun, ist wir lesen 40 Byte im Wert von Informationen aus der Datei auf den ptr zeigt. Und wir sind diejenigen, die Speicherung 40 Bytes irgendwo wo wir beiseite 40 Byte an Speicher. Glücklicherweise haben wir bereits getan haben, indem erklärt arr, dass Array recht. Dh fähig Halte 10 vier-Byte-Einheiten. Also insgesamt kann sie 40 halten Bytes im Wert von Informationen. Und wir sind jetzt liest 40 Byte Informationen aus der Datei, und wir sind es die Speicherung in arr. Daran erinnern, aus dem Video-on-Zeiger, der Name eines Arrays wie arr, ist eigentlich nur ein Zeiger auf das erste Element. Also, wenn wir in arr Pass gibt, wir sind in der Tat auf und übergibt einen Zeiger. Ebenso können wir this-- tun wir tun nicht notwendigerweise müssen unsere Puffer auf dem Stack zu speichern. Wir könnten auch dynamisch zuzuweisen einen Puffer wie diese, mit malloc. Denken Sie daran, wenn wir dynamisch Speicher zuweisen, wir sparen Sie es auf die Haufen, nicht den Stapel. Aber es ist noch ein Puffer. Es immer noch, in diesem Fall ist hält 640 Bytes Informationen weil ein Doppel nimmt acht Bytes. Und wir sind für 80 von ihnen zu fragen. Wir wollen Platz haben 80 Doppelzimmer zu halten. So 80 mal 8 ist 640 Byte Daten. Und das Aufruf fread ist Sammeln von 640 Bytes Informationen aus der Datei, auf die ptr und Speichern nun in arr2. Jetzt können wir auch zu behandeln fread gerade wie ein Aufruf an fgetc. In diesem Fall sind wir nur versuchen, bekommen ein Zeichen aus der Datei. Und wir brauchen nicht ein Array, um ein Zeichen zu halten. Wir können einfach speichern sie in eine Zeichenvariable. Der Haken ist jedoch, dass wenn wir einfach nur eine Variable, wir brauchen, um in den Pass Adresse dieser variablen weil erinnern, dass die erste Argument für fread ist ein Zeiger auf den Ort und die Speicher wo wir wollen, um die Informationen zu speichern. Auch der Name eines Array ist ein Zeiger. Wir wissen also nicht nötig, Und-Zeichen-Array zu tun. Aber c, wird das Zeichen c hier ist kein Array. Es ist nur eine Variable. Und so müssen wir ein übergeben Und-Zeichen c, um anzuzeigen, , dass das ist die Adresse, wo wir wollen, dieses ein Byte an Informationen zu speichern, dies ein Zeichen, wir von ptr sammeln. Fwrite-- Ich werde durchmachen dies etwas mehr quickly-- ist so ziemlich das genaue Äquivalent fread außer es ist zum Schreiben anstatt zu lesen, nur wie die other-- wir offen hatten und in der Nähe, einen Charakter, einen Charakter. Jetzt ist es zu willkürlichen Informationsmenge, rechts beliebige Menge an Informationen. So wie zuvor, können wir haben eine Reihe von 10 Zahlen wo wir bereits haben Informationen gespeichert, vielleicht. Es war wahrscheinlich ein paar Zeilen Code , dass zwischen diesen beiden gehen sollten wo ich zu füllen arr mit etwas Sinnvolles. Ich fülle ihn mit 10 verschiedenen Zahlen. Und statt, was ich Dabei wird aus arr schreiben und Sammeln der Informationen von arr. Und ich nehme diese Informationen und legt es in die Datei ein. Also anstatt es aus die Datei in den Puffer, Wir werden jetzt aus der Puffer in die Datei. So ist es gerade umgekehrt. Also noch einmal, wie zuvor, können wir auch einen Heap-Teil des Speichers dass wir dynamisch haben zugeordnet und von diesem zu lesen und schreiben, dass in der Datei. Und wir haben auch eine einzelne Variable der Lage ist, ein Byte von Informationen, wie etwa ein Zeichen. Aber auch hier müssen wir weitergeben müssen in die Adresse dieser variablen wenn wir von ihr lesen wollen. So können wir die Informationen zu schreiben finden wir an dieser Adresse auf den Dateizeiger PTR. Es gibt viele andere große Datei-I / O-Funktionen dass verschiedene Dinge neben tun die, die wir heute gesprochen haben. Ein paar von denen, Ihnen nützlich sein könnten gibt fgets und fputs, was sind das Äquivalent von fgetc und fputc aber zum Lesen eine einzelne Zeichenfolge aus einer Datei. Statt eines einzelnen Zeichens, es wird eine ganze Zeichenkette zu lesen. fprintf, die im Grunde erlaubt Sie printf verwenden, um Datei schreiben. So wie können Sie das tun, Variablensubstitution mit die Platzhalter Prozent i und Prozent D, und so weiter, mit printf Sie können in ähnlicher Weise nehmen die printf String und Druck etwas wie die in einer Datei. fseek-- wenn Sie einen DVD-Player ist die Analogie Normalerweise verwende ich hier-- ist ein bisschen wie mit Ihrem vor- und zurückspulen Tasten, um rund um den Film zu bewegen. Ebenso können Sie rund um die Datei zu bewegen. Eines der Dinge, innen dass Dateistruktur , dass c für Sie erstellt ein Indikator ist, wo Sie sind in der Datei. Sind Sie ganz am beginnend bei Byte-Null? Sind Sie bei Byte 100, Byte-1000, und so weiter? Sie können fseek willkürlich bewegen daß Indikator nach vorne oder hinten. Und ftell wieder ähnlich einem DVD-Spieler, ist wie eine kleine Uhr, die sagt, Sie, wie viele Minuten und Sekunden sind in einen bestimmten Film. In ähnlicher Weise sagt ftell Sie, wie viele Bytes Sie in die Datei. feof ist eine andere Version der Nachweis, ob Sie haben, erreicht das Ende der Datei. Und ferror ist eine Funktion, die Sie verwenden können zu erkennen, ob etwas hat schiefgegangen Arbeits mit einer Datei. Wiederum ist dies nur Kratzer auf der Oberfläche. Es gibt noch viel mehr Datei-I / O Funktionen in der Standard io.h Aber das wird wahrscheinlich erhalten Sie begann die Arbeit mit Dateizeiger. Ich bin Doug Lloyd. Dies ist CS50.