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; }
Przykład 2 - Program grep
#include <stdio.h> #include <string.h> #define MAX 1000 int main(int argc,char **argv) { char linia_tekstu[MAX]; char *wzor; FILE *plik; if(argc<2) { printf("Uzycie: grep wzorzec [plik]\n"); return 1; } if(argc==2) plik=stdin; else if((plik=fopen(argv[2],"r"))==NULL) { printf("Blad czytania pliku: %s\n",argv[2]); return 2; } wzor=argv[1]; while(!feof(plik)) { if(fgets(linia_tekstu,MAX,plik)==NULL) break; if(strstr(linia_tekstu,wzor)) printf("%s",linia_tekstu); } if(plik!=stdin) fclose(plik); return 0; }
Ćwiczenia
Do programu z poprzednich zajęć (macierze) dodaj następujące funkcje:
funkcja wczytaj_z_pliku wczytuje macierz ze strumienia wejściowego (z pliku tekstowego otworzonego do odczytu). Argumentem funkcji jest strumień wejściowy (wskaźnik typu
FILE*
do pliku otworzonego w trybie do odczytu). Funkcja zwraca strukturęmacierz
zawierająca wczytaną ze strumienia macierz (zobacz poprzednie zajęcia). Jeżeli wystąpił błąd podczas odczytu zwracana jest pusta macierz. 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 serwerzeferm
w katalogu/home/grochu/jpr/
.- Napisz program wykorzystujący funkcję wczytaj_z_pliku do wypisania na ekranie macierzy zapisanej w pliku „macierz.txt”.
- funkcja zapisz_do_pliku 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 struktura zawierająca macierz.
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.
- Niech nazwa pliku do wczytania podana będzie jako pierwszy argument programu. W przypadku braku argumentu użytkownik zostanie poproszony o wprowadzenie macierzy ręcznie.
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.