Guida Linguaggio C: L'Input da File
Lun 10 Dic 2007
   





Input da File

Le istruzioni per l'input da file sono le seguenti

Input da File
Funzione Descrizione
int getc(FILE *stream) Legge un carattere dallo stream e lo restituisce convertendolo in un intero.
int fgetc(FILE *stream) Produce gli stessi effetti della getc.
char *fgets(char *s, int n, FILE *stream) Legge una sequenza di caratteri dal file, e li pone nell'area puntata da s, fino a quando non incontra un carattere newline, fino a quando non ha letto n-1 caratteri, o fino a quando non incontra EOF.
int fscanf(FILE *stream, const char *formato, ...) Legge una sequenza di caratteri dal file formattandola come indicato nella stringa di formattazione.
size_t fread (void *ptr, size_t dim, size_t n, FILE *stream) Legge dal file n elementi ciascuno di dimensione pari a dim byte e li pone nell'area di memoria puntata da ptr.


getc

La funzione getc legge un carattere dallo stream indicato e restituisce il carattere letto convertendolo in un intero. Se si è raggiunta la fine del file restituisce EOF, altrimenti restituisce il carattere letto convertito in un intero. Se si è verificato un errore restituisce EOF.
Dopo la lettura del carattere l'indicatore della posizione nel file viene fatto avanzare di una posizione.

  1. #include <stdio.h>
  2. int getc(FILE *stream)

Esempio
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. FILE *f;
  5. char filename[60];
  6. char c;
  7.  
  8. int main(void)
  9. {
  10. printf("Inserire il nome del file\n");
  11. gets(filename);
  12.  
  13. f = fopen(filename, "r");
  14.  
  15. if (f == NULL) printf("Errore nell'apertura del file");
  16. else
  17. {
  18. while (!feof(f))
  19. {
  20. c = getc(f);
  21. putchar(c);
  22. }
  23.  
  24. fclose(f);
  25. }
  26.  
  27. int ch = getchar();
  28.  
  29. return 0;
  30. }

Viene aperto in lettura il file di cui viene inserito il nome, se non vi sono problemi nell'apertura del file (ad es. se il file esiste) viene letto tutto il contenuto del file e viene visualizzato sullo schermo, quindi si aspetta che venga premuto il tasto enter.

fgetc

La funzione fgetc legge un carattere dal file indicato e lo restituisce convertendolo in un intero. Il carattere viene letto come unsigned char e viene converito in un int prima di essere restituito. Dopo la lettura del carattere l'indicatore della posizione nel file viene fatto avanzare di una posizione. Se si è raggiunta la fine del file restituisce EOF. Se si verifica un errore restituisce EOF.

  1. #include <stdio.h>
  2. int fgetc(FILE *stream)

Esempio
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. FILE *f;
  5. char filename[60];
  6. char c;
  7.  
  8. int main(void)
  9. {
  10. printf("Inserire il nome del file\n");
  11. gets(filename);
  12.  
  13. f = fopen(filename, "r");
  14.  
  15. if (f == NULL) printf("Errore nell'apertura del file");
  16. else
  17. {
  18. while (!feof(f))
  19. {
  20. c = fgetc(f);
  21. putchar(c);
  22. }
  23.  
  24. fclose(f);
  25. }
  26.  
  27. int ch = getchar();
  28.  
  29. return 0;
  30. }

Viene aperto in lettura il file di cui viene inserito il nome, se non vi sono problemi nell'apertura del file (ad es. se il file esiste) viene letto tutto il contenuto del file e viene visualizzato sullo schermo, quindi si aspetta che venga premuto il tasto enter.

fgets

La funzione fgets legge una sequenza di caratteri dal file indicato, e li pone nell'area puntata da s, fino a quando non incontra un carattere newline, fino a quando non ha letto n-1 caratteri, o fino a quando non incontra EOF. La fgets inserisce alla fine della sequenza di caratteri il carattere newline e il carattere di terminazione stringa '\0'.
Se l'operazione di lettura ha avuto successo la fgets restituisce il puntatore a s, nel caso si verifichi un errore o si raggiunga la fine del file senza aver letto nessun carattere restituisce NULL.

  1. #include <stdio.h>
  2. char *fgets(char *s, int n, FILE *stream)

