Języki programowania Karolina Mikulska-Rumińska E-mail: karolamik@fizyka.umk.pl Pokój 573, tel. 3346 Konsultacje wtorek 9-10.
Pliki Dwa rodzaje plików: Tekstowe, Binarne Aby otworzyć plik należy najpierw stworzyć zmienną, która będzie reprezentować plik w programie. FILE * plik; Wtedy można otworzyć plik w następujący sposób: plik = fopen( Ścieżka lub nazwa, flaga ); Flaga określa nam jaki rodzaj dostępu chcemy: r odczyt, w pisanie do pliku (poprzednia zawartość kasowana) a dopisywanie, r+, w+, a+ - zapis i odczyt Na koniec należy zamknąć plik przy użyciu: fclose(plik);
fopen() Poprawnie wykonana funkcja fopen() zwraca wskaźnik null.
Czytanie/pisanie Są 3 sposoby czytania/pisania do pliku tekstowego: po znaku, po linijce, wejście formatowane. Czytanie/pisanie po znaku: int getc(file* plik); - czyta po znaku z pliku, przeczytany znak zwracana wartość int putc(int c, FILE * plik); - zapisuje znak ze zmiennej c do pliku Jeśli funkcja getc() dojdzie do końca pliku to zwraca flagę EOF (end of file). Czytanie całego pliku i zapisanie jego zawartości do innego: char c; while(( c = getc(pilk1) )!= EOF) putc(c, plik2); ZAD1
Czytanie/pisanie Czytanie/pisanie po linii: char * fgets(char *s, int size, FILE * plik); - czyta linię z pliku co najwyżej długości size (jeśli linia jest dłuższa niż size to ucina ją i zwraca tylko size znaków) i zapisuje wczytaną linię do tablicy s. int fputs(const char *s, FILE *plik); - zapisuje linię z tablicy s do pliku Jeśli funkcja fgets() natrafi na koniec pliku zwraca NULL. Czytanie pliku po linijce i wypisanie jej na ekran: char tab[20]; while(fgets(tab, 20, plik)!= NULL) fputs(tab, stdout);
Czytanie/pisanie Formatowane czytanie/pisanie funkcje analogiczne do printf() i scanf(): fscanf(file * plik, tekst format tekst..., adresy zmiennych); czyta z pliku linię według formatu i zapisuje dane do zmiennych fprintf(file * plik, teskt format tekst..., zmienne); pisze dane do pliku według formatu Jeśli funkcja fscanf() natrafi na koniec pliku zwraca EOF. Czytanie pliku w którym każda linia to dwie liczby oddzielone przecinkiem i spacją, zapisanie danych do innego pliku: int a, b; while(fscanf(plik, %d, %d, &a, &b)!= EOF) fprintf(plik2, liczba1: %d, liczba2: %d\n, a, b); ZAD3/4
Inne funkcje Funkcje poniżej znajdują się w bibliotece <ctype.h>: int isdigit(int znak); - sprawdza czy znak jest cyfrą, jeśli nie zwraca 0 int isalnum(int znak); - sprawdza czy znak jest literą lub cyfrą int isalpha(int znak); - sprawdza czy znak jest literą int isupper(int znak); - sprawdza czy znak jest małą literą int islower(int znak); - sprawdza czy znak jest dużą literą... int tolower(int znak); - funkcja sprawdza czy znak jest dużą literą i jeśli tak to zmienia ją na małą i zwraca jako wynik int toupper(int znak); - funkcja sprawdza czy znak jest małą literą i jeśli tak to zmienia ją na dużą i zwraca jako wynik
Konwertowanie Ze znaków na liczby biblioteka <stdlib.h>: int atoi(char * teskt); - przerabia liczbę zapisaną w tablicy tekst na int, który jest zwracany. long atol(char *tekst); - analogicznie jak wyżej tylko zwraca long Z liczb na znaki chyba najłatwiej jest to zrobić przy użyciu funkcji z biblioteki <stdio.h> (analogicznej do printf()): int sprintf(char* tab, tekst format tekst, zmienne); - zapisuje tekst zmienne z użyciem zadanego formatu do tablicy tab.
Pliki binarne Otwieranie/zamykanie jak wcześniej opisano. Inaczej wygląda czytanie i pisanie: size_t fread(void *bufor, size_t wielkosc, size_t ilosc, FILE *plik); - czyta ilosc danych, każda wielkości wielkosc z pliku do tablicy bufor. size_t fwrite(void *dane, size_t wielkosc, size_t ilosc, FILE *plik); - przepisuje ilosc danych, każda wielkości wielkosc z tablicy dane do pliku. Funkcja fread() zwraca ilość przeczytanych znaków, więc aby sprawdzić czy natrafiono na koniec pliku należy sprawdzić czy przeczytano więcej niż 0 znaków. while ((odcz = fread(buf, sizeof(char), 100, plik1)) > 0) zap = fwrite(buf, sizeof(char), odcz, plik2);