FILE: tipo operazione Istruì. prototipo esempi lettura di un carattere

Transcript

FILE: tipo operazione Istruì. prototipo esempi lettura di un carattere
FILE:
tipo operazione
lettura di un carattere
alla volta
Scrittura di un
carattere alla volta
Lettura di una linea
alla volta
Scrittura di una linea
alla volta
Lettura di un record
(lunghezza fissa)
Scrittura di un
record(ll fissa)
Lettura non
strutturata (campo a
campo)
Scrittura non
strutturata
Accesso diretto allo iesimo record
Istruì.
fgetc
prototipo
Int fgetc(FILE *flusso)
fputc
Int fputc(int ch, FILE *flusso);
fgets
Char fgets(char *str, int num, FILE *flusso);
fputs
Int fputs(const char *str, FILE *flusso);
fread
Size_t fread(void *buffer, size_t num_byte, size_t
contatore, FILE *fp)
Size_t fwrite(void *buffer, size_t num_byte, size_t
contatore, FILE *fp)
Int fscanf(FILE *fp, const char * stringa di
controllo, …)
fwrite
fscanf
fprintf
fseek
Apertura del file
fopen
Chiusura del file
Cancellazione del file
Condizione di fine file
fclose
remove
feof
Int fprintf(FILE *fp, const char * stringa di
controllo, …)
Int fseek(FILE *fp, long num_byte, int origine);
Origine : SEEK_SET oppure 0
SEEK_CURR oppure 1
SEEK_END oppure 2
FILE *fopen(const char*fname, const char
*mode);
Int fclose(FILE *flusso)
Int remove(char *nomefile)
Int feof(FILE *fp)
esempi
Vedi sotto
fgets(str,sizeof(….),fp)
vedi sotto
vedere dopo
fp =
fopen(argv[1],”a+”)
… remove(argv[1])…
While (!feof(fp)) …
1) Lettura di un file un carattere alla volta
a)…..
…..
FILE *fpin;
….
int c; /* dichiarato di tipo int per poter testare EOF */
…..
…
while ((c=fgetc(fpin) != EOF)
{
…}
Il valore EOF viene restituito anche nel caso in cui fgetc( ) incontri un errore. Se lavorate con file binari dovete usare la
funzione ferror( ) per controllare un'eventuale condizione di errore nell'accesso al file.
Esempio .
Questo programma legge e mostra sullo schermo il contenuto di un file di tipo testo:
#include "stdio.h"
#include "stdlib.h"
main(int argc, char *argv[l)
{
FILE *fp;
char ch;
if((fp=fopen(argv[1],”r"))==NULL}
{ printf'(“il file non può essere aperto\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF)
{
printf{"%c",ch);
}
fclose(fp);
}
b)
{
FILE *fp;
char ch;
….
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch = fgetc(fp);
}
c)
do {
ch = fgetc(fp);
} while (ch!= EOF);
1b) scrittura di un carattere alla volta.
#include "stdio.h"
int fputc(int ch, FILE *flusso);
La funzione fputc() scrive nel flusso specificato il carattere ch alla posizione corrente del file e poi incrementa l’
indicatore di posizione. Sebbene ch sia dichiarato come intero, la funzione fputc( ) lo converte in un unsìgned char.
Poiché tutti gli argomenti di tipo carattere sono convertiti in interi alla chiamata della funzione, generalmente vengono
usate come argomenti le variabili di tipo carattere. Se viene usalo un intero, viene scartato il byte più significativo.
Il valore restituito da fputc( ) è quello del carattere scritto. Se si verifica un errore, la funzione restituisce EOF. Per i file
dì tipo binario, il carattere EOF può essere considerato valido e bisogna quindi utilizzare la funzione ferror( ) per
determinare un'eventuale condizione di errore.
2) Lettura di un file una linea alla volta
char *fgets(char *buffer, int n,FILE *fpin);
….
#define MAXSTR 81
..
{
char buff[MAXSTR +1];
….
while (fgets(buff, MAXSTR,fpin) != NULL)
{….. }
}
…
La funzione fgets() legge una stringa dal flusso specificato fino alla lettura di un new line o di lung – 1 caratteri.
Eventuali caratteri new line vengono memorizzati nella stringa ( a differenza di gets()) e la stringa risultante viene
terminata da un carattere nullo. La funzione restituisce un puntatore a str o un puntatore nullo nel case di errore .
La funzione fgets legge una linea ( con un massimo di caratteri pari a n meno 1) dal file e pone la linea in buffer. La
linea viene terminata da un \n o da EOF. Alla linea o agli n caratteri contenuti in buffer viene aggiunto un terminatore di
stringa
Esempio
Questo programma usa la funzione fgets( ) per mostrare sullo schermo il contenuto di un file di tipo testo specificato
nella riga di comando.
#include "stdio.h"
#include "stdlib.h"
void main{int argc, char *argv[])
{
FILE *fp;
char str[128];
if({fp=fopen(argv[1],"r”))==NULL)
{
printf("Il file non può essere aperto\n");
exit(1);
}
while((!feof(fp))
{
il (fgets(str,126,fp)) printf{"%s.str);
}
}
fclose(fp);
2b) scrittura di una linea alla volta
«include "stdio.h"
int fputs(const char *str, FILE *flusso);
La funzione fputs( ) scrive il contenuto della stringa puntata da str nel flusso specificato. Il terminatore NULL non
viene scritto.
La funzione fputs( ) restituisce 0 se la chiamata ha successo, altrimenti il valore EOF.
Se il flusso è aperto con modalità di tipo testo, la funzione può effettuare alcune conversioni di caratteri. Ciò significa
che può non esserci una corrispondenza uno a uno tra la stringa e il file. Viceversa, se il file viene aperto in modalità
binaria. non si verifica alcuna traduzione di caratteri e c'è una corrispondenza uno a uno tra la stringa e il file.
Esempio
Questa istruzione scrive la stringa Questa è una prova sul flusso a cui punta fp:
fputs("Questa è una prova",fp);
3) Lettura di un file in parti di dimensioni fissate
size_t fread(void *buffer,size_t num_byte,size_ contatore, FILE *fp);
il valore restituito da fread e’ il numero di elementi letti. Il valore di ritorno sara’’ minore o uguale a numero in caso di
errore o se viene letto il carattere di fine file
4) La funzione FEOF()
prototipo
int feof(FILE *fp)
La funzione feof() consente di verificare la condizione di fine file per una lettura di file binari e di testo
La funzione restituisce il valore vero alla fine del file e zero altrimenti
Esempio
…
while(!feof(fp)){
fgets(str,79,fp);
printf(str);
}
5) la funzione fscanf() e fprintf()
Nel sistema di I/O bufferizzato sono comprese anche fprintf() e fscanf( ), che si comportano esattamente come le
funzioni printf( ) e scanf( ), con l'eccezione che lavorano su file su disco. Il loro prototipo generale è:
ìnt fprintf(FILE *fp, const char *stringa_di_controtlo,...);
ìnt fscanf(FILE *fp, const char *stringa_di_contrltlo,...);
in cui, come sempre, fp è il puntatore restituito dall'apertura con fopen( ). fprìntf( ) e fscanf( ) dirigono le loro
operazioni di I/O sul file a cui punta fp.
#include "stdio.h"
int fscanf(FILE *flusso, const char *format,...);
La funzione fscanf( ) opera esattamente come scanf( ) ma legge l'informazione dal flusso specificato da flusso invece
che da stdin .
La funzione fscanf( ) restituisce il numero di argomenti ai quali è stato effettivamente assegnalo un valore e questo
numero non comprende i campi saltali. Il valore EOF implica una condizione di errore precedente alla prima
assegnazione.
Esempio
Le seguenti istruzioni leggono una stringa e un numero float dal flusso fp:
char str[80];
float f;
fscanf(fp, "%s%f",str, &f);
#include "stdio.h"
int fprintf(FILE *flusso, const char *format,...);
La funzione fprintf () stampa sul flusso specificato i valori degli argomenti compresi nell'elenco degli argomenti come
richiesto nella stringa format. Il valore restituito è il numero di caratteri stampati realmente; se si verifica un errore,
viene restituito un valore negativo.
Le operazioni di stringa di controllo del formato e i comandi sono uguali a quelli delle funzioni printf( )
Esempio
Questo programma crea un file chiamato testo e scrive nel file la stringa Questa è una prova. 10 20.01, usando la
funzione fprintf( ):
#include "stdio.h"
#include "stdlib.h"
void main(void)
{
FILE *fp;
if((fp=fopen("testo","wb"))==NULL}
{
printf("ll file non può essere aperto\n");
exit(1);
}
fprintf(fp, "Questa è una prova %d %f”, 10, 20.01);
fclose(fp);
………
\
L'uso e l'utilità delle due funzioni è mostrato dal seguente esempio, che legge da tastiera una stringa e un intero, li scrìve
in un file su disco, poi li legge dal file e li visualizza sullo schermo.
/• fscanf - fprintf: esempio */
.
# include "stdio.h"
# include "io.h"
#include "stdlib.h"
void main{void)
{
FILE *fp;
char s[80];
int t;
if((fp=fopen("test", "w")) == NULL)
{ printf("Errore nell'apertura del file\n");
exit(1);
}
printf("Inserisci una stringa e un numero: ");
fscanf(stdin, "%s%d", s, &t); /* legge dalla tastiera */
fprintf(fp, "%s %d", s, t); /* scrive nel file */
fclose(fp);
if((fp=fopen(“ ”test","r")) == NULL)
{ printf("Errore nell'apertura del file”);
exit(1);
}
fscanf(fp, "%s%d", s, &t); /* legge dal (ile */
fprintf(stdout, "%s %d", s. t); /* visualizza sullo schermo */
}
fclose(fp);
}
NOTA BENE: questo esempio scrive e legge un solo record
OVVIAMENTE invece di usare fscanf per standard input si poteva usare scanf e invece di fprintf su standard output si
poteva usare printf
NOTA bene!!!!!!!! Fprintf e fscanf permettono di scrivere e leggere facilmente su file dati disomogenei ma non
sono le istruzioni più efficienti. Infatti i dati sono in formato ASCII e non binari. Qualora siano richieste
particolari esigente di velocità ed efficienza meglio ricorrere a fread() e ferite()
GLI ARGOMENTI PRESENTI SULLA LINEA DI COMANDO
UNIX>nome_eseguibile nome_file_1 nome_file_2
(sulle linea comandi in questo esempio sono stati digitati tre parametri)
… nel programmma C:
void main(int argc, char *argv[ ])
argc contiene il numero di parametri presenti sulla linea di comando (3 nel nostro caso)
argv[ ] e’ chiamato vettore degli argomenti ed e’ un array di puntatori a char
esempio di utilizzo
….
FILE *fpin, *fpout;
void apri_file(int arcg, char *argv[ ]);
…
void main (int argc, char *argv[ ])
{
apri_file(argc,argv);
…
}
void apri_file(int argc, char *argv[ ])
{
if (argc!=3)
{printf(“errore nel numero di parametri\n”;
exit(EXIT_FAILURE);
}
if (fpin=fopen(argv[1],”r”))==NULL)
{ printf(“errore nell’apertura di %s \n”, argv[1];
exit(EXIT_FAILURE)
}
……
}