Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.
PLIKOWE OPERACJE WEJ
Ś CIA - WYJ Ś CIA Język C/C++ nie ma wbudowanych Ŝadnych instrukcji umoŜliwiających wykonywanie operacji wejścia-wyjścia ! SłuŜą do tego funkcje biblioteczne. Funkcje zawarte w bibliotece < io.h > Dostęp do pliku za pomocą uchwytu (ang. Handle) - operacje niskiego poziomu 1. Funkcje otwierania (zwraca uchwyt pliku) oraz zamknięcia pliku int open ( const char * nazwa_pliku , int tryb_dostepu ) int close ( int handle ) 2. Funkcje zapisu i odczytu z pliku int write ( int handle , void * adres_bufora , unsigned ilosc_bajtow ) int read ( int handle , void * adres_bufora , unsigned ilosc_bajtow ); 3. Funkcje pomocnicze int eof ( int handle ) // zwraca 1 gdy „ E ND O F F iILE” long tell ( int handle ) // zwraca pozycj ę wska ź nika pliku long filelength ( int handle ) // zwraca długos ć pliku w bajtach long lseek ( int handle , long przesuniecie , int wzgl ę dem_czego ) // przesuwa wska ź nik pliku o zadan ą ilo ść bajtów // wzgl ę dem zadanego miejsca: SEEK_SET - względem początku pliku SEEK_CUR - względem aktualnej pozycji SEEK_END - względem końca pliku Przykład int plik; char tekst[ ] = ” To jest tekst zapisywany i odczytywany z pliku ”; char znak; plik = open( ” test.dat ”, O_CREAT | O_RDWR ); write ( plik, tekst, strlen( tekst ) ); // zapis zawartosci tekstu do pliku lseek ( plik, 0L, SEEK_SET ); // przesuniecie wska ź nika na poczatek do { // odczyt po jednym znaku a Ŝ do napotkania eof read( plik, &znak, 1); printf( ” %c ”, znak ); // wydruk odczytanego znaku na ekranie } while ( ! eof ( plik ) ); close ( plik ); M. Piasecki: JĘZYKI PROGRAMOWANIA (1) - 1 - (W10) Plikowe operacje wejścia/wyjscia Funkcje zawarte w bibliotece < stdio.h > Operacje we/wy realizowane za pomocą strumieni (ang. Stream) Strumienie reprezentowane są przez zmienne typu FILE . Struktura taka tworzona jest automatycznie podczas otwierania strumienia (zawiera informacje o nazwie pliku, trybie otwarcia, itp.). Wszystkie dalsze operacje na strumieniu wymagają podania wskaźnika na tą strukturę. Przykład FILE * plik_wej, * wyniki ; // definicja zmiennych plikowych strumień wejściowy (konsola - klawiatura) stdout - strumień wyjściowy (konsola - monitor) stderr - strumień komunikatów błędów (konsola) stdprn - strumień drukarki - 1. Funkcje otwarcia (zwraca wska ź nik na FILE) oraz zamkni ę cia pliku FILE * fopen ( char * nazwa_pliku , char * rodzaj_operacji ) rodzaj operacji: r - tylko do odczytu w - tylko do zapisu (utworzenie nowego) a - dopisywanie na końcu + - z mozliwością aktualizacji b - otwarcie jako plik binarny t - otwarcie jako plik tekstowy Przykład FILE * plik; // utworzenie pliku binarnego z mo Ŝ liwoscia aktualizacji plik = fopen( ” a:\\wyniki.dat ”, ” w+b ” ); if( plik == NULL ) // kontrola bł ę dów we/wy { printf( ” Blad otwarcia pliku wyników ” ); return -1; } int fclose ( FILE * strumien ) // zamkni ę cie wskazanego strumienia int fcloseall (void ) // zamkni ę cie wszystkich strumieni M. Piasecki: JĘZYKI PROGRAMOWANIA (1) - 2 - (W10) Plikowe operacje wejścia/wyjscia 0. Standardowe strumienie wejścia i wyjscia (otwierane automatycznie) stdin 2. Zapis danych do strumienia int fputc ( int znak , FILE * strumien ) // wysłanie pojedynczego znaku int fputs ( char * tekst , FILE * strumien ) // wysłanie ła ń cucha znaków int fprintf ( FILE * strumien , char * format , . . . ) // funkcja sformatowanego wyjscia analogiczna do printf( ) int fwrite ( void * adres_w_pamieci , size_t rozmiar_bloku , size_t ilosc_blokow , FILE strumien ) // funkcja kopiuj ą ca (ilosc_blokow rozmiar_bloku) bajtów spod wskazanego obszaru pami ę ci do strumienia (pliku) * Przykład #include <stdio.h> struct T_student { char nazwisko[31]; char imie[16]; int wiek; } ; void main( void ) { FILE *strumien; T_student baza_danych[10]; if ( (strumien = fopen( ” test.bin ” , ” wb ” ) ) != NULL ) { // zapis zawarto ś ci calej bazy ( tablicy struktur) do pliku binarnego fwrite ( baza_danych, sizeof(T_student), 10 , strumien); fclose ( strumien ); } if ( (strumien = fopen( ” test.txt ” , ” wt ” ) ) != NULL ) { // zapis zawarto ś ci calej bazy ( tablicy struktur) do pliku tekstowego for ( int i = 0; i < 10; i++ ) fprintf ( strumien, ” %s %s %d \n ”, baza[ i ].nazwisko, baza[ i ].imie, baza[ i ].wiek ); fclose ( strumien ); } } JeŜeli jako strumień wyjściowy podamy stdout (standardowy strumien wyjsciowy) to wtedy wydruk bedzie dokonywany na konsolę/ekran. np. fprintf ( stdout, ” format ” , ........ ) º printf ( ” format ” , ........ ) M. Piasecki: JĘZYKI PROGRAMOWANIA (1) - 3 - (W10) Plikowe operacje wejścia/wyjscia * 3. Odczyt danych ze strumienia int fgetc ( FILE * strumien ) // wczytanie pojedynczego znaku fgets ( char * tekst , int dlugosc , FILE * strumien ) // wczytanie ła ń cucha składaj ą cego si ę z co najwy Ŝ ej (dlugosc * - 1) znaków int fscanf ( FILE * strumien , char * format , . . . ) // funkcja sformatowanego wej ś cia analogiczna do scanf( ) int fread ( void * adres_w_pamieci , size_t rozmiar_bloku , size_t ilosc_blokow , strumien ) // funkcja odczytuj ą ca (ilosc_blokow FILE * rozmiar_bloku) bajtów // ze strumienia do wskazanego obszaru pami ę ci * Przykład #include <stdio.h> struct T_student { char nazwisko[31]; char imie[16]; int wiek; } ; void main( void ) { FILE *strumien; T_student baza_danych[10]; int ilosc; if ( (strumien = fopen ( ” test.bin ” , ” rb ” ) ) != NULL ) { // wczytanie zawarto ś ci bazy ( tablicy struktur) z pliku binarnego while( fread ( &baza_danych[ilosc],sizeof(T_student),1,strumien)==1) ilosc++; fclose ( strumien ); } if ( (strumien = fopen( ” test.txt ” , ” rt ” ) ) != NULL ) { // wczytaniet zawarto ś ci bazy ( tablicy struktur) z pliku tekstowego for ( int i = 0; ( ! feof(strumien) ) && (i < 10); i++ ) fscanf ( strumien, ” %s %s %d ” , baza[ i ].nazwisko, baza[ i ].imie, &(baza[ i ].wiek) ); } } M. Piasecki: JĘZYKI PROGRAMOWANIA (1) - 4 - (W10) Plikowe operacje wejścia/wyjscia char ilosc = 0; fclose ( strumien ); 4. Funkcje pomocnicze int feof ( FILE * strumien ) // testowanie osi ą gni ę cia ko ń ca pliku int fseek ( FILE * strumien , long przesuniecie , int wzgledem ) // przesuwa wska ź nik pliku o zadan ą ilo ść bajtów // wzgl ę dem zadanego miejsca : SEEK_SET - względem początku pliku SEEK_CUR - względem aktualnej pozycji SEEK_END - względem końca pliku long ftell ( FILE * strumien ) // zwraca aktualn ą pozycj ę wska ź nika pliku int fflush ( FILE * strumien ) // „ wymiata” bufor wskazanego strumienia int flushall ( void ) // j.w.dla wszystkich buforowanych strumieni Przykład zadania zaliczeniowego // funkcja wyznaczaj ą ca pozycj ę maksymalnej liczby double w pliku binarnym #include <stdio.h> long Maksimum( char * nazwa_pliku ) { FILE * plik_danych; long pozycja=0, poz_max = - 1; double liczba, maksimum; if ( (plik_danych = fopen ( nazwa_pliku , ” rb ” ) ) != NULL ) { while( fread ( &liczba, sizeof(double), 1, plik_danych) == 1) { if ( pozycja == 0 ) { maksimum = liczba; poz_max = 0; } else if ( liczba > maksimum ) { maksimum = liczba; poz_max = pozycja; } pozycja++; } fclose ( strumien ); } return poz_max ; } M. Piasecki: JĘZYKI PROGRAMOWANIA (1) - 5 - (W10) Plikowe operacje wejścia/wyjscia |
Menu
|