1/5
Język C
Instrukcja
laboratoryjna
Temat: Operacje na plikach.
7
Przygotował: mgr inż . Maciej Lasota 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”,”atrybuty”);
Przykład:
FILE *plik;
plik = fopen(”dane.txt”,”r”);
Nazwa pliku jest to bezpośrednia nazwa 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.
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;
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.
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);
}
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ą.
fclose(FILE *strumien);
Przykład:
FILE *plik;
plik = fopen(”test.txt”,”r”);
...
...
...
fclose(plik);