Odczyt i zapis plików

Deklaracje najważniejszych funkcji

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 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 stdio.h

Operacje na plikach tekstowych - przykłady

Przykład 1 - Czytanie sekwencji liczb z pliku

#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; }

Zadanie

Rozszerz zestaw funkcji 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ę 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.