Dateiverwaltung in C - Öffnen, Schließen und Schreiben in Dateien

Wenn Sie das C- helloworldProgramm 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 Datei
  • fclose() - eine Datei schließen
  • getc() - liest ein Zeichen aus einer Datei
  • putc() - schreibt ein Zeichen in eine Datei
  • fscanf() - liest einen Datensatz aus einer Datei
  • fprintf() - schreibt einen Datensatz in eine Datei
  • getw() - liest eine Ganzzahl aus einer Datei
  • putw() - schreibt eine Ganzzahl in eine Datei
  • fseek() - Stellen Sie die Position auf den gewünschten Punkt ein
  • ftell() - gibt die aktuelle Position in der Datei an
  • rewind() - 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 Lesemodus
  • w - öffnet oder erstellt eine Textdatei im Schreibmodus
  • a - öffnet eine Datei im Anhänge-Modus
  • r+ - öffnet eine Datei sowohl im Lese- als auch im Schreibmodus
  • a+ - öffnet eine Datei sowohl im Lese- als auch im Schreibmodus
  • w+ - ö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 helloworldIO zusammen und legt es ab ?

Wenn Sie anrufen printf, schreiben Sie wirklich nur in eine spezielle Datei namens stdoutkurz für Standardausgabe . stdoutstellt 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, stdinund stderr. stdinstellt die Standardeingabe dar , die Ihre Shell normalerweise an die Tastatur anfügt. stderrstellt 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.txtwird 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 stdinzu 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 bashund ä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 rzum Lesen, wSchreiben, aAnhängen. Sie können sie auch kombinieren, sodass rwSie die Datei lesen und schreiben können. Es gibt mehr Modi, aber diese werden am häufigsten verwendet.

Nachdem Sie einen FILEZeiger 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 fund das erste Argument der Dateizeiger ist. Zum Beispiel ist printfdie 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.txtenthält Folgendes:

Kamala Logan Carol

Nach dem Ausführen enthält greetingsdie Datei greet.txt:

Hello, Kamala! Hello, Logan! Hello, Carol!