Utiliser la redirection de fichiers en C

Jinku Hu 12 octobre 2023
Utiliser la redirection de fichiers en C

Cet article explique plusieurs méthodes pour utiliser la redirection de fichiers en C.

Utiliser l’opérateur < pour rediriger l’entrée standard

La redirection de fichiers est généralement connue sous le nom de redirection E/S sur les systèmes basés sur UNIX, ce qui permet à l’utilisateur de redéfinir d’où vient l’entrée standard, ou où va la sortie standard. L’opérateur < est utilisé pour changer la provenance de l’entrée standard. Cette méthode peut être utile pour prendre l’entrée utilisateur dans le contenu du fichier et la stocker dans la mémoire tampon du programme. Dans ce cas, nous utilisons la fonction fgets pour lire le contenu du fichier jusqu’à ce qu’un caractère de retour à la ligne soit rencontré. Lorsqu’un nouveau caractère de ligne est lu, il est également stocké dans la mémoire tampon donnée, et la chaîne de caractères terminant l’octet nul est stockée après cela.

#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);
}

Exemple de commande :

./program < input.txt

Production:

The first line from the input.txt file

Dans l’exemple de code précédent, nous avons alloué un tampon avec une valeur codée en dur. Néanmoins, le fichier d’entrée fourni par l’utilisateur peut nécessiter plus de mémoire pour être stocké et nous devrions mettre en œuvre une méthode adaptative pour s’adapter au scénario. Pour cela, nous allouons de la mémoire dynamique en utilisant malloc et nous lui passons la taille totale du fichier comme nombre maximum pouvant être nécessaire pour stocker la première ligne du fichier. Cette méthode peut gaspiller trop de mémoire si le fichier donné est trop grand et que la première ligne est simplement courte. Cependant, elle garantit que le code pourra être lu sur la ligne la plus longue tant que malloc ne tombera pas en panne et que la mémoire système ne sera pas épuisée.

Notez que nous récupérons une taille de fichier en utilisant l’appel système stat, mais il a besoin du nom du chemin du fichier d’entrée, qui ne peut être récupéré s’il n’est pas passé explicitement en argument de ligne de commande. Cependant, chaque appel de fonction doit être vérifié pour un retour réussi afin de garantir que les fgets n’essaient pas d’écrire dans la zone de mémoire non initialisée et ne provoquent pas l’échec du programme.

#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);
}

Exemple de commande :

./program input.txt < input.txt

Production :

The first line from the input.txt file
Auteur: 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

Article connexe - C File