Introduction Chaınes de caracteres Entrees/sorties Exemple
UE C avancecours 5: Chaınes de caracteres et entrees/sorties
Jean-Lou Desbarbieux et Stephane DoncieuxUMPC 2009/2010
Introduction Chaınes de caracteres Entrees/sorties Exemple
Sommaire
1 Introduction
2 Chaınes de caracteres
3 Entrees/sortiesStandard
4 Exemple
Introduction Chaınes de caracteres Entrees/sorties Exemple
Introduction
Beaucoup de fonctions a connaıtre...
retenir dans un premier temps le nom uniquement
faire des fiches ou savoir retrouver rapidement l’informationdans un livre (droit aux documents pendant partiel etexamen !)
sur ordinateur, dans un terminal, taper :man 3 <nom de fonction> (touche ’q’ pour sortir)
Introduction Chaınes de caracteres Entrees/sorties Exemple
Representation en memoire
Dans un tableau, termine par un
’\0’
Exemple :
char nom[]= ” d a v i d ” ;char nom2 [7]= ” g o l i a t h ” ;/∗ i l manque une ca se pour ’\0 ’ ∗/
char nom3 [ ]= ” d a v i d \0 g o l i a t h ” ;p r i n t f ( ”nom2=%s \n” , nom2 ) ; /∗ r e s u l t a t ? ∗/p r i n t f ( ”nom3=%s \n” , nom3 ) ; /∗ r e s u l t a t ? ∗/
Introduction Chaınes de caracteres Entrees/sorties Exemple
Quelques fonctions utiles : strlen
#inc lude < s t r i n g . h>
s i z e t s t r l e n ( const char ∗ s ) ;
Renvoie la longueur d’une chaıne de caracteres.
Introduction Chaınes de caracteres Entrees/sorties Exemple
Quelques fonctions utiles : strcmp
#inc lude < s t r i n g . h>
i n t st rcmp ( const char ∗ s1 , const char ∗ s2 ) ;i n t strncmp ( const char ∗ s1 , const char ∗ s2 ,
s i z e t n ) ;
Comparaison entre chaınes de caracteres.La valeur de retour est :
0 si les deux chaınes sont egales
negative si s1 arrive avant s2
positive sinon
Introduction Chaınes de caracteres Entrees/sorties Exemple
Quelques fonctions utiles : strcpy
#inc lude < s t r i n g . h>
char ∗ s t r c p y ( char ∗ dest , const char ∗ s r c ) ;char ∗ s t r n c p y ( char ∗ dest , const char ∗ s r c ,
s i z e t n ) ;
Copie entre deux chaınes de caracteres.Renvoie un pointeur sur dest.
Introduction Chaınes de caracteres Entrees/sorties Exemple
Quelques fonctions utiles : strdup
#inc lude < s t r i n g . h>
char ∗ s t r d u p ( const char ∗ s1 ) ;
Alloue une nouvelle chaıne de caractere de longueur strlen(s1)+1et l’initialise avec la chaıne s1 (equivalent a malloc+strcpy)ATTENTION : il faut bien penser a liberer par un free la chaınede caracteres ainsi creee.
Introduction Chaınes de caracteres Entrees/sorties Exemple
Quelques fonctions utiles : strcat
#inc lude < s t r i n g . h>
char ∗ s t r c a t ( char ∗ dest , const char ∗ s r c ) ;char ∗ s t r n c a t ( char ∗ dest , const char ∗ s r c ,
s i z e t n ) ;
Ajoute la chaıne de caractere src a la fin de dest.Renvoie un pointeur sur dest.
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Entrees/sorties
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Retour sur printf
Affichage d’un message a l’ecran.
Renvoie un entier : nombre de caracteres ecrits
Message specifie par un format contenant des codes de formatExemples :
double p i =3.141592653589793;p r i n t f ( ”Pi : %f \n” , p i ) ;p r i n t f ( ”Pi avec 2 d e c ima l e s : %.2 f , 4 d e c ima l e s : %.4 f \n”
, p i , p i ) ;p r i n t f ( ”2Pi : %f \n” ,2∗ p i ) ;
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
scanf
Lecture de donnees tapees au clavier
Renvoie un entier : nombre d’entites lues
Exploite egalement un format avec des codes de format
f l o a t x ;i n t n ;s c a n f ( ”%f %d” ,&x ,&n ) ;
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
scanf
ATTENTION : lors de la lecture, seul ce qui est demande est lu !Exemple pathologique :
char c ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;
Que fait le programme ?Lecture d’un seul caractere ! Le 2eme etant le retour a la ligne...Solution ajouter un ’ ’ avant le premier code de format :
s c a n f ( ” %c ” ,&c ) ;
→ l’espace indique que le scanf doit ”consommer” tous lesespaces, retour a la ligne et autre tabulation avant de lire quoi quece soit...
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
scanf
ATTENTION : lors de la lecture, seul ce qui est demande est lu !Exemple pathologique :
char c ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;
Que fait le programme ?Lecture d’un seul caractere ! Le 2eme etant le retour a la ligne...Solution ajouter un ’ ’ avant le premier code de format :
s c a n f ( ” %c ” ,&c ) ;
→ l’espace indique que le scanf doit ”consommer” tous lesespaces, retour a la ligne et autre tabulation avant de lire quoi quece soit...
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Quelques codes de format courants
%d : entier
%u : entier non signe
%f : flottant
%c : caractere
%s : chaıne de caracteres (ATTENTION...)
%p : pointeur
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
getchar/putchar
int getchar() : lecture d’un caractere. Renvoie le code ducaractere lu, EOF si probleme. Equivalent ascanf("%c",&c lu)
int putchar(int c) : ecriture d’un caractere. Renvoie lecode du caractere ecrit, EOF si probleme. Equivalent aprintf("%c",c a ecrire)
Fonctions plus simples et plus rapides
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
getchar
ATTENTION : meme probleme sur le getchar que sur scanfExemple de solution :
i n t c ;do
c=g e t c h a r ( ) ;whi le ( c==’ \n ’ ) ;
ou pour eviter aussi espaces, retours a la ligne et autrestabulations :
#inc lude <c t y p e . h>
i n t c ;do
c=g e t c h a r ( ) ;whi le ( i s s p a c e ( c ) ) ;
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Fichiers : principes
Fichiers manipules au travers d’une structure (FILE)
Cette structure est initialisee par une fonction d’ouverture defichier, et est detruite par une fonction de fermeture de fichier
Exemple :
#i n c l u d e <s t d i o . h>i n t main ( ) {
FILE ∗mon f i c h i e r ;i n t x , y , z ;i f ( ( mon f i c h i e r= fopen ( ” f i c h i e r . t x t ” , ” r ”))==NULL) {
p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de f i c h i e r . t x t \n” ) ;r e t u r n 1 ;
}f s c a n f ( mon f i c h i e r , ”%d %d %d” ,&x ,&y ,&z ) ;p r i n t f ( ” Va l e u r s l u e s : %d %d %d\n” , x , y , z ) ;f c l o s e ( mon f i c h i e r ) ;r e t u r n 0 ;
}
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Ouverture d’un fichier : fopen/fclose
FILE *fopen(const char *nom fichier, const char*mode) : ouvre le fichier selon le mode indique (“r”, “w”,“a”,...)
int fclose(FILE *flux) : vide eventuellement le tamponde lecture/ecriture, libere la memoire correspondante et fermele fichier
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
La lecture binaire
s i z e t f r e a d ( v o i d ∗ ptr , s i z e t s i z e ,s i z e t nmemb , FILE ∗ s t ream ) ;
La fonction fread lit nmemb elements de donnees, chacun d’euxrepresentant size octets de long, depuis le flux pointe par stream,et les stocke a l’emplacement pointe par ptr.
Les donnees peuvent etre de type quelconque, ptr peut etre unpointeur sur un int, un float, une struct... Il peut etre un tableaude donnees d’un type quelconque.
ATTENTION : il n’y a aucune espece de format, les donneesecrites dans le fichier sont recopiees directement en memoire.
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
La lecture binaire
s t r u c t po i n t {i n t x ;i n t y ;} ;
. . .
FILE ∗ f i c h i e r ;/∗ ou v e r t u r e du f i c h i e r ∗/i f ( ( f i c h i e r=fopen ( nom f i c h i e r , ” rb ”))==NULL) {
p r i n t f ( ” E r r e u r l o r s de l a l e c t u r e de %s \n” , n om f i c h i e r ) ;e x i t ( 1 ) ;
}s t r u c t po i n t p o i n t l u ;
i n t nb l u=f r e a d (& po i n t l u , s i z e o f ( s t r u c t po i n t ) , 1 , f i c h i e r ) ;
i f ( nb l u == 1) {p r i n t f ( ‘ ‘ L e c t u r e OK\n ’ ’ ) ;
}e l s e {
p r i n t f ( ‘ ‘ L e c t u r e KO\n ’ ’ ) ;
}
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
L’ecriture binaire
s i z e t f w r i t e ( const v o i d ∗ ptr , s i z e t s i z e ,s i z e t nmemb , FILE ∗ s t ream ) ;
La fonction fwrite ecrit nmemb elements de donnees, chacund’eux representant size octets de long, dans le flux pointe parstream, apres les avoir lus depuis l’emplacement pointe par ptr.
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
L’ecriture binaire
s t r u c t po i n t tab [ 1 0 ] ;
/∗ I n i t i a l i s a t i o n de tab ∗/. . .
/∗ ou v e r t u r e du f i c h i e r ∗/i f ( ( f i c h i e r=fopen ( nom f i c h i e r , ”wb”))==NULL) {
p r i n t f ( ” E r r e u r l o r s de l ’ e c r i t u r e de %s \n” , n om f i c h i e r ) ;e x i t ( 1 ) ;
}
f w r i t e ( tab , s i z e o f ( s t r u c t po i n t ) , 10 , f i c h i e r ) ;
/∗ f e rme tu r e du f i c h i e r ∗/f c l o s e ( f i c h i e r ) ;
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Lecture/ecriture formatee
int fscanf(FILE *flux,const char *format, ...) :lecture de donnees a partir d’un format depuis un fichier
int fprintf(FILE *flux, const char *format,...) :ecriture de donnees selon un format specifie dans un fichier
int fputc(int c, FILE *flux) : ecrit un caractere dansun fichier
int fgetc(FILE *flux) : lit un caractere depuis un fichier
char * fgets(char *buffer, int n, FILE *flux) : litune ligne dans un fichier (longueur maximale=n)
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Exemple
#i n c l u d e <s t d i o . h>
i n t main ( ) {
FILE ∗ s r c , ∗ de s t ;i n t ca r ;i f ( ( s r c= fopen ( ” sou r c e . t x t ” , ” r ”))==NULL) {
p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de s ou r c e . t x t \n” ) ;r e t u r n 1 ;
}i f ( ( d e s t= fopen ( ” d e s t i n a t i o n . t x t ” , ”w”))==NULL) {
p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de d e s t i n a t i o n . t x t \n” ) ;r e t u r n 1 ;
}ca r = f g e t c ( s r c ) ;w h i l e ( ca r !=EOF) {
f p u t c ( car , d e s t ) ;c a r = f g e t c ( s r c ) ;
}f c l o s e ( s r c ) ;f c l o s e ( d e s t ) ;r e t u r n 0 ;
}
Introduction Chaınes de caracteres Entrees/sorties Exemple Standard
Lecture d’un fichier ligne a ligne
Lecture d’un fichier contenant 3 entiers par ligne avec fgets etsscanf
#i n c l u d e <s t d i o . h>#d e f i n e LONGUEURLIGNE 128
i n t main ( ) {FILE ∗ s r c ;i f ( ( s r c= fopen ( ” sou r c e . t x t ” , ” r ”))==NULL) {
p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de s ou r c e . t x t \n” ) ;r e t u r n 1 ;
}char b u f f e r [ LONGUEURLIGNE ] ;char ∗ r e s=f g e t s ( b u f f e r , LONGUEURLIGNE, s r c ) ;i n t a , b , c ;w h i l e ( r e s != NULL) {
s s c a n f ( b u f f e r , ” %d %d %d” ,&a , &b , &c ) ;r e s=f g e t s ( b u f f e r , LONGUEURLIGNE, s r c ) ;p r i n t f ( ”Lu l e s e n t i e r s a=%d , b=%d , c=%d\n” , a , b , c ) ;
}
f c l o s e ( s r c ) ;r e t u r n 0 ;
}
Introduction Chaınes de caracteres Entrees/sorties Exemple
Exemple
Introduction Chaınes de caracteres Entrees/sorties Exemple
C’est tout pour aujourd’hui !
Top Related