C - File I / O
L'ultimo capitolo ha spiegato i dispositivi di input e output standard gestiti dal linguaggio di programmazione C. Questo capitolo spiega come i programmatori C possono creare, aprire, chiudere file di testo o binari per la memorizzazione dei dati.
Un file rappresenta una sequenza di byte, indipendentemente dal fatto che sia un file di testo o un file binario. Il linguaggio di programmazione C fornisce l'accesso a funzioni di alto livello e chiamate di basso livello (a livello di sistema operativo) per gestire i file sui dispositivi di archiviazione. Questo capitolo ti guiderà attraverso le chiamate importanti per la gestione dei file.
Apertura di file
Puoi usare il file fopen( )funzione per creare un nuovo file o per aprire un file esistente. Questa chiamata inizializzerà un oggetto del tipoFILE, che contiene tutte le informazioni necessarie per controllare il flusso. Il prototipo di questa chiamata di funzione è il seguente:
FILE *fopen( const char * filename, const char * mode );
Qui, filename è una stringa letterale, che utilizzerai per denominare il file e accedere mode può avere uno dei seguenti valori:
Sr.No. | Modalità e descrizione |
---|---|
1 | r Apre un file di testo esistente a scopo di lettura. |
2 | w Apre un file di testo per la scrittura. Se non esiste, viene creato un nuovo file. Qui il tuo programma inizierà a scrivere il contenuto dall'inizio del file. |
3 | a Apre un file di testo per la scrittura in modalità di aggiunta. Se non esiste, viene creato un nuovo file. Qui il tuo programma inizierà ad aggiungere contenuto al contenuto del file esistente. |
4 | r+ Apre un file di testo sia in lettura che in scrittura. |
5 | w+ Apre un file di testo sia in lettura che in scrittura. Prima tronca il file a lunghezza zero se esiste, altrimenti crea un file se non esiste. |
6 | a+ Apre un file di testo sia in lettura che in scrittura. Crea il file se non esiste. La lettura inizierà dall'inizio ma la scrittura può essere solo aggiunta. |
Se hai intenzione di gestire file binari, utilizzerai le seguenti modalità di accesso invece di quelle sopra menzionate:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
Chiusura di un file
Per chiudere un file, utilizzare la funzione fclose (). Il prototipo di questa funzione è:
int fclose( FILE *fp );
Il fclose(-) la funzione restituisce zero in caso di successo, o EOFse c'è un errore nella chiusura del file. Questa funzione scarica effettivamente tutti i dati ancora in sospeso nel buffer nel file, chiude il file e rilascia tutta la memoria utilizzata per il file. L'EOF è una costante definita nel file di intestazionestdio.h.
Ci sono varie funzioni fornite dalla libreria standard C per leggere e scrivere un file, carattere per carattere, o sotto forma di una stringa di lunghezza fissa.
Scrivere un file
Di seguito è la funzione più semplice per scrivere singoli caratteri in un flusso:
int fputc( int c, FILE *fp );
La funzione fputc()scrive il valore del carattere dell'argomento c nel flusso di output a cui fa riferimento fp. Restituisce il carattere scritto scritto in caso di successo altrimentiEOFse c'è un errore. È possibile utilizzare le seguenti funzioni per scrivere una stringa con terminazione null in un flusso:
int fputs( const char *s, FILE *fp );
La funzione fputs() scrive la stringa sal flusso di output a cui fa riferimento fp. Restituisce un valore non negativo in caso di successo, altrimentiEOFviene restituito in caso di errore. Puoi usareint fprintf(FILE *fp,const char *format, ...)funzione anche per scrivere una stringa in un file. Prova il seguente esempio.
Assicurati di avere /tmpdirectory disponibile. In caso contrario, prima di procedere, è necessario creare questa directory sulla macchina.
#include <stdio.h>
main() {
FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
Quando il codice precedente viene compilato ed eseguito, crea un nuovo file test.txtnella directory / tmp e scrive due righe utilizzando due diverse funzioni. Leggiamo questo file nella prossima sezione.
Leggere un file
Di seguito è riportata la funzione più semplice per leggere un singolo carattere da un file:
int fgetc( FILE * fp );
Il fgetc()funzione legge un carattere dal file di input a cui fa riferimento fp. Il valore restituito è il carattere letto o, in caso di errore, restituisceEOF. La seguente funzione permette di leggere una stringa da un flusso:
char *fgets( char *buf, int n, FILE *fp );
Le funzioni fgets()legge fino a n-1 caratteri dal flusso di input a cui fa riferimento fp. Copia la stringa letta nel bufferbuf, aggiungendo un file null carattere per terminare la stringa.
Se questa funzione incontra un carattere di nuova riga '\ n' o la fine del file EOF prima di aver letto il numero massimo di caratteri, restituisce solo i caratteri letti fino a quel punto, incluso il carattere di nuova riga. Puoi anche usareint fscanf(FILE *fp, const char *format, ...) funzione per leggere le stringhe da un file, ma smette di leggere dopo aver incontrato il primo carattere di spazio.
#include <stdio.h>
main() {
FILE *fp;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1 : %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
Quando il codice precedente viene compilato ed eseguito, legge il file creato nella sezione precedente e produce il seguente risultato:
1 : This
2: is testing for fprintf...
3: This is testing for fputs...
Vediamo un po 'più in dettaglio cosa è successo qui. Primo,fscanf() leggere solo This perché dopo di che, ha incontrato uno spazio, la seconda chiamata è per fgets()che legge la riga rimanente finché non incontra la fine della riga. Infine, l'ultima chiamatafgets() legge completamente la seconda riga.
Funzioni di I / O binarie
Ci sono due funzioni che possono essere usate per input e output binari:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
Entrambe queste funzioni dovrebbero essere usate per leggere o scrivere blocchi di memorie, solitamente array o strutture.