Usa il reindirizzamento dei file in C

Jinku Hu 12 ottobre 2023
Usa il reindirizzamento dei file in C

Questo articolo spiegherà diversi metodi su come utilizzare il reindirizzamento dei file in C.

Usa l’operatore < per reindirizzare l’input standard

Il reindirizzamento dei file è generalmente noto come reindirizzamento I/O sui sistemi basati su UNIX, che consente all’utente di ridefinire la provenienza dell’input standard o l’output standard. L’operatore < viene utilizzato per modificare la provenienza dell’input standard. Questo metodo può essere utile per prendere l’input dell’utente dal contenuto del file e memorizzarlo nel buffer del programma. In questo caso, utilizziamo la funzione fgets per leggere il contenuto del file finché non si incontra un carattere di nuova riga. Quando viene letto un nuovo carattere di riga, viene anche memorizzato nel buffer specificato e successivamente viene memorizzata la stringa che termina il byte nullo.

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

Comando di esempio:

./program < input.txt

Produzione:

The first line from the input.txt file

Nel codice di esempio precedente, abbiamo allocato un buffer con un valore hardcoded. Tuttavia, il file di input fornito dall’utente potrebbe richiedere più memoria da memorizzare e dovremmo implementare un metodo adattivo per adattarsi allo scenario. Per questo, allochiamo la memoria dinamica usando malloc e gli passiamo la dimensione totale del file come numero massimo che può essere necessario per memorizzare la prima riga nel file. Questo metodo può sprecare troppa memoria se il file specificato è troppo grande e la prima riga è semplicemente breve. Tuttavia, garantisce che il codice sarà in grado di leggere nella riga più lunga fino a quando malloc non fallirà e la memoria di sistema non si esaurirà.

Si noti che, recuperiamo una dimensione di file utilizzando la chiamata di sistema stat, ma ha bisogno del percorso del file di input, che non può essere recuperato se non viene passato esplicitamente come argomento della riga di comando. Attenzione però, ogni chiamata di funzione deve essere controllata per un ritorno riuscito per garantire che fgets non provi a scrivere nella regione di memoria non inizializzata e causi la chiusura del programma con un errore.

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

Comando di esempio:

./program input.txt < input.txt

Produzione:

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

Articolo correlato - C File