w10 operacje plikowe, semestr I

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
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • alter.htw.pl
  • Powered by WordPress, © Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.