Datei-Umleitung in C verwenden

Jinku Hu 12 Oktober 2023
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C File