Leggi file linea per linea utilizzando fscanf in C
-
Usa la funzione
fscanf
per leggere il file linea per linea in C -
Utilizzare la funzione
fscanf
per leggere file parola per parola 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
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