Zajęcia 10 - Odczyt i zapis plików

Biblioteka

#include <stdio.h>

Otwieranie i zamykanie pliku

FILE *fopen(const char *nazwapliku, const char *tryb);
int fclose (FILE *plik);

Tryb: „r” - odczyt, „w” - zapis, „a” - dopisanie na końcu, „rb”, „wb” - odczyt i zapis pliku binarnego

Odczyt i zapis (plik tekstowy)

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

Odczyt i zapis (plik binarny)

size_t fread(void *wsk, size_t rozmiar, size_t ilosc, FILE *plik);
size_t fwrite(const void *wsk, size_t rozmiar, size_t ilosc, FILE *plik);

Wykrywanie błędów (koniec pliku)

int feof(FILE *plik);

Więcej informacji o funkcjach biblioteki stdio.h

#include <stdio.h>
 
int main()
{
   FILE *plik;
   int liczba,i=0;
 
   plik = fopen("liczby.txt","r");
   if (plik == NULL) 
   {
      printf("Blad otwarcia pliku \"liczby.txt\"\n");
      return 1;
   }
 
   printf("Ok. Zaczynam czytac plik:\n");
 
   while(feof(plik) == 0)
   {
      fscanf(plik,"%d",&liczba);
      printf("%d => %d\n",i,liczba);
      i++;
   }
   fclose(plik);
   return 0;
}

Ćwiczenia

  • Do programu z poprzednich zajęć (macierze) dodaj następujące funkcje:
    • zapisz_macierz - argumentami funkcji jest macierz i jej wymiary, oraz wskaźnik pliku tekstowego (do struktury FILE) otworzonego w trybie umożliwiającym zapis. Funkcja najpierw umieszcza w pliku dwie liczby całkowite określające rozmiar macierzy a następnie wartości poszczególnych elementów macierzy
    • odczytaj_macierz - argumentami funkcji jest uchwyt do pliku (wskaźnik do struktury FILE) oraz wskaźniki do dwóch zmiennych typu całkowitego, do których zostaną wczytane wymiary macierzy. Funkcja zwraca macierz (adres do dynamicznie za-alokowanej macierzy) wczytaną z pliku tekstowego lub NULL jeśli coś poszło nie tak jak powinno (brak pamięci, błąd odczytu pliku, itp.).
  • Korzystając z powyższych funkcji napisz program, który wczyta z pliku tekstowego dwie macierze liczb rzeczywistych a następnie zapisze do innego pliku tekstowego wynik dodawania dwóch macierzy. Nazwy plików powinien podać użytkownik w czasie działania programu, w tym celu można skorzystać z funkcji czytajlinie z jednych z poprzednich zajęć
  1. zmodyfikuj program grep (patrz zajęcia 7) tak aby przyjmował więcej niż jeden argument wejściowy. Pierwszym argumentem ma być szukany wzorzec a kolejnymi argumentami nazwy plików w których wzorzec będzie szukany. Program wyświetla linie z podanych plików w których pojawia się szukany wzorzec
  2. zmodyfikuj program baza_danych (patrz zajęcia 8), tak aby na początku program wczytywał bazę danych z zapisanego wcześniej pliku tekstowego a na koniec program zapisywał do tego samego pliku aktualną zawartość bazy danych
  3. napisz program który szyfruje dany plik tekstowy za pomocą szyfru Cezara. Szyfr ten polega na zastąpieniu każdej litery literą położoną o trzy pozycje dalej w alfabecie. Więc znak A zastępujemy znakiem D a znak Z znakiem C itd. Program powinien poprosić o podanie nazwy pliku do zaszyfrowania oraz nazwy pliku wynikowego w którym umieszczona zostanie zaszyfrowana wiadomość. Program też powinien umożliwiać odszyfrowanie wcześniejszej wiadomości.