Esempio
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. FILE *f;
  5. char filename[60];
  6. char s[100];
  7.  
  8. int main(void)
  9. {
  10. printf("Inserire il nome del file\n");
  11. gets(filename);
  12.  
  13. f = fopen(filename, "r");
  14.  
  15. if (f == NULL) printf("Errore nell'apertura del file");
  16. else
  17. {
  18. while (!feof(f))
  19. {
  20. if (!fgets(s, 100, f)) printf("Errore nella lettura dal file\n");
  21. printf("%s \n", s);
  22. }
  23.  
  24. fclose(f);
  25. }
  26.  
  27. int ch = getchar();
  28.  
  29. return 0;
  30. }

Dal file indicato viene letta una sequenza di caratteri alla volta. La sequenza letta è costituita da al più 99 caratteri, si leggeranno meno di 99 caratteri solo nel caso in cui si incontri prima il carattere newline o la fine del file.
I caratteri letti saranno posti nell'array di caratteri s.

fscanf

La funzione fscanf legge una sequenza di caratteri dal file indicato formattandoli come indicato nella stringa di formattazione specificata e li pone nelle variabili indicate dopo la stringa di formattazione.
Se l'operazione di lettura ha avuto successo restituirà i dati letti, dopo averli convertiti, nelle variabili indicate, se si verifica un errore restituirà EOF.
Per quanto riguarda le specifiche di conversione vedere quanto scritto per la scanf e la printf.

  1. #include <stdio.h>
  2. int fscanf(FILE *stream, const char *formato, ...)

Esempio
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. FILE *f;
  5. char filename[60];
  6. char cognome[25], nome[25];
  7. int eta;
  8. char sesso;
  9.  
  10. int main()
  11. {
  12. printf("Inserire il nome del file\n");
  13. gets(filename);
  14.  
  15. f = fopen(filename, "r");
  16.  
  17. if (f == NULL) printf("Errore nell'apertura del file");
  18. else
  19. {
  20. while (!feof(f))
  21. {
  22. if (fscanf(f, "%s %s %d %c",&cognome, &nome, &eta, &sesso) != EOF)
  23. printf("Cognome: %s Nome: %s Età: %d Sesso: %c\n", cognome,
  24. nome, eta, sesso);
  25. }
  26.  
  27. fclose(f);
  28. }
  29.  
  30. int ch = getchar();
  31.  
  32. return 0;
  33. }

Viene letta, dal file indicato, una sequenza di caratteri che viene formattata come specificato nella stringa di formattazione.

fread

La funzione fread legge dal file indicato n elementi ciascuno di dimensione pari a dim byte e li pone nell'area di memoria puntata da ptr.
Se l'operazione di lettura ha avuto successo fread restituisce il numero di elementi letti, se non ha avuto successo, nel caso vi sia stato un errore o si sia raggiunta la fine del file, viene restituito un numero di elementi inferiore a n. Per sapere quale delle due possibilità (errore o fine del file) si è verificata si devono usare le due funzioni feof e ferror.

  1. #include <stdio.h>
  2. size_t fread (void *ptr, size_t dim, size_t n, FILE *stream);

Esempio
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. const int num_elementi = 3;
  5. struct dati
  6. {
  7. char cognome[25], nome[25];
  8. int eta;
  9. char sesso;
  10. };
  11.  
  12. typedef struct dati dati;
  13.  
  14. FILE *f;
  15. char filename[60];
  16. size_t res;
  17. int i;
  18. dati datip[3];
  19.  
  20. int main()
  21. {
  22. printf("Inserire il nome del file\n");
  23. gets(filename);
  24.  
  25. f = fopen(filename, "r");
  26.  
  27. if (f == NULL) printf("Errore nell'apertura del file");
  28. else
  29. {
  30. while (!feof(f))
  31. {
  32. res = fread(datip, sizeof(dati), num_elementi, f);
  33. if (!feof(f))
  34. for(i = 0; i <= num_elementi-1; i++)
  35. printf("%s %s %d %c\n", datip[i].nome, datip[i].cognome,
  36. datip[i].eta, datip[i].sesso);
  37. }
  38.  
  39. fclose(f);
  40. }
  41.  
  42. int ch = getchar();
  43.  
  44. return 0;
  45. }

Dal file indicato si leggono, finché non si raggiunge la fine del file, 3 blocchi di dati alla volta di sizeof(dati) byte di dimensione ciascuno e li si pone in datip.
Ciascun blocco viene interpretato come una struttura di tipo dati.


 
Guida Linguaggio C