Laboratorium nr 7
1/5
1)
Pliki.
Plik (ang. file), jest to nazwany ciąg danych (inaczej zbiór danych), o skończonej
długości, posiadający szereg atrybutów i stanowiący dla systemu operacyjnego całość.
Język C posiada w pliku nagłówkowym <stdio.h> zadeklarowane funkcje służące do
obsługi plików. Funkcje te pozwalają na otwieranie, tworzenie oraz modyfikację różnych
plików zarówno tekstowych (ASCII) jak i też binarnych. Podstawową strukturą opisującą plik
(jako zbiór danych na dysku) jest typ danych „FILE” tzw. typ plikowy. Za pomocą wskaźnika
na zmienną plikową możemy mieć dostęp do pliku. Deklaracja wskaźnika na taką zmienną
jest następująca:
FILE *plik;
2)
Otwieranie pliku.
Do otworzenia pliku w języku C służy funkcja fopen(). Funkcja ta przyjmuje dwa
parametry. Pierwszym argumentem jest nazwa pliku. Drugim natomiast atrybut, który określa
w jaki sposób ma zostać otworzony plik (atrybuty można ze sobą łączyć). Funkcja zwraca
wskaźnik na zmienną plikową.
[wskaźnik na zmienną plikową] = fopen(”nazwa pliku”,”atrybut”);
Przykład:
FILE *plik;
plik = fopen(”dane.txt”,”r”);
Nazwa pliku jest to bezpośrednia nazwa pliku podana w cudzysłowach ” ”, lub z
podaniem katalogu. Oprócz bezpośredniej nazwy możemy podać też tablicę znaków
(łańcuch) zawierający ścieżkę do pliku lub samą nazwę pliku. Atrybut określa w jaki sposób
ma być otworzony plik lub też jakiego typu jest to plik.
Język C
Temat: Operacje na plikach.
Instrukcja
laboratoryjna
7
Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 7
2/5
• „r”
- otwórz plik do odczytu,
• „w”
- otwórz plik do zapisu, jeśli plik istniej skasuj poprzednią zawartość,
• „a”
- dopisuj do pliku, ewentualnie utwórz plik z dopisywaniem do końca pliku,
• „r+”
- otwórz plik tekstowy do odczytu i zapisu,
• „w+” - utwórz plik tekstowy do aktualizacji skasuj plik jeśli istnieje,
• „a+” - dopisuj do pliku, ewentualnie utwórz plik do aktualizacji,
• „b”
- otwórz plik binarny.
3)
Odczyt danych z pliku.
W języku C wyróżniamy kilka sposobów służących do odczytu danych z pliku. Dwie
podstawowe funkcje służące do tego celu to fgetc() oraz fgets(). Funkcje te zadeklarowane
są w pliku nagłówkowym <stdio.h>.
fgetc(strumien) – funkcja ta odczytuj pojedynczy znak z pliku i zwraca liczbę
całkowitą (kod ASCII) odpowiadającą danemu znakowi.
fgets(tablica,n,strumien) – funkcja odczytuje co najwyżej (n – 1) znaków z pliku i
wstawia je do podanej tablicy.
Innym sposobem na odczyt danych z pliku, jest wykorzystanie funkcji konwersji
Podobnie jak w przypadku wczytywania danych z klawiatury za pomocą scanf() istnieje
specjalna wersja przystosowana do wczytywania danych z pliku. Funkcją tą jest fscanf()
zadeklarowana jest ona w pliku nagłówkowym <stdio.h>.
int fscanf(FILE *strumien, const char *format, ...);
Przykład:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *plik;
int c;
Laboratorium nr 7
3/5
if(argc != 2)
{
printf("Blad podaj nazwe pliku !!!\n");
exit(1);
}
plik = fopen(argv[1],"r");
printf("Odczytuje zawartosc pliku: %s\n\n",argv[1]);
if(plik == NULL)
{
printf("Blad otwarcia pliku ...\n");
exit(1);
}
while((c=fgetc(plik)) != EOF)
{
printf("%c",c);
}
printf("\n");
fclose(plik);
return (0);
}
4)
Zapis danych do pliku.
Również w przypadku zapisu danych do pliku, wyróżniamy kilka rodzajów funkcji
służących do tego celu.
fputc(c,strumien) – funkcja ta zapisuje pojedynczy znak „c” do pliku.
fputs(tablica,strumien) – funkcja ta zapisuje tekst zawarty w tablicy do pliku.
Podobnie do funkcji printf() istniej również funkcja konwersji służąca do zapisu
danych do pliku, jest nią funkcja fprintf().
int fprintf(FILE *strumien, const char *format, ...);
Pierwszym argumentem funkcji fprintf() jest wskaźnik na zmienną plikową, drugim
tekst formatujący czyli stała znakowa. Znak procenta oznacza rozpoczęcie tzw. specyfikatora
formatu. Specyfikator formatu pozwala na wprowadzenie w jego miejsce wartości kolejnych
argumentów funkcji printf() (wyjątek stanowi %%, który umożliwia wprowadzenie znaku „%”).
Znak „\” w tekście formatującym umożliwia wprowadzenie tzw. znaków specjalnych.
Laboratorium nr 7
4/5
Przykład:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *plik;
int c;
if(argc != 2)
{
printf("Blad podaj nazwe pliku !!!\n");
exit(1);
}
if((plik = fopen(argv[1],"a")) == NULL)
{
printf("Blad otwarcia pliku ...\n");
exit(1);
}
printf("Zapisuje do pliku: %s\n\n",argv[1]);
while((c=getchar()) != '#')
{
fputc((int)c,plik);
}
fclose(plik);
return (0);
}
Przykład:
#include <stdio.h>
#include <stdlib.h>
#define MAX 255
int main(int argc, char *argv[])
{
FILE *plik;
char linia[MAX];
int c,i;
if(argc != 2)
{
printf("Blad podaj nazwe pliku !!!\n");
exit(1);
}
Laboratorium nr 7
5/5
if((plik = fopen(argv[1],"a")) == NULL)
{
printf("Blad otwarcia pliku ...\n");
exit(1);
}
while(gets(linia) != NULL && linia[0] != '\0')
{
fprintf(plik,"%s\n",linia);
}
fclose(plik);
return (0);
}
5)
Zamknięcie pliku.
Ważnym elementem w przypadku obsługi plików jest każdorazowe zamknięcie pliku
po wykonaniu na nim operacji (zapisu lub odczytu). Do tego celu służy funkcja fclose().
Funkcja ta przyjmuje jeden parametr jest nim wskaźnik na zmienną plikową.
int fclose(FILE *strumien);
Przykład:
FILE *plik;
plik = fopen(”test.txt”,”r”);
...
...
...
fclose(plik);