Inläsning från fil

Vid det här laget är inläsning från fil mycket enkelt. Vi har redan behandlat alla nästan funktioner som behövs. Det första som måste göras om man vill läsa från en fil på disken är att filen måste öppnas för läsning. Se avsnittet Öppna och stänga filer. Då filen är öppnad för läsning kan man använda t.ex. följande funktioner för att läsa data från filen:

#include <stdio.h>

int fgetc(FILE * stream);

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

Dessa är båda varianter på getchar() respektive scanf(), med den skillnaden att man explicit anger en fil, istället för att anta filen stdin. Vi kan nu göra ett program som kopierar en fil effektivt:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) {
  int c;
  FILE * Source;
  FILE * Destination;
  
  // kolla antalet argument
  if ( argc != 3 ) {
    // fel antal argument
    printf ("Fel antal argument!\n" );
    printf ("Användning: %s infil utfil\n", argv[0] );
    exit (EXIT_FAILURE);
  }
  
  // öppna fil för läsning
  if ( (Source = fopen (argv[1], "r" )) == 0 ) {
    // kunde inte öppna filen
    printf ("Kunde inte öppna filen '%s'\n", argv[1] );
    exit (EXIT_FAILURE);
  }
  
  // öppna fil för skrivning
  if ( (Destination = fopen (argv[2], "w" )) == 0 ) {
    // kunde inte öppna filen
    printf ("Kunde inte öppna filen '%s'\n", argv[2] );
    exit (EXIT_FAILURE);
  }
  
  // läs tecken ända tills vi får ett EOF (end of file)
  while ( (c = fgetc ( Source )) != EOF ) {
    fputc ( c, Destination );
  }

  // stäng alla filer
  fclose ( Source );
  fclose ( Destination );
}

Programmets egentliga huvudslinga använder sig av fgetc() och fputc() för att läsa och skriva ett tecken i taget. Tecknet läses som en int så att man kan ha en speciellt tecken EOF som inte blandas ihop med vanliga tecken. Se mera om funktionerna på deras respektive man-sidor.