Ghost in the machine
Transkrypt
Ghost in the machine
Ghost in the machine
Operacje na pamieci
, i odrobina I/O
Marcin Makowski
Zaklad Chemii Teoretycznej UJ
8 stycznia 2007
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
1
Operacje na pamieci
,
2
Funkcje operujace
na standardowych strumieniach i nie tylko ...
,
3
Wstep
, do operacji I/O na plikach
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
malloc, free, sizeof
Funkcja malloc alokuje pamieć
, o rozmiarze size i zwraca wskaźnik
do poczatku
obszaru zaalokowanej pamieci.
Pamieć
,
,
, pobrana przy
pomocy malloc jest zajeta
aż
do
chwili
jej
zwrócenia
przez
,
wywolanie funkcji free.
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
/ * v o i d * m a l l o c ( s i z e t NBYTES ) ;
v o i d f r e e ( v o i d *APTR ) ; * /
i n t main ( ) {
int n;
s c a n f ( ”%d ” , &n ) ;
d o u b l e *a = m a l l o c ( n * s i z e o f ( d o u b l e ) ) ;
i f ( n > 3) {
*( a + 3 ) = 2 . 0 ;
a [1] = 1.0;
p r i n t f ( ”%f %f \n ” , a [ 1 ] , a [ 3 ] ) ;
}
free (a );
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
memset
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t r i n g . h>
/ * v o i d * memset ( c o n s t v o i d *DST , i n t C , s i z e t LENGTH ) ;
F u n k c j a k o n w e r t u j e argument C do t y p u u n s i g n e d c h a r (1− b a j t o w y )
i w y p e l n i a LENGTH b a j t o w p a m i e c i t a w a r t o s c i a z a c z y n a j a c od a d r e s u
wskazywanego p r z e z DST * /
i n t main ( ) {
double a [ 5 ] = {1 , 2 , 4 , 5 , 9};
f o r ( u n s i g n e d i = 0 ; i < 5 ; ++i )
p r i n t f ( ”a[%d ] = %f \n ” , i , a [ i ] ) ;
memset ( a , 0 , 5
* s i z e o f ( double ) ) ;
f o r ( u n s i g n e d i = 0 ; i < 5 ; ++i )
p r i n t f ( ”a[%d ] = %f \n ” , i , a [ i ] ) ;
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
calloc, realloc
#i n c l u d e < s t d l i b . h>
/ * v o i d * c a l l o c ( s i z e t N, s i z e t S ) ;
z w r a c a w s k a z n i k do p r z y d z i e l o n e g o b l o k u p a m i e c i :
t a k i e g o , k t o r y p o m i e s c i N elementow , k a z d y o r o z m i a r z e S ;
k a z d y b a j t z w r a c a n e g o o b s z a r u p a m i e c i j e s t u s t a w i a n y na 0
*/
v o i d * r e a l l o c ( v o i d *PTR, s i z e t NBYTES ) ;
J e z e l i PTR j e s t w s k a z n i k i e m na w c z e s n i e j p r z y d z i e l o n a
d y n a m i c z n i e pamiec , t o r e a l l o c p o z w a l a z m i e n i c w i e l k o s c p r z y d z i e l o n e g o
o b s z a r u na NBYTES, n i e z m i e n i a j a c j e g o p o c z a t k o w e j z a w a r t o s c i .
i n t main ( ) {
d o u b l e *a = c a l l o c ( 5 , s i z e o f ( d o u b l e ) ) ;
/ * d o k l a d n i e rownowazne s e k w e n c j i : m a l l o c , memset * /
d o u b l e *b = m a l l o c ( 5 * s i z e o f ( d o u b l e ) ) ;
memset ( b , 0 , 5 * s i z e o f ( d o u b l e ) ) ;
r e a l l o c ( a , 3 * s i z e o f ( d o u b l e ) ) ; // z m n i e j s z a m y do t r z e c h
r e a l l o c ( a , 7 * s i z e o f ( d o u b l e ) ) ; // z w i e k s z a m y do s i e d m i u
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
memcpy, memmove
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t r i n g . h>
/ * v o i d * memcpy ( v o i d *OUT, c o n s t v o i d * IN , s i z e t N ) ;
v o i d *memmove ( v o i d *OUT, c o n s t v o i d * IN , s i z e t N ) ;
memcpy k o p i u j e N b a j t o w z o b s z a r u p a m i e c i wskazywanego
p r z e z IN do o b s z a r u wskazywanego p r z e z OUT, o b s z a r y IN i OUT
n i e powinny s i e n a k l a d a c ;
memmove p o z w a l a o b s l u z y c p o p r a w n i e k o p i o w a n i e w p r z y p a d k u
n a k l a d a j a c y c h s i e o b s z a r o w IN i OUT;
*/
i n t main ( ) {
double a [ 5 ] = {1 , 2 , 4 , 5 , 9};
f o r ( u n s i g n e d i = 0 ; i < 5 ; ++i )
p r i n t f ( ”a[%d ] = %f \n ” , i , a [ i ] ) ;
memcpy ( a + 3 , a , 2
* s i z e o f ( double ) ) ;
f o r ( u n s i g n e d i = 0 ; i < 5 ; ++i )
p r i n t f ( ”a[%d ] = %f \n ” , i , a [ i ] ) ;
memmove ( a + 1 , a , 2
* s i z e o f ( double ) ) ;
f o r ( u n s i g n e d i = 0 ; i < 5 ; ++i )
p r i n t f ( ”a[%d ] = %f \n ” , i , a [ i ] ) ;
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
stdin, stdout, stderr
Podstawowym pojeciem
dla operacji wejścia/wyjścia jest strumień.
,
Stanowi on źródlo lub cel danych. Strumień wiaże
, sie, z plikiem lub
urzadzeniem
za
pomoc
a
otwarcia,
po
l
aczenie
to
zrywa sie, za
,
,
,
pomoca, zamkniecia.
W
momencie
uruchomienia
programu
,
dysponuje on szczególnymi trzema strumieniami, które sa, już
otwarte:
stdin - standardowe wejście
stdout - standardowe wyjście
stderr - standardowe wyjście bledów
,
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
getchar, putchar
#i n c l u d e < s t d i o . h>
/* i n t g e t c h a r ( v o i d ) ;
i n t putchar ( i n t ) ;
*/
getchar
efektem
putchar
efektem
wartosc
zwraca znak pobrany ze standardowego w e j s c i a ,
ubocznym j e s t p r z e s u n i e c i e s i e w tym s t r u m i e n i u na n a s t e p n a p o z y c j e ;
w y p i s u j e o t r z y m a n y z n a k na s t a n d a r d o w e w y j s c i e ,
ubocznym j e s t p r z e s u n i e c i e s i e w tym s t r u m i e n i u na n a s t e p n a p o z y c j e ,
z w r a c a n a p r z e z p u t c h a r t o o t r z y m a n y argument ( s u k c e s ) l u b EOF ( b l a d ) ;
i n t main ( )
{
int c ;
c = getchar ( ) ;
w h i l e ( c != EOF) {
putchar ( c ) ;
c = getchar ( ) ;
}
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
printf, scanf
#i n c l u d e < s t d i o . h>
i n t p r i n t f ( const char *format , . . . ) ;
i n t s c a n f ( const char *format , . . . ) ;
/ * p r i n t f pod nadzorem argumentu f o r m a t p r z e k s z t a l c a ,
f o r m a t u j e i w y p i s u j e s w o j e k o l e j n e a r g u m e n t y na s t a n d a r d o w e w y j s c i e ;
s c a n f w c z y t u j e z n a k i z e s t a n d a r d o w e g o w e jś c i a ,
i n t e r p r e t u j e j e z g o d n i e z e s p e c y f i k a c j a,
z a w a r t a, w a r g u m e n c i e f o r m a t i z a p a m i e, t u j e w y n i k i
w m i e j s c a c h o k r eś l o n y c h p r z e z k o l e j n e a r g u m e n t y .
*/
Format zawiera:
zwykle znaki
specyfikacje przeksztalceń - rozpoczynajace
sie, od % i
,
kończace
znakiem przeksztalcenia
,
Zapraszam do lektury. Przyklady, korekta do [BK, DR] i dyskusja w czwartek.
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
sprintf
int
s p r i n t f ( char
*s , c o n s t c h a r * format , . . . ) ;
dziala tak samo jak printf, przy czym role, wyjścia spelnia
tablica s
na końcu wyniku dodawany jest znak pusty
tablica s musi być dostatecznie duża, żeby pomieścić wynik
wartość zwracana (liczba wypisanych znaków) nie uwzglednia
,
końcowego znaku pustego
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
sscanf
i n t s s c a n f ( char
*s , c o n s t c h a r * format , . . . ) ;
dziala tak samo jak sscanf
role, wejścia pelni tablica s
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
fopen
FILE
* f o p e n ( c o n s t c h a r * f i l e , c o n s t c h a r * mode ) ;
Funkcja fopen otwiera (zwiazuje
ze strumieniem) plik o nazwie file.
,
Funkcja otwiera plik w trybie mode i zwraca wskaźnik do pliku
(typu FILE*) lub w przypadku bledu
wskaźnik NULL. Otrzymany
,
wskaźnik do pliku może być później użyty jako argument w
funkcjach wykonujacych
operacje wejścia/wyjścia.
,
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
Na jakie sposoby można otworzyć plik?
Możliwe tryby otwarcia to:
r - czytanie, plik musi istnieć
w - pisanie, jeśli plik istnieje to zostanie nadpisany; jeśli nie, to
utworzony
a - dopisywanie, poprzednia zawartość jest zachowywana; jeśli
plik nie istnieje, to zostanie utworzony
przy otwieraniu plików binarnych należy dolożyć b - np. wb
#i n c l u d e < s t d i o . h>
i n t main ( ) {
FILE * o s t r e a m = f o p e n ( ” m o j p l i k . d a t ” , ”w ” ) ;
p u t c ( ’ a ’ , o s t r e a m ) ; // w y p i s u j e z n a k ’ a ’ do p l i k u
f c l o s e ( o s t r e a m ) ; // zamyka p l i k
return 0;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
fclose
int
f c l o s e ( FILE
*stream ) ;
zamyka plik, czyli zrywa jego polaczenie
ze strumieniem
,
zwraca 0 (sukces) lub EOF (blad)
,
wskaźnik do pliku zostaje zwolniony - istotne dla systemów z
ograniczeniami na liczbe, otwartych plików
efektem ubocznym jest opróżnienie buforów wejściowych
polaczone
z wypisaniem nie wypisanych dotad
,
, danych
zwiazanych
ze
strumieniem
,
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
stdin/stdout/stderr raz jeszcze
stdin, stdout, stderr też sa, typu FILE* (sa, wskaźnikami do
plików)
można ich użyć przy wywolaniu dowolnej funkcji przyjmujacej
,
argument typu FILE*
#i n c l u d e < s t d i o . h>
i n t main ( ) {
int liczba ;
FILE * o s t r e a m = f o p e n ( ” m o j p l i k . d a t ” , ”w ” ) ;
s c a n f ( ”%d ” , & l i c z b a ) ;
f p r i n t f ( o s t r e a m , ”A l a ma %d k o t y ” , l i c z b a ) ;
f p r i n t f ( s t d o u t , ”A l a ma %d k o t y ” , l i c z b a ) ;
f c l o s e ( s t d o u t ) ; // t o t e z mozna z r o b i c
f c l o s e ( ostream ) ;
}
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
fprintf, fscanf
i n t f p r i n t f ( FILE * s t r e a m , c o n s t c h a r * f o r m a t , . . . ) ;
i n t f s c a n f ( FILE * s t r e a m , c o n s t c h a r * f o r m a t , . . . ) ;
dzialaja, jak printf i scanf
strumień na którym operuja, jest definiowany przez wskaźnik
stream (wskaźnik do pliku)
fprintf(stdout,...) odpowiada printf(...)
fscanf(stdin,...) odpowiada scanf(...)
Marcin Makowski
Ghost in the machine
Plan
Operacje na pamieci
,
Funkcje operujace
na
standardowych
strumieniach
i
nie
tylko
...
,
Wstep
do
operacji
I/O
na
plikach
,
getc, putc, ungetc
i n t g e t c ( FILE * s t r e a m ) ;
i n t p u t c ( i n t c , FILE * s t r e a m ) ;
i n t u n g e t c ( i n t c , FILE * s t r e a m ) ;
getc i putc dzialaja, odpowiednio jak getchar i putchar
strumień na którym operuja, jest definiowany przez wskaźnik
stream (wskaźnik do pliku)
ungetc pozwala wycofać znak c do strumienia stream zostanie on pobrany przy nastepnym
odczycie ze strumienia
,
dla danego strumienia wycofać można tylko jeden znak
nie można wycofać znacznika końca pliku(EOF)
Marcin Makowski
Ghost in the machine