Spis treści

Operacje na plikach (strumieniach)

Funkcje dotyczące operacji na plikach (strumieniach) zadeklarowane są w pliku stdio.h

#include <stdio.h>

Strumień
Dostęp do strumienia odbywa się poprzez zmienną typu uzyskiwaną w momencie otworzenia pliku

FILE* f;

Otwieranie i zamykanie strumienia
Operacje na plikach są możliwe po otworzeniu pliku za pomocą funkcji fopen

FILE *fopen(char *nazwapliku, char *tryb);
Tryb
r Odzczyt
w Zapis (nadpisz od początku)
a Dodaj na końcu

Po zakończeniu pracy na pliku należy go zamknąć za pomocą funkcji fclose

int fclose (FILE *plik);

Odczyt pojedynczego znaku ze strumienia

int fgetc(FILE *p);

Funkcja fgetc zwraca wartość EOF, gdy strumień jest pusty (koniec pliku).

Umieszczenie pojedynczego znaku w strumieniu (w pliku)

int fputc(char znak, FILE* plik);

Wykrywanie błędów (koniec pliku)

int feof(FILE *plik);

Zwraca wartość 1 gdy osiągnięto koniec pliku.

Więcej informacji o funkcjach biblioteki stdio.h

Przykład 1 - Czytanie sekwencji znaków z pliku

#include<stdio.h>
 
int main()
{
   FILE *plik = NULL;
   int znak;
 
   plik = fopen( "plik.txt", "r" );
   if( plik == NULL )
   {
      printf("Wystapil blad otczytu pliku\n");
      return 1;
   }
 
   while( feof(plik) == 0 )
   {
      znak = fgetc(plik);
      if (znak != EOF) printf("%c", znak);
   }
   fclose( plik );
 
   return 0;
}

Plik źródłowy: odczyt.c
Przykładowy tekst: plik.txt

Zadanie - Licz znaki

Napisz program, który wyświetli ilość wystąpień każdej litery alfabetu (od a do z) angielskiego z tekstu zawartego w pliku tekstowym plik.txt. Program nie rozróżnia wielkości liter, tzn. znak a oraz znak A traktowany jest jako ta sama litera alfabetu.

Dane: pewien plik z tekstem
Wynik: zastaw liter alfabetu wraz z liczbami wystąpień

Przykład

A   95
B   24
C   44
D   43
E   161
F   25
G   43
H   46
I   89
...

Możliwe rozszerzenia - wyłącznie dla chętnych

Funkcja fprintf i fscanf

Zapis formatowany do pliku tekstowego

int fprintf(FILE *plik, char *format, ...);

Przykład - Zapis wartości do pliku

#include<stdio.h>
int main()
{
   int a = 42;
   float x = 3.14;
   char napis[]="Witaj swiecie\n";
   FILE* plik;
 
   printf("a = %d\n", a);
   printf("x = %f\n", x);
   printf(napis);
 
   plik = fopen("output.txt", "w");
   if (plik)
   {
      fprintf(plik, "a = %d\n", a);
      fprintf(plik, "x = %f\n", x);
      fprintf(plik, napis);
 
      fclose(plik);
   }
   else printf("Blad zapisu do pliku\n");
 
   return 0;
}

Plik źródłowy: fprintf.c

Odczyt formatowany z pliku tekstowego

int fscanf(FILE *plik,  char *format, ...);

Odczyt całej linii/łańcucha znakowego z pliku tekstowego

char* fgets (char *str, int num, FILE *plik);

Przykład - Odczyt wartości z pliku

#include<stdio.h>
 
int main()
{
   int a;
   float x;
   char napis[100]; 
   FILE* plik;
 
   plik = fopen("output.txt", "r");
   if (!plik)
   {
      printf("Blad odczytu do pliku\n");
      return 1;
   }
 
   fscanf(plik, "a = %d\n", &a);
   fscanf(plik, "x = %f\n", &x);
   fgets(napis, 100, plik);
   fclose(plik);
 
   printf("a = %d\n", a);
   printf("x = %f\n", x);
   printf("%s", napis);
 
   return 0;
}

Plik źródłowy: fscanf.c
Przykładowy plik z danymi do odczytu: output.txt

Zadanie - Generuj liczby

Napisz program, który zapisze do pliku tekstowego o nazwie liczby.txt ciąg n losowych liczb rzeczywistych z rozkładu jednostajnego z przedziału od 0 do 1.0. Do uzyskania ciągu liczb (pseudo)losowych użyj funkcji rand() z biblioteki stdlib.h.
Funkcja rand() zwraca liczbę losową całkowitą z zakresu od 0 do MAX_RAND.

int rand()

Generator liczb losowych inicjowany jest ziarnem za pomocą funkcji srand()

void srand(int seed);

Dane: liczba całkowita n określająca ilość wygenerowanych liczb
Wynik: plik liczby.txt zawierający n losowych liczb rzeczywistych z przedziału od 0 do 1

Możliwe rozszerzenia - dla chętnych

Zadanie - Statystyki

Napisz program, który dla danego ciągu wartości liczbowych zapisanych w pliku liczby.txt wyświetli następujące informacje:

Zakładamy, że w pliku wejściowym znajdują się wyłącznie liczby rzeczywiste odseparowane białymi znakami.

Dane: plik tekstowy zawierający sekwencję liczb rzeczywistych odseparowanych białymi znakami
Wynik: ilość liczb, suma i średnia wartości, wartość minimalana i maksymalna

Przykład Dla pliku wejściowego: liczby.txt program generuje nastepujące wyjście

 n       = 1000
 suma    = 504.934692
 srednia = 0.504935
 min     = 0.002058
 max     = 0.999297

Możliwe rozszerzenia - dla chętnych

0.0-0.1 4
0.1-0.2 6
...
0.9-1.0 13