>> 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.