Leggi un file in C

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni fopen e fread per leggere file di testo in C
  2. Usa le funzioni fopen e getline per leggere file di testo in C
Leggi un file in C

Questo articolo introdurrà più metodi su come leggere un file di testo in C.

Usa le funzioni fopen e fread per leggere file di testo in C

Le funzioni fopen e fread fanno parte delle funzionalità di input / output della libreria standard C.

fopen è usato per aprire il file dato come flusso e dare al programma l’handle per manipolarlo secondo necessità. Richiede due parametri, il nome del file come const char* stringa e la modalità in cui aprire il file specificato con valori predefiniti (r, w, a, r, w, a). Quando abbiamo bisogno di leggere un file, passiamo r come secondo parametro per aprire il file in modalità di sola lettura.

D’altra parte, la funzione fread è l’attore principale nella conduzione dell’operazione di lettura da un flusso di file già aperto. Richiede un puntatore al buffer in cui i byte letti devono essere memorizzati come primo argomento. Il secondo e il terzo argomento specificano quanti elementi leggere dal flusso e quale dimensione ha ciascuno di essi. L’ultimo argomento è il puntatore FILE* al flusso di file aperto stesso.

Si noti che stiamo anche usando la funzione stat per recuperare la dimensione del file e leggere l’intero contenuto in una singola chiamata fread. La dimensione del file viene passata anche alla funzione malloc per allocare spazio sufficiente per memorizzare l’intero contenuto del file. Attenzione però, le allocazioni dinamiche di memoria dovrebbero essere liberate dalla funzione free e i file aperti dovrebbero essere chiusi con fclose.

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

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

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

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, input_file);

  printf("%s\n", file_contents);

  fclose(input_file);
  free(file_contents);

  exit(EXIT_SUCCESS);
}

Usa le funzioni fopen e getline per leggere file di testo in C

In alternativa, possiamo saltare il recupero della dimensione del file con la funzione stat e invece iterare su ogni linea del file fino a raggiungere la fine utilizzando la funzione getline. getline legge la stringa in ingresso dal flusso di file specificato. Come suggerisce il nome, la funzione recupera tutti i byte finché non viene trovato il carattere di nuova linea.

getline accetta tre parametri, il primo dei quali memorizza i byte letti. Può essere dichiarato come char* e impostato su NULL. Nel frattempo, se il secondo argomento è l’indirizzo dell’intero 0, la getline alloca automaticamente la memoria dinamica per il buffer, che dovrebbe essere liberato dall’utente, da qui la chiamata alla funzione free alla fine del programma.

Notare che questi parametri possono avere valori diversi se necessario, tutti spiegati in questa funzione manuale. Il terzo parametro è il puntatore FILE* del flusso di file aperto.

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

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  char* contents = NULL;
  size_t len = 0;
  while (getline(&contents, &len, input_file) != -1) {
    printf("%s", contents);
  }

  fclose(input_file);
  free(contents);

  exit(EXIT_SUCCESS);
}
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