Wenn Sie das C- helloworld
Programm bereits geschrieben haben, kennen Sie bereits die grundlegenden Datei-E / A in C:
/* A simple hello world in C. */ #include // Import IO functions. #include int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }
Die Dateiverwaltung ist einer der wichtigsten Teile der Programmierung. In C verwenden wir einen Strukturzeiger eines Dateityps, um eine Datei zu deklarieren:
FILE *fp;
C bietet eine Reihe von integrierten Funktionen zum Ausführen grundlegender Dateivorgänge:
fopen()
- Erstellen Sie eine neue Datei oder öffnen Sie eine vorhandene Dateifclose()
- eine Datei schließengetc()
- liest ein Zeichen aus einer Dateiputc()
- schreibt ein Zeichen in eine Dateifscanf()
- liest einen Datensatz aus einer Dateifprintf()
- schreibt einen Datensatz in eine Dateigetw()
- liest eine Ganzzahl aus einer Dateiputw()
- schreibt eine Ganzzahl in eine Dateifseek()
- Stellen Sie die Position auf den gewünschten Punkt einftell()
- gibt die aktuelle Position in der Datei anrewind()
- Stellen Sie die Position auf den Anfangspunkt ein
Datei öffnen
Die fopen()
Funktion wird verwendet, um eine Datei zu erstellen oder eine vorhandene Datei zu öffnen:
fp = fopen(const char filename,const char mode);
Es gibt viele Modi zum Öffnen einer Datei:
r
- Öffnen Sie eine Datei im Lesemodusw
- öffnet oder erstellt eine Textdatei im Schreibmodusa
- öffnet eine Datei im Anhänge-Modusr+
- öffnet eine Datei sowohl im Lese- als auch im Schreibmodusa+
- öffnet eine Datei sowohl im Lese- als auch im Schreibmodusw+
- öffnet eine Datei sowohl im Lese- als auch im Schreibmodus
Hier ist ein Beispiel für das Lesen und Schreiben von Daten aus einer Datei:
#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }
Jetzt denken Sie vielleicht: "Dies druckt nur Text auf den Bildschirm. Wie ist diese Datei-E / A?"
Die Antwort ist zunächst nicht offensichtlich und erfordert ein gewisses Verständnis des UNIX-Systems. In einem UNIX-System wird alles als Datei behandelt, dh Sie können daraus lesen und darauf schreiben.
Dies bedeutet, dass Ihr Drucker als Datei abstrahiert werden kann, da Sie mit einem Drucker nur mit ihm schreiben müssen. Es ist auch nützlich, sich diese Dateien als Streams vorzustellen, da Sie sie, wie Sie später sehen werden, mit der Shell umleiten können.
Wie hängt das mit helloworld
IO zusammen und legt es ab ?
Wenn Sie anrufen printf
, schreiben Sie wirklich nur in eine spezielle Datei namens stdout
kurz für Standardausgabe . stdout
stellt die Standardausgabe dar, die von Ihrer Shell festgelegt wird, bei der es sich normalerweise um das Terminal handelt. Dies erklärt, warum es auf Ihrem Bildschirm gedruckt wurde.
Es gibt zwei weitere Streams (dh Dateien), die Ihnen mühsam zur Verfügung stehen, stdin
und stderr
. stdin
stellt die Standardeingabe dar , die Ihre Shell normalerweise an die Tastatur anfügt. stderr
stellt die Standardfehlerausgabe dar , die Ihre Shell normalerweise an das Terminal anfügt.
Rudimentäre Datei-E / A oder wie ich gelernt habe, Rohre zu verlegen
Genug der Theorie, lassen Sie uns mit dem Schreiben von Code zur Sache kommen! Der einfachste Weg, in eine Datei zu schreiben, besteht darin, den Ausgabestream mit dem Ausgabeumleitungstool umzuleiten >
.
Wenn Sie anhängen möchten, können Sie Folgendes verwenden >>
:
# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt
Der Inhalt von hello.txt
wird nicht überraschend sein
Hello, world!
Sagen wir , wir haben ein anderes Programm namens greet
ähnlich helloworld
, dass begrüßt Sie mit einem bestimmten name
:
#include #include int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }
Anstatt von der Tastatur stdin
zu lesen , können wir mit dem <
Tool zum Lesen aus einer Datei umleiten :
# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".
Hinweis: Diese Umleitungsoperatoren befinden sich in bash
und ähnlichen Shells.
Das einzig Wahre
Die oben genannten Methoden funktionierten nur in den grundlegendsten Fällen. Wenn Sie größere und bessere Dinge tun möchten, möchten Sie wahrscheinlich mit Dateien aus C heraus arbeiten, anstatt über die Shell.
Um dies zu erreichen, verwenden Sie eine Funktion namens fopen
. Diese Funktion verwendet zwei Zeichenfolgenparameter, wobei der erste der Dateiname und der zweite der Modus ist.
Der Modus besteht im Wesentlichen aus Berechtigungen, also r
zum Lesen, w
Schreiben, a
Anhängen. Sie können sie auch kombinieren, sodass rw
Sie die Datei lesen und schreiben können. Es gibt mehr Modi, aber diese werden am häufigsten verwendet.
Nachdem Sie einen FILE
Zeiger haben, können Sie grundsätzlich dieselben E / A-Befehle verwenden, die Sie verwendet hätten, außer dass Sie ihnen ein Präfix voranstellen müssen f
und das erste Argument der Dateizeiger ist. Zum Beispiel ist printf
die Dateiversion fprintf
.
Hier ist ein Programm namens greetings
, das a aus einer Datei mit einer Liste von Namen liest und die Grüße in eine andere Datei schreibt:
#include #include int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }
Angenommen, names.txt
enthält Folgendes:
Kamala Logan Carol
Nach dem Ausführen enthält greetings
die Datei greet.txt
:
Hello, Kamala! Hello, Logan! Hello, Carol!