====== Odczyt i zapis plików ===== ===== Deklaracje najważniejszych funkcji ===== **Biblioteka** #include **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 formatowany (plik tekstowy)** int fscanf(FILE *stream, const char *format, ...); int fprintf(FILE *plik, const char *format, ...); **Odczyt/zapis całej linii/łańcucha znakowego tekstu z/do pliku** char * fgets ( char * str, int num, FILE * stream ); int fputs ( const char * str, FILE * stream ); **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 **[[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdio.h|stdio.h]]** ===== Operacje na plikach tekstowych - przykłady ===== **Przykład 1 - Czytanie sekwencji liczb z pliku** #include 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; } ==== Zadanie ==== Rozszerz zestaw funkcji [[zajecia8#Zadania|z poprzednich zajęć]] związanych z obsługą macierzy. Deklaracje funkcji dodaj do pliku nagłówkowego ''macierz.h'' a definicje do pliku ''macierz.c''. * Zaimplementuj funkcję **wczytaj_z_pliku**, która tworzy macierz i wypełnia ją wartościami na podstawie informacji odczytanych z pliku tekstowego. Funkcja posiada trzy argumenty. Pierwszym jest strumień wejściowy (wskaźnik typu ''FILE*'' do pliku otworzonego w trybie do odczytu). Drugi i trzeci argument to adresy zmiennych typu całkowitego pod którymi funkcja umieści odczytane z pliku rozmiary macierzy (odpowiednio ilość wierszy i ilość kolumn). Funkcja zwraca adres do macierzy %%float**%% wypełnionej wartościami wczytanymi z pliku lub wartość ''NULL'' jeśli coś poszło nie tak jak powinno (np.: błąd alokacji pamięci, błąd odczytu pliku, itp.). Zakładamy, że dane w strumieniu sformatowane są w następujący sposób: pierwsze dwie liczby całkowite określają liczbę wierszy i liczbę kolumn macierzy a następnie wyszczególnione są wszystkie elementy macierzy. \\ Przykładowo, sekwencja: 2 3 1.2 2.3 1.3 -3.1 4.0 1.1 reprezentuje macierz o 2 wierszach i 3 kolumnach postaci | 1.2 | 2.3 | 1.3 | | -3.1 | 4.0 | 1.1 | Przykładowe pliki z danymi znajduje się [[http://www.fizyka.umk.pl/~grochu/jpr/dane/macierz2|tutaj]]. \\ Dostępne na serwerze ''ferm'' w katalogu ''/home/grochu/jpr/''. * Napisz program wykorzystujący funkcję **wczytaj_z_pliku** do wypisania na ekranie macierzy zapisanej w pliku {{http://www.fizyka.umk.pl/~grochu/jpr/dane/macierz2/macierz.txt}}. Jeżeli w pliku znajduje się opis więcej niż jednej macierzy to zmodyfikuj program tak aby wyświetlił wszystkie te macierze (przykładowy plik {{http://www.fizyka.umk.pl/~grochu/jpr/dane/macierz2/macierz3x.txt}}). * Zaimplementuj funkcję **zapisz_do_pliku**, która zapisuje macierz do pliku w trybie tekstowym. Pierwszym argumentem funkcji jest strumień wyjściowy (wskaźnik ''FILE*'' do pliku tekstowego otworzonego do zapisu), drugim argumentem jest adres macierzy (wskaźnik ''float %%**%%''). Trzecim i czwartym argumentem funkcji są wymiary macierzy (ilość wierszy i kolumn). \\ Funkcja najpierw umieszcza w strumieniu (w pliku) dwie liczby całkowite określające rozmiar macierzy (liczbę wierszy i kolumn) a następnie wartości poszczególnych elementów macierzy z dokładnością do jednego miejsca po przecinku. * Napisz program wykorzystujący z funkcję **zapisz_do_pliku**, który zapisze do pliku tekstowego o nazwie "macierz.txt" wprowadzoną z klawiatury macierz o dowolnych (podanych przez użytkownika) wymiarach. * Zmodyfikuj powyższe programy tak aby to użytkownik w trakcie działania aplikacji mógł podać nazwę pliku tekstowego do którego macierz jest zapisywana oraz z którego jest wczytywana. ===== Zadania domowe ===== - 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 - 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.