[Powered by Google Translate] [Datei-I / O] [Jason Hirschhorn, Harvard University] [Dies ist CS50, CS50.TV] Wenn wir von einer Datei denken, was kommt in den Sinn ist ein Microsoft Word-Dokument, ein JPEG-Bild oder ein MP3-Songs, und wir interagieren mit jedem dieser Typen von Dateien in unterschiedlicher Weise. Zum Beispiel in einem Word-Dokument, das wir Text hinzufügen während mit einem JPEG-Bild könnten wir beschneiden die Kanten oder retuschieren die Farben. Doch unter der Haube alle Dateien in unserem Computer sind nichts anderes als eine lange Folge von Nullen und Einsen. Es liegt an der speziellen Anwendung, die mit der Datei interagiert zu entscheiden, wie diese lange Sequenz zu verarbeiten und präsentieren sie an den Benutzer. Einerseits kann ein Dokument in nur einem Byte schauen, oder 8 Nullen und Einsen, und zeigen ein ASCII-Zeichen auf dem Bildschirm. Auf der anderen Seite kann ein Bitmap-Bild mit 3 Bytes schauen, oder 24 Nullen und Einsen, und interpretieren sie als 3 Hexadezimalzahlen das stellen die Werte für rote, grüne und blaue in einem Pixel eines Bildes. Was auch immer sie können wie auf Ihrem Bildschirm aussehen, in ihrem Kern, Dateien sind nichts anderes als eine Folge von Nullen und Einsen. So lasst uns eintauchen und schauen, wie wir tatsächlich manipulieren diese Nullen und Einsen wenn es um das Schreiben und Lesen aus einer Datei. Ich werde durch die Zerlegung in eine einfache 3-teilige starten. Als nächstes werde ich in zwei Code-Beispiele, die diese drei Teile zeigen tauchen. Schließlich werde ich bewerte den Prozess und einige seiner wichtigsten Details. Wie bei jeder Datei, die auf Ihrem Schreibtisch sitzt, das erste, was zu tun ist, um sie zu öffnen. In C wir dies tun, indem er einen Zeiger auf eine vordefinierte struct das stellt eine Datei auf der Festplatte. In dieser Funktion Anruf, wir entscheiden, ob wir schreiben oder lesen aus der Datei wollen. Als nächstes machen wir das eigentliche Lesen und Schreiben. Es gibt eine Anzahl von spezialisierten Funktionen wir in diesem Teil verwenden kann, und fast alle von ihnen beginnen mit dem Buchstaben F, die für Datei steht. Last, öffnen Sie verwandt mit den kleinen roten X in der oberen Ecke der Dateien auf Ihrem Computer, schließen wir die Datei mit einem letzten Aufruf der Funktion. Jetzt, da wir eine allgemeine Vorstellung von dem, was wir tun müssen, wir tauchen ein in den Code. In diesem Verzeichnis haben wir zwei C-Dateien und die entsprechenden ausführbaren Dateien. Die Schreibmaschine Programm dauert ein Befehlszeilenargument Der Name des Dokuments wollen wir schaffen. In diesem Fall nennen wir es doc.txt. Lassen Sie das Programm und geben Sie ein paar Zeilen. Hallo. Mein Name ist Jason. Schließlich werden wir "zu beenden." Wenn wir nun eine Liste aller Dateien in diesem Verzeichnis, sehen wir, dass ein neues Dokument mit dem Namen existiert doc.txt. Das ist die Datei dieses Programm gerade erstellt haben. Und natürlich, es ist auch nichts anderes als eine lange Folge von Nullen und Einsen. Wenn wir öffnen diese neue Datei, sehen wir die 3 Zeilen Code, den wir in unserem Programm eingegeben - Hallo. Mai Name ist Jason. Aber was ist eigentlich los, wenn typewriter.c läuft? Die erste Zeile von Interesse für uns ist die Linie 24. In dieser Linie, erklären wir unsere Dateizeiger. Die Funktion, die diesen Zeiger, fopen zurückkehrt, nimmt zwei Argumente. Der erste ist der Dateiname einschließlich der Dateinamenerweiterung gegebenenfalls. Daran erinnern, dass eine Dateierweiterung hat keinen Einfluss auf die Datei auf dem niedrigsten Niveau. Wir sind immer auf den Umgang mit einer langen Folge von Nullen und Einsen. Aber es beeinflussen, wie Dateien interpretiert werden und welche Anwendungen werden verwendet, um sie zu öffnen. Das zweite Argument von fopen ist ein einzelner Buchstabe das steht für das, was wir zu tun gedenken, nachdem wir die Datei zu öffnen. Es gibt drei Optionen für dieses Argument - W, R und A. Wir haben w in diesem Fall gewählt, weil wir in die Datei geschrieben werden soll. R, wie Sie wahrscheinlich erraten, ist für das Lesen der Datei. Und a zum Anfügen der Datei. Während sowohl w und a kann zum Schreiben von Dateien verwendet werden, w beginnen schriftlich vom Anfang der Datei und potentiell überschrieben werden Daten, die zuvor gespeichert wurden. Standardmäßig ist die Datei, die wir öffnen, wenn es nicht bereits existiert, ist in unserer gegenwärtigen Arbeitsverzeichnis erstellt. Allerdings, wenn wir zugreifen möchten, oder erstellen Sie eine Datei in einem anderen Ort, im ersten Argument von fopen, können wir einen Pfad neben dem Dateinamen anzugeben. Während der erste Teil dieses Verfahrens ist nur eine Codezeile lang, Es ist immer ratsam, einen weiteren Satz von Zeilen enthalten dass überprüfen, um sicherzustellen, dass die Datei erfolgreich geöffnet wurde oder erstellt. Wenn fopen null zurück, würden wir nicht wollen, zu forcieren mit unserem Programm, und dies kann geschehen, wenn das Betriebssystem nicht genug Speicher oder wenn wir eine Datei in einem Verzeichnis, für das wir uns nicht über die richtigen Berechtigungen zu öffnen. Teil zwei des Prozesses erfolgt in Schreibmaschine while-Schleife. Wir verwenden eine CS50-Bibliothek Funktion Eingaben des Benutzers zu erhalten, und vorausgesetzt, sie wollen nicht, um das Programm zu beenden, verwenden wir die Funktion fputs den String zu nehmen und schreibt sie in die Datei. fputs ist nur eine der vielen Funktionen, die wir verwenden, um die Datei zu schreiben könnte. Andere sind fwrite, fputc und sogar fprintf. Unabhängig von der speziellen Funktion, die wir am Ende mit allerdings alle von ihnen wissen müssen, über ihre Argumente mindestens zwei Dinge - was zu geschrieben werden und wo sie die geschrieben werden muss. In unserem Fall ist der Eingang der String, der geschrieben werden muss und fp ist der Zeiger, die uns lenkt, wo wir schreiben. In diesem Programm ist Teil zwei des Prozesses recht unkompliziert. Wir sind einfach unter einen String vom Benutzer und Hinzufügen direkt an unsere Datei mit wenig bis keine Eingabe Validierung oder Sicherheitskontrollen. Oft wird jedoch der zweite Teil nehmen den Großteil des Codes. Schließlich ist Teil drei auf der Leitung 58, wo wir die Datei zu schließen. Hier nennen wir fclose und geben es unseren ursprünglichen Dateizeiger. In der nachfolgenden Zeile, kehren wir Null, die das Ende unseres Programms. Und, ja, ist Teil drei so einfach. Lassen Sie uns auf das Lesen von Dateien zu verschieben. Zurück in unserem Verzeichnis haben wir eine Datei namens printer.c. Laufen wir es mit der Datei, die wir gerade erstellt - doc.txt. Dieses Programm, wie der Name schon sagt, wird einfach ausdrucken die Inhalte der Datei übergeben wird. Und da haben wir es. Die Linien der Code, den wir früher und tippte gespeichert doc.txt. Hallo. Mein Name ist Jason. Wenn wir tauchen ein in printer.c, sehen wir, dass ein Großteil der Code ähnlich dem, was wir gerade ging durch in typewriter.c aussieht. In der Tat, Zeile 22, wo wir die Datei öffnet, und Zeile 39, wo wir die Datei geschlossen, sind beide fast identisch mit typewriter.c für fopen zweite Argument zu speichern. Dieses Mal haben wir aus einer Datei lesen wollen, so haben wir r anstelle von w gewählt. Somit wir auf dem zweiten Teil des Prozesses zu konzentrieren. In Zeile 35, da die zweite Bedingung in unserem 4-Schleife, machen wir einen Aufruf an fgets, der Begleiter Funktion fputs von früher. Dieses Mal haben wir drei Argumente. Der erste ist der Zeiger auf das Array von Zeichen, wo der String gespeichert werden. Die zweite ist die maximale Anzahl von Zeichen, die gelesen werden. Und der dritte ist der Zeiger auf die Datei, mit der wir arbeiten. Sie werden bemerken, dass die for-Schleife, wenn fgets gibt null endet. Es gibt zwei Gründe, dass dies passiert. Erstens kann ein Fehler aufgetreten sind. Zweite und wahrscheinlicher wurde das Ende der Datei erreicht ist und keine weiteren Zeichen gelesen wurden. Falls Sie sich fragen, haben zwei Funktionen existieren, die uns erlauben zu sagen, die Vernunft ist die Ursache für diese Null-Zeiger. Und nicht überraschend, da sie mit der Arbeit mit Dateien zu tun, sowohl die ferror Funktion und die feof Funktion mit dem Buchstaben f. Schließlich, bevor wir schließen, ein kurzer Hinweis über das Ende der Datei-Funktion, die, wie eben erwähnt, wird als feof geschrieben. Oft finden Sie sich mit while und for-Schleifen schrittweise lesen Sie Ihren Weg durch Dateien. So benötigen Sie einen Weg, um diese Loops zu beenden, nachdem Sie das Ende dieser Dateien zu erreichen. Aufruf feof auf Ihrem Dateizeigers und prüft, ob es wahr ist, würde genau das tun. So könnte eine while-Schleife mit der Bedingung (! Feof (fp)) wie eine perfekt passende Lösung sein. Allerdings sagen, wir haben eine Zeile links in unserem Text-Datei. Wir geben unseren while-Schleife und alles funktioniert wie geplant. Auf der nächsten Runde durch, wird unser Programm zu überprüfen, um zu sehen, ob feof der fp wahr ist, aber - und das ist der entscheidende Punkt, der hier zu verstehen - es wird nicht wahr sein nur noch. Das ist, weil der Zweck der feof nicht zu überprüfen wenn der nächste Aufruf einer Lese-Funktion wird das Ende der Datei getroffen, sondern, um zu überprüfen, ob das Ende der Datei bereits erreicht ist. Im Fall dieses Beispiels, Lesen Sie die letzte Zeile unserer Datei passt perfekt glatt, aber das Programm noch nicht wissen, dass wir das Ende unserer Datei getroffen. Es ist nicht, bis sie einen zusätzlichen lesen kann, dass es Zähler das Ende der Datei. Somit wäre eine korrekte Zustand die folgenden sein: fgets und seine drei Argumente - Ausgang, Größe der Ausgabe und fp - und all das nicht gleich null. Dies ist der Ansatz, den wir in printer.c stattfand, und in diesem Fall, nachdem die Schleife beendet, man könnte feof oder ferror, um den Benutzer über die spezifische Begründung für den Ausstieg diese Schleife zu informieren. Schreiben und Lesen aus einer Datei ist, auf der grundlegendsten, ein einfaches 3-Schritten. Zuerst öffnen wir die Datei. Zweitens haben wir einige Dinge in unserer Datei oder nehmen Sie ein paar Dinge aus ihm heraus. Dritte schließen wir die Datei. Die ersten und letzten Teile sind einfach. Der mittlere Teil ist, wo der schwierige Dinge liegt. Und obwohl unter der Haube wir immer mit einer langen Folge von Nullen und Einsen, es hilft bei der Codierung um eine Abstraktionsebene hinzuzufügen dass sich die Reihenfolge in etwas, das ähnelt mehr, was wir zu sehen gewohnt sind. Zum Beispiel, wenn wir mit einem 24-Bit-Bitmap-Datei arbeiten, wir wahrscheinlich sein Lesen oder Schreiben von drei Bytes zu einem Zeitpunkt. In diesem Fall wäre es sinnvoll zu definieren und entsprechend benennen eine Struktur, die 3 Bytes groß ist. Obwohl die Arbeit mit Dateien mag kompliziert erscheinen, nutzen sie ermöglicht es uns, etwas wirklich Bemerkenswertes zu tun. Wir können den Zustand der Welt außerhalb unseres Programms zu ändern, schaffen wir etwas, das über das Leben unseres Programms lebt, oder wir können sogar etwas, das erstellt werden, bevor unser Programm begann lief. Interaktion mit Dateien ist ein wirklich mächtiges Teil der Programmierung in C und ich bin gespannt zu sehen, was wirst du mit ihr in den Code zu kommen erstellen. Mein Name ist Jason Hirschhorn. Dies ist CS50. [CS50.TV] [Gelächter] Okay. Einer nehmen. Here we go. Wenn wir von einer Datei zu denken - >> Oh, warten Sie. Entschuldigung. [Gelächter] Okay. Hey there. Wenn wir an einer Datei - Wenn Sie eine Datei zu denken - Okay. Sag mir, wenn du bereit bist. Oh, toll. Obwohl das Lesen von einem Teleprompter mag - nein. My bad.