GNU/Linux >> Znalost Linux >  >> Linux

Práce se soubory v C s příklady (fopen, fread, fwrite, fseek)

Jako u každého OS je i v Linuxu základním konceptem práce se soubory. Každý systémový programátor by se to naučil jako jeden ze svých počátečních programovacích úkolů. Tento aspekt programování zahrnuje systémové soubory.

Prostřednictvím manipulace se soubory lze provádět operace, jako je vytváření, úprava, mazání atd. na systémových souborech. Zde v tomto článku se snažím přinést úplné základy práce se soubory. Doufám, že tento článek vyčistí horní vrstvu tohoto vícevrstvého aspektu.

Funkce pro práci se soubory

V tomto článku se budeme zabývat následujícími funkcemi, které se běžně používají při práci se soubory:

fopen()

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

Funkce fopen() se používá k otevření souboru a přidruží k němu I/O proud. Tato funkce má dva argumenty. První argument je ukazatel na řetězec obsahující název souboru, který se má otevřít, zatímco druhý argument je režim, ve kterém se má soubor otevřít. Režim může být:

  • ‘r‘    :  Otevřete textový soubor ke čtení. Proud je umístěn na začátku souboru.
  • ‘r+‘ :  Otevřeno pro čtení a psaní. Proud je umístěn na začátku souboru.
  • ‘w’   :  Zkraťte soubor na nulovou délku nebo vytvořte textový soubor pro zápis. Proud je umístěn na začátku souboru.
  • „w+“ :Otevřeno pro čtení a psaní. Soubor je vytvořen, pokud neexistuje, jinak je zkrácen. Proud je umístěn na začátku souboru.
  • ‘a’    :Otevřít pro připojení (zápis na konec souboru). Soubor je vytvořen, pokud neexistuje. Proud je umístěn na konec souboru.
  • „a+“ :Otevře pro čtení a přidávání (zápis na konec souboru). Soubor je vytvořen, pokud neexistuje. Počáteční pozice souboru pro čtení je na začátku souboru, ale výstup je vždy připojen na konec souboru.

Funkce fopen() při úspěchu vrací ukazatel proudu FILE, zatímco v případě selhání vrací NULL.

fread() a 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);

Funkce fread/fwrite se používají pro čtení/zápis dat ze/do souboru otevřeného funkcí fopen. Tyto funkce přijímají tři argumenty. První argument je ukazatel na vyrovnávací paměť používanou pro čtení/zápis dat. Čtená/zapisovaná data jsou ve formě prvků ‚nmemb‘, z nichž každý má délku ‚velikost‘ bajtů.

V případě úspěchu vrátí fread/fwrite počet bajtů skutečně přečtených/zapsaných z/do proudu otevřeného funkcí fopen. V případě selhání je vrácen menší počet byes (pak je požadováno čtení/zápis).

fseek()

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

Funkce fseek() se používá k nastavení indikátoru pozice souboru pro proud na novou pozici. Tato funkce přijímá tři argumenty. První argument je ukazatel proudu FILE vrácený funkcí fopen(). Druhý argument „offset“ říká množství bajtů, které se mají hledat. Třetí argument „odkud“ říká, odkud se má provést hledání „offsetu“ počtu bajtů. Dostupné hodnoty odkud jsou SEEK_SET, SEEK_CUR nebo SEEK_END. Tyto tři hodnoty (v pořadí) zobrazují začátek souboru, aktuální pozici a konec souboru.

Po úspěchu tato funkce vrátí 0, jinak vrátí -1.

fclose()

int fclose(FILE *fp);

Funkce fclose() nejprve vyprázdní proud otevřený pomocí fopen() a poté zavře základní deskriptor. Po úspěšném dokončení tato funkce vrátí 0, jinak se vrátí konec souboru (eof). V případě selhání, pokud je stream dále přístupný, zůstane chování nedefinované.

Kód

#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;
}

Výše uvedený kód předpokládá, že máte testovací soubor „test.txt“ umístěný na stejném místě, odkud bude tento spustitelný soubor spuštěn.

Na začátku je obsah souboru :

$ cat test.txt
hello everybody

Nyní spusťte kód :

$ ./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()

Znovu zkontrolujte obsah souboru test.txt. Jak vidíte níže, obsah souboru byl upraven.

$ cat test.txt
hello everybody
hello

Linux
  1. Třídit příkaz v Linuxu s příklady

  2. příkaz chattr v Linuxu s příklady

  3. 10 Sed (Editor streamu) Příklady příkazů

  1. 10 Quick Linux Tail Command s příklady

  2. 10+ Linux VI příkazy s příklady

  3. Použití Logrotate v linuxu ke správě souborů protokolu (s příklady)

  1. 17 Užitečný příkaz Tar s praktickými příklady v Linuxu

  2. Linux Zip a Unzip Command s příklady

  3. Rozdílový příkaz v Linuxu s příklady