Fichiers Rappel entrées sorties C standard Flots entrée, sortie

Transcription

Fichiers Rappel entrées sorties C standard Flots entrée, sortie
Rappel entrées sorties C standard
Fichiers
Wieslaw Zielonka
October 25, 2014
Flots entrée, sortie, erreur standards
stdin
stdout
stderr
le flot – le fichier ouvert en lecture/écriture
Ouvrir un flot:
FILE ∗ f o p e n ( const char ∗ chemin , const char ∗mode ) ;
mode
’’r’’
’’w’’
’’a’’
’’w+’’
’’r+’’
’’a+’’
en lecture
en écriture, la taille ramenée à 0
append, en écriture
lecture et écriture, la taille ramenée à 0
lecture et écriture
lecture et écriture avec append
Lecture écriture binaire avec des flots
s i z e t f r e a d ( v o i d ∗tampon , s i z e t t , s i z e t nb ,
FILE ∗ f l o t )
s i z e t f w r i t e ( v o i d ∗ tampon , s i z e t t , s i z e t nb ,
FILE ∗ f l o t )
fread lit dans le tampon le nombre nb d’éléments, chaque
élément de taille t.
La fonction retourne le nombre le nombre d’octets transférés. Si la
fonction retourne 0 alors soit la fin de fichier soit erreur.
Test de fin fichier/erreur
fread et fwrite ne distinguent pas la fin de fichier d’une erreur.
i n t f e o f ( FILE ∗ f l o t )
i n t f e r r o r ( FILE ∗ f l o t )
v o i d c l e a r e r r ( FILE ∗ f l o t )
feof() > 0 si fin de fichier
ferror() > 0 si erreur
clearerr() – efface les marqueurs de fin de fichier et d’erreur
Input/output caractère par caractère
i n t g e t c ( FILE ∗ f p )
i n t f g e t c ( FILE ∗ f p )
i n t g e t c h a r ( void )
i n t p u t c ( i n c , FILE ∗ f p )
i n t f p u t c ( i n t c , FILE ∗ f p )
int putchar ( int c )
Les trois première fonctions retournent EOF à la fin de fichier et en
cas d’erreur.
Les trois dernières fonctions retournent EOF en cas d’erreur.
Tampon d’un flot
char ∗ f g e t s ( char ∗ buf , i n t n , FILE ∗ f p )
Le flot possède un tampon interne.
i n t f p u t s ( char ∗ s t r , FILE ∗ f p )
Le flot non-mémorisé ( unbuffered ) – les octets transmis dans le
fichier ou sur le terminal immédiatement
i n t p u t s ( char ∗ s t r )
mémorisé (fully buffered) – transmission dans le fichier quand le
tampon est plein
fgets met dans buf le caractère de nouvelle ligne à la fin de la
ligne lue.
mémorisé par ligne (line buffered) – transmis dans le fichier quand
le caractère ’\n’ est mis dans le tampon.
i n t f f l u s h ( FILE ∗ f l o t )
force l’écriture de données qui se trouvent dans le tampon.
Gestion de tampon de flot
Indicateur de position
long f t e l l ( FILE ∗ f p )
i n t s e t v b u f ( FILE ∗ f l o t , char ∗tampon , i n t mode ,
size t taille )
i n t f s e e k ( FILE ∗ f p , long o f f s e t , i n t a p a r t i r )
v o i d r e w i n d ( FILE ∗ f p )
mode
_IOFBF
_IOLBF
_IONBF
pleinement mémorisé
mémorisé par ligne
non mémorisé
i n t f g e t p o s ( FILE ∗ f p , f p o s t ∗ pos )
i n t f s e t p o s ( FILE ∗ f p , const f p o s t ∗ pos )
apartir SEEK_SET, SEEK_CUR, SEEK_END
ftell retourne offset courant et fseek retourne 0 si tout OK.
fgetpos stocke la position courante à l’adresse passée comme
deuxième paramètre, cette valeur pourra être utilisée par fsetpos.
Interactions entre le haut et bas niveau
Liens symboliques
Commande UNIX:
l n −s c h a i n e d e c a r a c t e r e s
FILE ∗ f d o p e n ( i n t f d , const char ∗ t y p e )
fdopen — crée un flot pour un descripteur ouvert. Le deuxième
paramètre type est le même que le deuxième paramètre de fopen.
i n t f i l e n o ( FILE ∗ f l o t )
fileno() retourne le descripteur de fichier utilisé par le flot.
lien symbolique
Fonction C:
i n t s y m l i n k ( const char ∗ c h a i n e d e c a r a c t e r e s ,
const char ∗ l i e n s y m b o l i q u e ) ;
symlink retourne 0 en cas de succès, −1 en cas d’échec.
symlink entraı̂ne la création d’un lien vers un nouveau fichier
spécial (de type lien symbolique), le contenu de ce nouveau fichier
est la chaı̂ne de caractères passée dans le premier argument de
symlink.
Lien symbolique
Lien symbolique
symlink ( ”/ u s r / bin ” , ” t o b i n ” ) ;
s y m l i n k ( ”#∗+$ l 2 3 ” , ” . . / v e r s r i e n ” ) ;
s y m l i n k ( ” . . / xx ” , ” t o x x ” ) ;
s ym l i n k ( ”/ u s r / b i n ” , ” t o b i n ” ) ;
s y m l i n k ( ”#∗+$ l 2 3 ” , ” . . / v e r s r i e n ” ) ;
s y m l i n k ( ” . . / xx ” , ” t o x x ” ) ;
Création des liens symboliques to_bin et to_xx dans le répertoire
courant.
Et la création d’un lien symbolique vers_rien dans le répertoire
père.
Création des liens symboliques to_bin et to_xx dans le répertoire
courant. Et la création d’un lien symbolique vers_rien dans le
répertoire père.
.
..
xx
zz
vers_rien
.
..
xx
zz
.
..
a
b
c
répertoire
courant
répertoire
courant
.
..
a
b
c
to_bin
to_xx
"#*+$l23"
"/usr/bin"
"../xx"
Comparer avec les liens durs (link)
1
2
3
l i n k ( ”/ u s r / bin ” , ” t o b i n ” ) ;
l i n k ( ”#∗+$ l 2 3 ” , ” . . / v e r s r i e n ” ) ;
l i n k ( ” . . / xx ” , ” t o x x ” ) ;
(1) échoue – impossible de faire un lien dur vers un répertoire
(sauf pour l’administrateur de système),
(2) échoue - impossible de faire un lien dur vers un rien,
(3) création de lien dur (mais pas de création de fichier).
Suivre ou non le lien symbolique
Si on applique
i n t s t a t ( const char ∗ path , s t r u c t s t a t ∗ b u f ) ;
i n t f s t a t ( i n t fd , st r uct s t a t ∗ buf ) ;
i n t l s t a t ( const char ∗ path , s t r u c t s t a t ∗ b u f ) ;
à un lien symbolique
(1) stat affiche l’information sur le fichier pointé par le lien
symbolique et non pas sur le lien lui même,
(2) lstat affiche les informations sur le lien symbolique,
.
..
xx
zz
vers_rien
répertoire
courant
.
..
a
b
c
to_xx
(3) fstat – agit comme stat et affiche les informations sur le
fichier pointé par un lien symbolique.
On peut avoir une chaı̂ne de liens symboliques : un lien vers un
lien vers un lien etc. stat et fstat affiche les informations sur le
fichier à la fin de la chaı̂ne (à condition que la chaı̂ne de termine
pas par un lien symbolique).
Suivre ou non le lien symbolique
fonction
access
chdir
chmod
chown
creat
exec
lchown
link
lstat
open
opendir
pathconf
readlink
remove
rename
stat
truncate
unlink
ne suit pas le lien symbolique
Lecture de contenu de lien symbolique
suit le lien symbolique
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
s s i z e t r e a d l i n k ( const char ∗ chemin , char ∗ buf ,
size t bufsize );
lit le contenu d’un lien symbolique et le place dans le tampon buf.
La fonction retourne le nombre d’octets placés dans buf (ou −1 en
cas d’échec). La fonction n’ajoute pas de caractère ’\0’ à la fin
donc ce n’est pas une chaı̂ne de caractères qu’on obtient dans buf.
Pour obtenir le contenu comme une chaı̂ne la lecture doit
s’effectuer comme suit :
char b u f [ 1 0 2 4 ] ;
s s i z e t len ;
...
i f ( ( l e n = r e a d l i n k ( ”/ modul es / p a s s 1 ” , buf ,
s i z e o f ( b u f ) −1)) != −1)
b u f [ l e n ] = ’ \0 ’ ;

Documents pareils