GNU/Linux >> Linux Esercitazione >  >> Linux

Gestione dei file in C con esempi (fopen, fread, fwrite, fseek)

Come con qualsiasi sistema operativo, la gestione dei file è un concetto fondamentale in Linux. Qualsiasi programmatore di sistema lo imparerebbe come uno dei suoi incarichi di programmazione iniziali. Questo aspetto della programmazione riguarda i file di sistema.

Attraverso la gestione dei file, è possibile eseguire operazioni come creare, modificare, eliminare ecc. Sui file di sistema. Qui in questo articolo cerco di introdurre le basi della gestione dei file. Spero che questo articolo elimini lo strato superiore di questo aspetto multistrato.

Funzioni di gestione dei file

In questo articolo, tratteremo le seguenti funzioni comunemente utilizzate nella gestione dei file:

fopen()

FILE *fopen(const char *path, const char *mode);

La funzione fopen() viene utilizzata per aprire un file e associare un flusso di I/O ad esso. Questa funzione accetta due argomenti. Il primo argomento è un puntatore a una stringa contenente il nome del file da aprire mentre il secondo argomento è la modalità di apertura del file. La modalità può essere:

  • 'r'    : Apri il file di testo per la lettura. Lo stream è posizionato all'inizio del file.
  • 'r+' : Aperto per leggere e scrivere. Lo stream è posizionato all'inizio del file.
  • 'w'   :  Tronca il file a lunghezza zero o crea un file di testo per la scrittura. Lo stream è posizionato all'inizio del file.
  • 'w+':aperto per leggere e scrivere. Il file viene creato se non esiste, altrimenti viene troncato. Lo stream è posizionato all'inizio del file.
  • 'a'    :aperto per l'aggiunta (scrivendo alla fine del file). Il file viene creato se non esiste. Lo stream è posizionato alla fine del file.
  • 'a+':aperto per la lettura e l'aggiunta (scrittura alla fine del file). Il file viene creato se non esiste. La posizione iniziale del file per la lettura è all'inizio del file, ma l'output viene sempre aggiunto alla fine del file.

La funzione fopen() restituisce un puntatore al flusso FILE in caso di successo mentre restituisce NULL in caso di errore.

fread() e fwrite()

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Le funzioni fread/fwrite vengono utilizzate per leggere/scrivere dati da/verso il file aperto dalla funzione fopen. Queste funzioni accettano tre argomenti. Il primo argomento è un puntatore al buffer utilizzato per leggere/scrivere i dati. I dati letti/scritti sono sotto forma di elementi 'nmemb' lunghi ogni byte 'size'.

In caso di successo, fread/fwrite restituisce il numero di byte effettivamente letti/scritti da/al flusso aperto dalla funzione fopen. In caso di guasto viene restituito un numero di bye inferiore (quindi richiesto in lettura/scrittura).

fseek()

int fseek(FILE *stream, long offset, int whence);

La funzione fseek() viene utilizzata per impostare l'indicatore di posizione del file per il flusso su una nuova posizione. Questa funzione accetta tre argomenti. Il primo argomento è il puntatore del flusso FILE restituito dalla funzione fopen(). Il secondo argomento "offset" indica la quantità di byte da cercare. Il terzo argomento "da dove" indica da dove deve essere eseguita la ricerca del numero di byte "offset". I valori disponibili per la provenienza sono SEEK_SET, SEEK_CUR o SEEK_END. Questi tre valori (in ordine) rappresentano l'inizio del file, la posizione corrente e la fine del file.

In caso di successo, questa funzione restituisce 0, altrimenti restituisce -1.

fclose()

int fclose(FILE *fp);

La funzione fclose() prima svuota il flusso aperto da fopen() e poi chiude il descrittore sottostante. Al completamento con successo, questa funzione restituisce 0 altrimenti viene restituita la fine del file (eof). In caso di errore, se si accede ulteriormente allo stream, il comportamento rimane indefinito.

Il codice

#include<stdio.h>
#include<string.h>

#define SIZE 1
#define NUMELEM 5

int main(void)
{
    FILE* fd = NULL;
    char buff[100];
    memset(buff,0,sizeof(buff));

    fd = fopen("test.txt","rw+");

    if(NULL == fd)
    {
        printf("\n fopen() Error!!!\n");
        return 1;
    }

    printf("\n File opened successfully through fopen()\n");

    if(SIZE*NUMELEM != fread(buff,SIZE,NUMELEM,fd))
    {
        printf("\n fread() failed\n");
        return 1;
    }

    printf("\n Some bytes successfully read through fread()\n");

    printf("\n The bytes read are [%s]\n",buff);

    if(0 != fseek(fd,11,SEEK_CUR))
    {
        printf("\n fseek() failed\n");
        return 1;
    }

    printf("\n fseek() successful\n");

    if(SIZE*NUMELEM != fwrite(buff,SIZE,strlen(buff),fd))
    {
        printf("\n fwrite() failed\n");
        return 1;
    }

    printf("\n fwrite() successful, data written to text file\n");

    fclose(fd);

    printf("\n File stream closed through fclose()\n");

    return 0;
}

Il codice sopra presuppone che tu abbia un file di test "test.txt" posizionato nella stessa posizione da cui verrà eseguito questo eseguibile.

Inizialmente il contenuto del file è:

$ cat test.txt
hello everybody

Ora, esegui il codice :

$ ./fileHandling 

 File opened successfully through fopen()

 Some bytes successfully read through fread()

 The bytes read are [hello]

 fseek() successful

 fwrite() successful, data written to text file

 File stream closed through fclose()

Controlla di nuovo il contenuto del file test.txt. Come vedi sotto, il contenuto del file è stato modificato.

$ cat test.txt
hello everybody
hello

Linux
  1. Ordina il comando in Linux con esempi

  2. Oltre 10 comandi VI Linux con esempi

  3. comando chattr in Linux con esempi

  4. Utilizzo di Logrotate in Linux per gestire i file di registro (con esempi)

  5. 10 Esempi di comandi Sed (Stream Editor).

Timestamp dei file Linux spiegati con esempi

Reindirizzamento Bash spiegato con esempi

Utilizzo del comando Linux mv con esempi

Comando di montaggio Linux con esempi

Comando gawk Linux con esempi

Linux make Command con esempi