Datei-Umleitung in C verwenden
In diesem Artikel werden mehrere Methoden zur Verwendung der Datei-Umleitung in C erklärt.
Verwenden Sie den <
-Operator, um die Standardeingabe umzuleiten
Die Datei-Umleitung ist auf UNIX-basierten Systemen allgemein als I/O
-Umleitung bekannt, die es dem Benutzer ermöglicht, neu zu definieren, woher die Standardeingabe kommt bzw. wohin die Standardausgabe geht. Der Operator <
wird verwendet, um zu ändern, woher die Standardeingabe kommt. Diese Methode kann nützlich sein, um Benutzereingaben aus dem Dateiinhalt zu übernehmen und im Programmpuffer zu speichern. In diesem Fall verwenden wir die Funktion fgets
, um den Inhalt der Datei zu lesen, bis ein Zeilenumbruchszeichen angetroffen wird. Wenn ein neues Zeilenzeichen gelesen wird, wird es ebenfalls im angegebenen Puffer gespeichert, und das Null-Byte, das die Zeichenkette beendet, wird danach gespeichert.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define SIZE 1000
int main(int argc, char *argv[]) {
char buf[SIZE];
printf("Write input text: ");
fgets(buf, SIZE, stdin);
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
Beispiel-Befehl:
./program < input.txt
Ausgabe:
The first line from the input.txt file
Im vorigen Beispielcode haben wir einen Puffer mit einem fest kodierten Wert zugewiesen. Dennoch kann die vom Benutzer bereitgestellte Eingabedatei mehr Speicher benötigen, und wir sollten eine adaptive Methode implementieren, um dem Szenario gerecht zu werden. Dazu weisen wir mit malloc
dynamischen Speicher zu und übergeben ihm die gesamte Dateigröße als die maximale Anzahl, die zum Speichern der ersten Zeile in der Datei benötigt werden kann. Diese Methode kann zu viel Speicher verschwenden, wenn die gegebene Datei zu groß ist und die erste Zeile einfach nur kurz ist. Sie garantiert jedoch, dass der Code in der Lage ist, die längste Zeile einzulesen, solange malloc
nicht fehlschlägt und der Systemspeicher nicht erschöpft ist.
Beachten Sie, dass wir die Dateigröße mit dem Systemaufruf stat
abfragen, aber dieser benötigt den Pfadnamen der Eingabedatei, der nicht abgefragt werden kann, wenn er nicht explizit als Kommandozeilenargument übergeben wird. Beachten Sie jedoch, dass jeder Funktionsaufruf auf eine erfolgreiche Rückkehr überprüft werden muss, um sicherzustellen, dass fgets
nicht versucht, in den nicht initialisierten Speicherbereich zu schreiben und das Programm mit einem Fehler abbricht.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
char *buffer = NULL;
const char *filename = NULL;
struct stat sb;
if (argc != 2) {
printf("Usage: ./program filename < filename\n");
exit(EXIT_FAILURE);
}
filename = argv[1];
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
buffer = malloc(sb.st_size);
if (!buffer) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Write input text: ");
if (fgets(buffer, sb.st_size, stdin) == NULL) {
perror("fgets");
exit(EXIT_FAILURE);
}
printf("%s\n", buffer);
exit(EXIT_SUCCESS);
}
Beispiel-Befehl:
./program input.txt < input.txt
Ausgabe:
The first line from the input.txt file
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook