W09_pliki.doc

(49 KB) Pobierz
operacje wejścia/wyjścia, pliki dyskowe

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 )

  1. 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 );

  1. Funkcje pomocnicze

int     eof ( int handle )              // zwraca 1 gdy „END OF FiILE”

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 );

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 „strumieniowych”

  1. Standardowe strumienie wejścia i wyjscia (otwierane automatycznie)

stdin              -              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” );

                                          exit( 1 );

                            }

int  fclose ( FILE *strumien )                            // zamknięcie wskazanego strumienia

int  fcloseall (void )                                          // zamknięcie wszystkich strumieni

  1. 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  student

                            {

                                          char  nazwisko[31];

                                          char  imie[16];

                                          int  wiek;

                            };

 

              void main( void )

              {

                            FILE *strumien;

                            struct sudent   baza_danych[10];

                            if ( (strumien = fopen( "test.bin" ,  " wb " ) ) != NULL )

                                          {              // zapis zawartości calej bazy ( tablicy struktur) do pliku binarnego

                                                        fwrite( baza_danych, sizeof(struct 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 );                                                                                                                 baza[ i ].nazwisko,

                                                        fclose( strumien );

                                          }

...

Zgłoś jeśli naruszono regulamin