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
int open ( const char *nazwa_pliku, int tryb_dostepu )
int close ( int handle )
int write ( int handle, void *adres_bufora, unsigned ilosc_bajtow )
int read ( int handle, void *adres_bufora, unsigned ilosc_bajtow );
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ę.
FILE *plik_wej, *wyniki ; // definicja zmiennych „strumieniowych”
stdin - strumień wejściowy (konsola - klawiatura)
stdout - strumień wyjściowy (konsola - monitor)
stderr - strumień komunikatów błędów (konsola)
stdprn - strumień drukarki
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
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
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)
#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,
...
melasa4