C - Pliki I/O
Ostatni rozdział wyjaśnił standardowe urządzenia
wejściowe i wyjściowe obsługiwane przez język programowania C. W tym
rozdziale opisano, w jaki sposób programiści C mogą tworzyć, otwierać, zamykać
pliki tekstowe lub binarne w celu przechowywania danych.
Plik reprezentuje sekwencję bajtów, niezależnie od
tego, czy jest to plik tekstowy, czy plik binarny. Język programowania C
zapewnia dostęp do funkcji wysokiego poziomu, a także wywołań niskiego poziomu
(na poziomie systemu operacyjnego) do obsługi plików na urządzeniach pamięci
masowej. Ten rozdział przeprowadzi Cię przez ważne operacje do zarządzania
plikami.
Otwieranie plików
Możesz użyć funkcji fopen(), aby
utworzyć nowy plik lub otworzyć istniejący plik. To wywołanie zainicjuje
obiekt typu FILE, który zawiera wszystkie informacje niezbędne do
sterowania strumieniem. Prototyp tej funkcji jest następujący:
FILE *fopen( const char * nazwa_pliku,
const char * mode );
Tutaj nazwa_pliku jest literałem
łańcuchowym, którego użyjesz do nazwania pliku, a mode czyli tryb dostępu może
mieć jedną z następujących wartości:
L.p.
|
Tryb i opis
|
1
|
r
Otwiera istniejący plik tekstowy do czytania.
|
2
|
w
Otwiera plik tekstowy do zapisu. Jeśli nie
istnieje, tworzony jest nowy plik. Tutaj Twój program rozpocznie pisanie
treści od początku pliku.
|
3
|
a
Otwiera plik tekstowy do zapisu w trybie
dodawania. Jeśli nie istnieje, tworzony jest nowy plik. Tutaj Twój
program rozpocznie dołączanie treści do istniejącej zawartości pliku.
|
4
|
r+
Otwiera plik tekstowy do czytania i pisania.
|
5
|
w+
Otwiera plik tekstowy do czytania i
pisania. Najpierw obcina plik do zerowej długości, jeśli istnieje, w
przeciwnym razie tworzy plik, jeśli nie istnieje.
|
6
|
a+
Otwiera plik tekstowy do czytania i
pisania. Tworzy plik, jeśli nie istnieje. Odczyt rozpocznie się od
początku, ale pisanie może być tylko dołączone.
|
Jeśli masz zamiar obsługiwać pliki binarne, użyjesz
następujących trybów dostępu zamiast wyżej wymienionych -
"rb",
"wb", "ab", "rb+", "r+b",
"wb+", "w+b", "ab+", "a+b"
Zamykanie pliku
Aby zamknąć plik, użyj funkcji fclose(). Prototyp
tej funkcji to:
int fclose( FILE *fp );
Funkcja fclose(-) zwraca zero w
przypadku powodzenia lub EOF, jeśli wystąpił błąd podczas
zamykania pliku. Ta funkcja faktycznie opróżnia wszystkie dane wciąż
znajdujące się w buforze do pliku, zamyka plik i zwalnia dowolną pamięć używaną
dla pliku. EOF jest stałą zdefiniowaną w pliku nagłówkowym stdio.h.
Biblioteka standardowa C udostępnia różne funkcje do
odczytywania i zapisywania pliku, znak po znaku lub w postaci łańcucha o stałej
długości.
Zapisywanie pliku
Poniżej znajduje się najprostsza funkcja zapisywania
pojedynczych znaków do strumienia:
int fputc( int c, FILE *fp );
Funkcja fputc() zapisuje wartość
znaku argumentu c do strumienia wyjściowego, do którego odnosi się fp. W
przeciwnym wypadku zwraca pisemną postać napisaną na podstawie sukcesu EOF,
jeśli wystąpił błąd. Możesz użyć następujących funkcji, aby napisać
łańcuch zakończony znakiem NULL do strumienia:
int fputs( const char *s, FILE *fp );
Funkcja fputs() zapisuje ciąg s do
strumienia wyjściowego, do którego odnosi się fp. Zwraca wartość nieujemną
w przypadku sukcesu, w przeciwnym razie EOF zostanie zwrócony
w przypadku jakiegokolwiek błędu. Możesz również użyć funkcji int
fprintf(FILE * fp, const char * format, ...), aby zapisać ciąg do
pliku. Spróbuj następującego przykładu.
Upewnij się, że masz katalog /tmp dostępny. Jeśli
tak nie jest, to przed kontynuowaniem musisz utworzyć ten katalog na swoim
komputerze.
#include <stdio.h>
main() {
FILE *fp;
fp =
fopen("C:\tmp\test.txt", "w+");
fprintf(fp, "To
jest testowanie dla fprintf...\n");
fputs("To
jest testowanie dla for fputs...\n", fp);
fclose(fp);
}
Kiedy powyższy kod zostanie skompilowany i wykonany,
tworzy nowy plik test.txt w katalogu /tmp i zapisuje dwie
linie za pomocą dwóch różnych funkcji. Przeczytamy ten plik w następnej
sekcji.
Czytanie pliku
Poniżej znajduje się najprostsza funkcja do odczytu
pojedynczego znaku z pliku:
int fgetc( FILE * fp );
Funkcja fgetc() odczytuje znak z
pliku wejściowego, do którego odnosi się fp. Wartością zwracaną jest
odczyt znaku lub w przypadku jakiegokolwiek błędu zwraca EOF. Następująca
funkcja pozwala na odczytanie ciągu ze strumienia:
char *fgets( char *buf,
int n, FILE *fp );
Funkcje fgets() odczytują do n-1
znaków ze strumienia wejściowego, do którego odnosi się fp. Kopiuje
łańcuch odczytu do bufora buf, dołączając znak null, aby
zakończyć łańcuch.
Jeśli ta funkcja napotka znak nowego wiersza
"\n" lub koniec pliku EOF przed odczytaniem maksymalnej liczby
znaków, zwróci tylko znaki odczytywane do tego punktu, w tym nowy znak
linii. Możesz także użyć funkcji int fscanf(FILE * fp, const char
* format, ...), aby odczytać ciągi z pliku, ale przestaje czytać po
napotkaniu pierwszego znaku spacji.
#include <stdio.h>
main() {
FILE *fp;
char buff[255];
fp =
fopen("C:\tmp\test.txt", "r");
fscanf(fp, "%s",
buff);
printf("1
: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2:
%s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3:
%s\n", buff );
fclose(fp);
}
Kiedy powyższy kod zostanie skompilowany i wykonany,
odczytuje plik utworzony w poprzedniej sekcji i generuje następujący wynik -
1 : To
2: jest testowanie dla
fprintf...
3: To jest testowanie dla
fputs...
Zobaczmy trochę więcej szczegółów na temat tego, co
się tutaj wydarzyło. Po pierwsze, fscanf() odczytuje
właśnie To, ponieważ po tym napotkał spację, drugie
wywołanie fgets(), które odczytuje pozostały wiersz, aż do napotkania
końca linii. Wreszcie, ostatnie wywołanie fgets() odczytuje
całkowicie drugą linię.
Binarne funkcje we / wy
Istnieją dwie funkcje, które można wykorzystać do
wejścia i wyjścia binarnego:
size_t
fread(void *ptr, size_t size_of_elements, size_t number_of_elements,
FILE *a_file);
size_t
fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements,
FILE *a_file);
Obie te funkcje powinny być używane do odczytu lub
zapisu bloków pamięci - zwykle tablic lub struktur.
Brak komentarzy:
Prześlij komentarz