Leggi file linea per linea utilizzando fscanf in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione fscanf per leggere il file linea per linea in C
  2. Utilizzare la funzione fscanf per leggere file parola per parola in C
Leggi file linea per linea utilizzando fscanf in C

Questo articolo spiegherà diversi metodi su come leggere un file linea per linea usando fscanf in C.

Usa la funzione fscanf per leggere il file linea per linea in C

La funzione fscanf fa parte delle utilità di input formattate della libreria standard C. Sono fornite funzioni multiple per sorgenti di input differenti come scanf per leggere da stdin, sscanf per leggere dalla stringa di caratteri e fscanf per leggere dal flusso di puntatori FILE. Quest’ultimo può essere utilizzato per leggere i file regolari linea per linea e memorizzarli nel buffer.

fscanf accetta specifiche di formattazione simili agli specificatori di printf, e tutti sono elencati in dettaglio in questa pagina. Nell’esempio seguente, apriamo il file di input di esempio utilizzando la chiamata alla funzione fopen e allochiamo la memoria della dimensione completa del file per memorizzare il flusso di lettura al suo interno. La stringa di formato "%[^\n] " è specificata per leggere il flusso di file fino a quando non viene incontrato il nuovo carattere di linea. fscanf restituisce EOF quando viene raggiunta la fine dell’input; quindi iteriamo con il cicli while e stampiamo ogni linea una per una.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");

  struct stat sb;
  stat(filename, &sb);

  char *file_contents = malloc(sb.st_size);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Produzione:

> Temporary string to be written to file

Si noti che, anche se il codice precedente molto probabilmente verrà eseguito correttamente se il nome del file di input esiste nel filesystem, ma più chiamate di funzione possono comunque fallire e terminare il programma in modo anomalo. Il prossimo codice di esempio è la versione modificata, in cui vengono implementate le routine di controllo degli errori.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char *file_contents = malloc(sb.st_size);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Produzione:

> Temporary string to be written to file

Utilizzare la funzione fscanf per leggere file parola per parola in C

Un altro caso utile per utilizzare la funzione fscanf è attraversare il file e analizzare ogni token separato da spazi. Nota che l’unica cosa da cambiare rispetto all’esempio precedente è l’identificatore di formato in "%[^\n ] ". La chiamata di sistema stat serve a recuperare la dimensione del file e il valore viene utilizzato per passare come argomento malloc per allocare il buffer. Questo metodo può essere dispendioso per alcuni scenari, ma garantisce che anche i file a linea singola più grandi possano essere archiviati nel buffer.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char *file_contents = malloc(sb.st_size);

  while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Produzione:

> Temporary
> string
> to
> be
> written
> to
> 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