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:

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.