czwartek, 26 kwietnia 2018

Język C - Pliki I/O

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.

Poprzednia strona                                                          Następna strona


Brak komentarzy:

Prześlij komentarz