Język C, © Daniel Pociecha, danpoc@agh.edu.pl
15
Język C – częśd 3
Obsługa plików
Plik (ang. file), jest to ciąg danych (inaczej zbiór danych), o skooczonej długości,
posiadający szereg atrybutów i stanowiący dla systemu operacyjnego całośd
Przykład 10
/* Hello World! – fprintf() */
#include <stdio.h>
int main ()
{
FILE *plik;
char tekst[] = "Hello World!";
if((plik = fopen("test.txt", "w"))==NULL) {
printf ("Błąd otwarcia pliku\n");
exit(1);
}
fprintf (plik, "%s", tekst);
fclose (plik);
return 0;
}
FILE *nazwa;
Instrukcja FILE *nazwa; służy do deklaracji wskaźnika pliku, na którym będziemy
wykonywad wszystkie operacje związane w obsługą pliku (przykładowo otwarcie
i zamknięcie pliku, zapis do pliku, odczyt z pliku)
fopen(char *nazwa_pliku, char *rodzaj_dostępu)
Polecenie fopen() służy do otwarcia pliku o nazwie nazwa_pliku, z określeniem
jakiego rodzaju dostęp do pliku nas interesuje. Wśród dozwolonych dostępów są
przykładowo:
"w"
tworzenie pliku tekstowego do zapisu
"r"
otwieranie pliki tekstowego do odczytu
"a"
dołączanie do pliku tekstowego
fopen("test.txt", "w")) oznacza że do pliku test.txt będziemy zapisywad
jakieś informacje
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
16
fclose(char *nazwa_pliku)
Polecenie fclose() służy do zamknięcia wcześniej otwartego pliku. Należy pamiętad,
że każdy nieużywany w programie plik, powinien zostad zamknięty przed zakooczeniem
działania programu.
fprintf(char *nazwa_pliku, "%s", zmienna_tekstowa)
Instrukcja fprintf() służy do zapisania zmiennej tekstowej czy liczbowej do
otwartego wcześniej pliku. Konstrukcja tego polecenia jest analogiczna do polecenia
printf(). W poleceniu fprintf() musimy dodatkowo określid nazwę pliku, do
którego chcemy zapisad zmienną, oraz określid, jakiego typu będzie to zmienna.
"%s" oznacza, że w pliku będziemy zapisywad tekst (patrz Język C – strona 5).
fscanf(char *nazwa_pliku, "%s", zmienna_tekstowa)
Instrukcja fscanf() służy do odczytania zmiennej (w tym wypadku tekstowej)
z wcześniej otwartego pliku.
Przykład 11
/* Hello World! - fscanf() */
#include <stdio.h>
int main ()
{
FILE *plik;
char tekst[20];
if ((plik = fopen("test.txt", "r"))==NULL) {
printf ("Błąd otwarcia pliku\n");
exit(1);
}
fscanf(plik, "%s", &tekst);
fclose (plik);
printf("%s\n", tekst);
return 0;
}
Program wykorzystuje wcześniej utworzony plik "test.txt". Zauważyd możemy, iż
na ekranie monitora wyświetla się jedyne napis Hello. Dzieje się tak, dlatego że
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
17
funkcja fscanf() czyta tekst do napotkania pustego znaku. Aby odczytad dalszą
częśd tekstu, należy ponownie użyd funkcji fscanf().
Czytając długi tekst trudno nam określid ile razy należy użyd funkcji fscanf(), aby
przeczytad całośd. Tu przydatna okazad się może stała EOF, która reprezentuje koniec
pliku (ang. End Of File). Zastosowanie EOF jest stosunkowo proste, wystarczy po
każdym użyciu funkcji fscanf(), sprawdzid czy przeczytana wartośd nie jest
znacznikiem kooca pliku, (czyli równa EOF).
Przykład 12
/* Odczytywanie zawartości pliku */
#include <stdio.h>
int main ()
{
FILE *plik;
char tekst[20];
if ((plik =fopen("test.txt", "r"))==NULL) {
printf ("Błąd otwarcia pliku\n");
exit(1);
}
while(fscanf(plik, "%s", &tekst) != EOF)
printf("%s ", tekst);
fclose (plik);
return 0;
}
ZADANIE 14. Przepisz zawartośd pliku "test.txt", do pliku "kopia.txt"
ZADANIE 15. Napisz program liczący
kwadraty i sześciany liczb od jednego do stu, wynik
należy zapisad do pliku
"liczby.txt"
ZADANIE 16. Zmodyfikuj ZADANIE 12 (wyznaczanie Największego wspólnego dzielnika
liczb a i b) tak, by liczby a i b były wczytywane z pliku "NWD.txt" a wynik obliczeo
wyświetlany w terminalu