C++-manual
Förutgående | Appendix B. Input/output på C:s vis | Nästa

# Utskrift till filer

Att skriva till filer i C är enkelt att göra om man kan skriva till skärmen. Det enda som egentligen behöver göras är att specificera att utskriften skall gå till en annan fil än `stdout` som representerar skärmen. Därefter kan t.ex. `printf()` användas för att skriva data till filen.

## Öppna och stänga filer

Innan man kan skriva till filer måste de öppnas. En fil öppnas i C t.ex. med funktionen `fopen()`. Den definieras på följande sätt:

    #include <stdio.h>

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

Funktionen vill alltså ha som en första parameter ett namn på en fil. Eftersom vi vill skriva till en fil behöver filen inte existera från tidigare. Den andra parametern `mode` anger vad vi vill göra med filen. Några olika strängar kan ges:

- `r` för att öppna en fil för läsning.

- `r+` för att öppna en fil för läsning och skrivning.

- `w` öppnar en fil för skrivning. Allt eventuellt tidigare innehåll i filen (om den existerade) förstörs. Filen skapas om den inte existerar.

- `w+` för att öppna en fil för läsning och skrivning. Filen skapas om den inte existerar.

- `a` öppnar en fil för skrivning, men data skrivs till slutet av filen och tidigare innehåll förstörs inte. Filen skapas om den inte existerar.

- `a+` för att öppna en fil för läsning och skrivning, men data skrivs till slutet av filen.

Funktionen returnerar en pekare till en `FILE`, som är en `struct` som i C används för att representera en fil. Filerna `stdin`, `stdout` och `stderr` är av typen `FILE`. Om filen inte kunde öppnas av någon orsak kommer funktionen att returnera `0` för att indikera att öppnandet misslyckades.

En öppnad fil stängs med funktionen `fclose()`:

    #include <stdio.h.h>

``int fclose`(FILE * stream);`

Denna funktion stänger en fil som öppnats med `fopen()`. Ett exempelprogram som öppnar och stänger en fil:

    #include <stdio.h>

    int main () {
      // öppna filen för skrivning
      FILE * F = fopen ( "foo.txt", "w" );

      // kunde vi öppna den?
      if ( F ) {
    	// allt ok, skriv meddelande til skärmen
    	printf ( "Filen öppnades ok\n" );

    	// stäng filen igen
    	fclose ( F );
      }
      else {
    	// kunde inte öppna filen
        printf ( "Filen kunde inte öppnas!\n" );
      }
    }

## Skriva data till fil

När man öppnat en fil med `fopen()` kan man skriva till den med t.ex. en version av `printf()` som heter:

    #include <stdio.h>

``int fprintf`(FILE * stream, const char * format, ...);`

Denna skiljer sig från vanliga `printf()` endast genom att den tar en extra parameter som anger vilken fil man skall skriva till. Man kan även skriva till skärmen med `fprintf()`, men då måste man explicit ange `stdout` som den fil man skriver till:

    fprintf ( stdout, "Hello world!\n" );

Vi kunde fylla på programmet från föregående avsnitt med olika `fprintf()`-satser, men det är inget svårt med att skriva till filer, så det lämnas som en övning till läsaren. :-)

## Skriva till filer teckenvis

För att skriva till filer teckenvis kan man t.ex. använda sig av en funktion som heter:

    #include <stdio.h>

``int fputc`(int c, FILE * stream);`

för att skriva tecknet `c` till filen `stream`.

## Skriva binär data till filer

I C finns en funktion `fwrite()` som kan vara praktisk då man vill skriva ut t.ex. innehållet i en vektor eller en `struct` till en fil. Den skriver ut innehållet i binär form till filen, precis som det är i minnet. Man bör dock notera att man inte kan skriva ut t.ex. pekare eller dylikt med `fwrite()`, eftersom den då skriver ut endast pekarens adress, inte det data som pekaren pekar på. Allmänt ser `fwrite()` ut på följande sätt:

    #include <stdio.h>

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

Parametrarna kräver en aning extra förklaringar. Den första parametern `ptr` är en pekare som pekar till det data som skall skrivas ut. Den andra är storleken på ett element som skall skrivas ut. Denna storlek kan fås med t.ex. `sizeof()`. Den tredje parametern `nmemb` (number of members) anger hur många element som skall skrivas ut. Om det är frågan om en vektor med t.ex. 10 element ges denna parameter värdet 10. Den sista parametern är filen som data skall skrivas till.

Mera information om funktionen finns i t.ex. `man`-sidan.

Förutgående | Hem | Nästa
Utskrift till skärm | Upp | Inläsning från tangentbordet