Aby w ogóle móc operować na jakimś pliku jest nam potrzebny wskaźnik typu file, który będzie wskazywał na początek tego pliku



Pobieranie 23,83 Kb.
Data15.04.2018
Rozmiar23,83 Kb.

Aby w ogóle móc operować na jakimś pliku jest nam potrzebny wskaźnik typu FILE, który będzie wskazywał na początek tego pliku. Deklarujemy go w następujący sposób:



FILE *plik;

Teraz należy ustawić wskaźnik na jakiś plik, którego jeszcze nie mamy na dysku, ponieważ najpierw zajmiemy się zapisywaniem do pliku, więc plik taki zostanie utworzony przez nasz program, a jeżeli będzie już istniał zostanie po prostu "opróżniony". Do otwarcia pliku służy funkcja fopen. Używamy jej w taki sposób:



plik=fopen("plik.txt","wt");

Pierwszym parametrem funkcji fopen jak łatwo się domyśleć jest nazwa pliku. Drugi parametr opisuje nam sposób, w jaki plik zostanie otworzony. Ciąg "wt" oznacza, że plik zostanie otwarty do zapisu (w) a będzie to plik tekstowy (t). Tekstowy wcale nie oznacza, że musi on mieć rozszerzenie .txt. Oznacza to po prostu, że będzie w nim przechowywany najprawdopodobniej tekst, ponieważ tak właśnie jest go najłatwiej przechowywać np. w celu późniejszego odczytu. Pliki możemy otwierać oczywiście na kilka innych sposobów na przykład:



wt

otwarcie pliku do zapisu

wt+

otwarcie pliku do zapisu i odczytu

rt

otwarcie pliku do odczytu

rt+

otwarcie pliku do odczytu i zapisu

wt+ różni się od rt+ tym, że w pierwszym przypadku będziemy mieli możliwość zapisu, jak i zarówno odczytu, ale zostanie utworzony nowy plik, natomiast w drugim wypadku plik nie zostanie utworzony, tylko zostanie otwarty do odczytu i zapisu już istniejący plik. Jeżeli chcemy otworzyć już istniejący plik (chociaż taki naprawdę nie znajduje się na dysku) zmienna plik przyjmie wartość NULL. Możemy więc w ten sposób sprawdzić, czy udało się otworzyć plik, czy też nie:



plik=fopen("plik.txt","rt");

if ( plik==NULL ) printf("Nie można otworzyc pliku!");



Na początek zajmiemy się odczytem. Kiedy już otworzymy istniejący plik (w trybie rt) wskaźnik jest ustawiony na jego początek i jeżeli później będziemy odczytywali z danego pliku dane będziemy przesuwać się po pliku co oznacza, że po odczytaniu jednego znaku (zakładając, że dopiero otwarliśmy plik) przesuniemy się z pozycji 0 na 1 i ponownie próbując odczytać znak będziemy już odczytywać drugi znak w pliku. Powiedzmy, że mamy w katalogu z którego będzie uruchamiany nasz program plik "plik.txt" o następującej zawartości:



pierwsza linia

druga linia

trzecia linia


Stwórz taki plik w katalogu z programem. Weźmiemy się teraz za odczytywanie jego zawartości. Zrobimy zmienną bufor, do której będziemy odczytywać dane, odczytamy do niej pierwszą linię pliku i wypiszemy jej zawartość, a na koniec jeszcze zamkniemy plik:



FILE *plik;

char bufor[50];

plik=fopen("plik.txt","rt");

if ( plik==NULL ) { printf("Nie moge otworzyc pliku!"); return 0;}

fgets(bufor, 50, plik);

printf("%s",bufor);

fclose(plik);


Pierwsze 3 linie zostały już omówione. W 4 lini dodałem jeszcze return 0;, zrobiłem tak dlatego, żeby program nie kontynuował działania jeżeli próba otwarcia pliku nie powiedzie się. Jeżeli próbowalibyśmy wykonywać operacje na pliku o wartości NULL jak np. fgets najprawdopodobniej program popełniłby nieprawidłową operację. Następnie mamy funkcję fgets. Pierwszy parametr to oczywiście zmienna, a właściwie tablica (ciąg znaków) do której mają zostać wczytane dane. Drugi parametr informuje o tym, ila bajtów ma zostać odczytanych z pliku (oczywiście przestają być odczytywane po napotkaniu "\n", więc nie obawiajmy się, że program odczyta następną linię). Trzeci parametr to oczywiście wskaźnik do naszego pliku. Jeżeli chcemy ustawić naszą pozycję w pliku na początek używamy polecenia rewind:



rewind(plik);

Teraz uczynimy to samo co wcześniej, ale zamiast całej lini odczytamy tylko pojedynczy znak. Służy do tego funkcja fgetc. Nie potrzebujemy tutaj tablicy do której wpiszemy pojedynczy znak. Wystarczy nam jedna zmienna typu char:



FILE *plik;

char znak;

plik=fopen("plik.txt","rt");

if ( plik==NULL ) { printf("Nie moge otworzyc pliku!"); return 0;}

znak=fgetc(plik);

printf("%c",znak);

fclose(plik);


Jeżeli nasz znak przyjmie wartość EOF, znaczy to, że dotarliśmy na jego koniec. W praktyce wygląda to następująco (jest to funkcja, która zakończy swoje działanie po odczytaniu i wyświetleniu całego pliku, wystarczy ją wstawić zamiast lini zawierającej funkcję fgetc):



while ( znak != EOF ) {

znak=fgetc(plik);

printf("%c",znak);

}


Teraz pora zająć się zapisem do pliku. Otwireramy go z parametrem "wt", aby stworzyć nowy plik, lub wyczyścić już istniejący. Do zapisu używamy funkcji fprintf lub fputs. W pierwszym przypadku pierwszym parametrem jest wskaźnik do pliku, a drógim ciąg znaków jaki ma zostać wpisany, a w fukncji fputs pierwszym parametrem jest ciąg znaków, a drugim wskaźnik do pliku:



FILE *plik;

plik=fopen("plik.txt","wt");

fprintf(plik,"Linia nr.1\n");

fputs("Linia nr.2\n",plik);

fclose(plik);


W zapisie do pliku też możemy używać sekwencji ucieczek. Widać to w powyższym programie, gdzie użyłem sekwencji "\n" w celu przejścia do następnej lini. Analogicznie do odczytu możemy wpisać do pliku pojedynczy znak:



fputc('x', plik);

Można jeszcze sprawdzać błędy przy funkcjach odczytu i zapisu i tak np.:



if( fgets(bufor, 50, plik) == NULL ) printf("Blad odczytu!");

if( fputs("Linia nr.1\n", plik) == EOF ) printf("Blad zapisu!");

if( fputc('x', plik); == EOF ) printf("Blad zapisu!");

// po uzyciu funkcji fprintf ->



if ( ferror(plik) ) printf("Blad zapisu!");

Jeżeli wystąpi któryś z powyższych błędów najlepiej przed zakończeniem programu zamknąć plik, a program zakończyć np. return 1;, ponieważ 0 uważa się z kod sukcesu, a przecież program nie zakończył się sukcesem.




©operacji.org 2017
wyślij wiadomość

    Strona główna