Gestione dei file in C - Come aprire, chiudere e scrivere su file

Se hai già scritto il helloworldprogramma C , conosci già l'I / O di file di base in C:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

La gestione dei file è una delle parti più importanti della programmazione. In C, usiamo un puntatore a struttura di un tipo di file per dichiarare un file:

FILE *fp;

C fornisce una serie di funzioni integrate per eseguire operazioni di base sui file:

  • fopen() - crea un nuovo file o apri un file esistente
  • fclose() - chiudi un file
  • getc() - legge un carattere da un file
  • putc() - scrive un carattere in un file
  • fscanf() - legge un insieme di dati da un file
  • fprintf() - scrive una serie di dati in un file
  • getw() - legge un numero intero da un file
  • putw() - scrive un numero intero in un file
  • fseek() - impostare la posizione sul punto di desiderio
  • ftell() - fornisce la posizione corrente nel file
  • rewind() - impostare la posizione sul punto di inizio

Apertura di un file

La fopen()funzione viene utilizzata per creare un file o aprire un file esistente:

fp = fopen(const char filename,const char mode);

Esistono molte modalità per aprire un file:

  • r - apre un file in modalità di lettura
  • w - apre o crea un file di testo in modalità di scrittura
  • a - apre un file in modalità di aggiunta
  • r+ - apre un file sia in modalità di lettura che di scrittura
  • a+ - apre un file sia in modalità di lettura che di scrittura
  • w+ - apre un file sia in modalità di lettura che di scrittura

Ecco un esempio di lettura di dati da un file e scrittura su di esso:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

Ora potresti pensare: "Questo stampa solo del testo sullo schermo. Com'è questo file IO?"

La risposta non è ovvia all'inizio e richiede una certa comprensione del sistema UNIX. In un sistema UNIX, tutto viene trattato come un file, il che significa che puoi leggere e scrivere su di esso.

Ciò significa che la tua stampante può essere astratta come file poiché tutto ciò che fai con una stampante è scrivere con essa. È anche utile pensare a questi file come flussi, poiché come vedrai in seguito, puoi reindirizzarli con la shell.

Quindi come si relaziona helloworlde file IO?

Quando chiami printf, in realtà stai solo scrivendo su un file speciale chiamato stdout, abbreviazione di standard output . stdoutrappresenta l'output standard deciso dalla shell, che di solito è il terminale. Questo spiega perché è stato stampato sullo schermo.

Ci sono altri due flussi (cioè file) che sono disponibili con uno sforzo, stdine stderr. stdinrappresenta l' input standard , che la tua shell di solito attacca alla tastiera. stderrrappresenta l' output di errore standard , che di solito la shell allega al terminale.

File rudimentale IO, o come ho imparato a posare i tubi

Basta teoria, mettiamoci al lavoro scrivendo del codice! Il modo più semplice per scrivere in un file è quello di reindirizzare il flusso di output utilizzando lo strumento di reindirizzamento di output, >.

Se vuoi aggiungere, puoi usare >>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

Il contenuto di hello.txtWill, non a caso, sarà

Hello, world!

Supponiamo di avere un altro programma chiamato greet, simile a helloworld, che ti saluta con un dato name:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

Invece di leggere dalla tastiera, possiamo reindirizzare stdinper leggere da un file utilizzando lo <strumento:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

Nota: questi operatori di reindirizzamento sono in bashe shell simili.

Il vero affare

I metodi sopra hanno funzionato solo per i casi più elementari. Se vuoi fare cose più grandi e migliori, probabilmente vorrai lavorare con i file dall'interno di C invece che attraverso la shell.

Per fare ciò, utilizzerai una funzione chiamata fopen. Questa funzione accetta due parametri stringa, il primo è il nome del file e il secondo è la modalità.

Le modalità sono fondamentalmente le autorizzazioni, quindi rper la lettura, wper la scrittura, aper l'aggiunta. Puoi anche combinarli, quindi rwsignificherebbe che potresti leggere e scrivere sul file. Ci sono più modalità, ma queste sono le più comunemente usate.

Dopo aver ottenuto un FILEpuntatore, puoi utilizzare fondamentalmente gli stessi comandi IO che avresti usato, tranne per il fatto che devi prefiggerli con fe il primo argomento sarà il puntatore del file. Ad esempio, printfla versione del file di è fprintf.

Ecco un programma chiamato greetingsche legge un da un file contenente un elenco di nomi e scrive i saluti in un altro file:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

Supponiamo che names.txtcontenga quanto segue:

Kamala Logan Carol

Quindi dopo aver eseguito greetingsil file greet.txtconterrà:

Hello, Kamala! Hello, Logan! Hello, Carol!