C Structuré pour Débutants en 1re Année
C Structuré pour Débutants en 1re Année
de Marseille
² ¯
Programmation Structurée
en Langage C - 1re année
± °
Sommaire
ë Introduction, Tr. 3
ë Types et variables, Tr. 5
ë Lire et écrire, Tr. 11
ë Opérateurs et expressions, Tr. 16
ë Types dérivés (tableaux), Tr. 21
ë Instructions de contrôle, Tr. 25
ë Fonctions, Tr. 37
ë Pointeurs et adresses, Tr. 43
ë Compilation séparée et Makefile, Tr. 54
ë Préprocesseur, Tr. 61
ë Structures, unions et énumérations, Tr. 66
ë Manipulation des fichiers, Tr. 79
ë Autres petites choses. Tr. 96
Le langage C
Premiers programmes
démo 1
Ligne de compilation : cf. Tr. 105
Principales bases
Bases Notations Symboles
2 binaire 0, 1
8 octale 0, 1, ..., 7
10 décimale 0, 1, ..., 9
16 hexadécimal 0, 1, ..., 9, a, b, c, d, e, f
0 1 0 0 0 1 1 0
Bit de signe
Types entiers
ý 3 types entiers
ë char : ’a’ (1 octet), de -128 à +127. ë Tr. 9
ë short int : -10814 (2 octets), de -32768 à +32767.
ë int, long int : 158141234 (4 octets), de ... à ...
Qualificatifs : signed (défaut) ou unsigned.
Type char
ë Entre côtes : ’a’, ’z’, ’B’
ý Table des codes ASCII (annexe du poly. de langage C).
ë Valeur de type entier
’A’ à ’Z’ : caractères majuscule ý code ASCII : 65 à 90
’a’ à ’z’ : caractères minuscule ý code ASCII : 97 à 122
’0’ à ’9’ : caractères chiffres ý code ASCII : 48 à 57
ë Caractères spéciaux :
’\’’ : apostrophe ý code ASCII : 39
’\\’ : antislash ý code ASCII : 92
’\t’ : tabulation ý code ASCII : 9
’\n’ : saut de ligne ý code ASCII : 10
’\0’ : terminaison de chaı̂ne ý code ASCII : 0
Types flottants
ý 3 types flottants
ë float : 125.46 (4 octets), de −1038 à +1038 .
ë double,long double : 1.55e-6, (8 octets), de −10308 à +10308 .
Qualificatifs signed ou unsigned interdits ! ! !
ý Déclaration, initialisation de variables
#i n c l u d e <s t d i o . h>
i n t main ( ) {
i nt a = 5 ;
i nt b = a ;
a = 8;
p r i n t f ( ” a = %d , b = %d” , a , b ) ;
return 0 ;
}
démo 3
#i n c l u d e <s t d i o . h>
i n t main ( ) {
char t t [ 8 0 ] ; // Tableau de 80 c a r a c t è r e s
p r i n t f ( ” Donnez une c h a i n e de c a r a c t e r e s : ” ) ;
s c a n f ( ”%s ” , t t ) ;
p r i n t f ( ” \nLa c h a i n e e n t r e e e s t : %s \n” , t t ) ;
return 0 ;
}
#i n c l u d e <s t d i o . h>
in t main ( ) {
i n t i =10;
float l =3.14159;
char p [ 5 0 ] = ” Bonjour ” ;
p r i n t f ( ”Avant l e c t u r e au c l a v i e r : %d %f %s \n” , i , l , p ) ;
s c a n f ( ”%d%f%s ” ,& i ,& l , p ) ;
p r i n t f ( ” Apres l e c t u r e au c l a v i e r : %d %f %s \n” , i , l , p ) ;
return 0 ;
}
Opérateurs arithmétiques
démo 4
#i n c l u d e <s t d i o . h>
i n t main ( ) {
i n t i =10 , j =−3;
i n t k = i −j ;
p r i n t f ( ” \nk=%d , c a l c u l=%d\n” , k , ( i ∗ i )%(− j ) ) ;
return 0 ;
}
#i n c l u d e <s t d i o . h>
#i n c l u d e <math . h>
i n t main ( ) {
double a ;
p r i n t f ( ” \ n E n t r e z un a n g l e : ”) ;
s c a n f ( ”% l f ” , &a ) ;
p r i n t f ( ” Le c o s de l ’ a n g l e vaut : % l f \n” , c o s ( a ) ) ;
p r i n t f ( ” Son l o g a r i t h m e vaut : % l f \n” , l o g 1 0 ( a ) ) ;
return 0 ;
}
Incrémentation et décrémentation
Incrémentation
ë i++ ; ou ++i ; signifie i = i + 1 ;
ë i += n ; signifie i = i + n ;
ë Même chose avec i--, --i et i -= n
Pré-incrémentation
ë int i = 5 ; int a = ++i ; donne i=6 et a=6
ë int i = 5 ; int a = --i ; donne i=4 et a=4
Post-incrémentation
ë int i = 5 ; int a = i++ ; donne i=6 et a=5
ë int i = 5 ; int a = i-- ; donne i=4 et a=5
ë Affectation :
– tf[5] = 3.8 ;
– tab[0][2] = -5.0 ;
#i n c l u d e <s t d i o . h>
i n t main ( ) {
double t f [ 5 ] = { 1 . 2 , −4.7 , 3 . 4 } ;
p r i n t f ( ”\ n t f [0]= %l f ” , t f [ 0 ] ) ;
double t = t f [ 2 ] ;
p r i n t f ( ” \ nt = %l f ” , t ) ;
démo 6 t f [ 3 ] = −8.789;
p r i n t f ( ”\ n t f [3]= %l f ” , t f [ 3 ] ) ;
p r i n t f ( ”\ n t f [5]= %l f ” , t f [ 5 ] ) ;
tf [5] = 1.21;
p r i n t f ( ” t f [5]= %l f ” , t f [ 5 ] ) ;
return 0 ;
}
b o n j o u r \0
m e s s a g e \0
démo 7
#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>
i n t main ( ) {
char ch1 [ 5 0 ] = ” Bonjour ! ” ;
p r i n t f ( ” \ nch1=%s ; ch1 [3]=% c ; ch1 [20]=% c ” , ch1 , ch1 [ 3 ] , ch1 [ 2 0 ] ) ;
char ch2 [ 1 2 0 ] ;
p r i n t f ( ” \ n E n t r e z une c h a i n e : ” ) ;
s c a n f ( ”%s ” , ch2 ) ;
ch2 [ 3 ] = ’ Z ’ ;
p r i n t f ( ” \ nch2=%s ; ch2 [3]=% c ; ch2 [20]=% c ” , ch2 , ch2 [ 3 ] , ch2 [ 2 0 ] ) ;
i n t t a i l l e = s t r l e n ( ch2 ) ;
p r i n t f ( ” \ n T a i l l e de ch2 = %d” , taille ) ;
return 0 ;
}
Instructions de contrôle
ë Instructions conditionnelles :
if : test. Tr. 26
switch : table de branchement. Tr. 28
ë Instructions répétitives :
while. Tr. 30
for. Tr. 32
do ... while. Tr. 31
ë Rupture de séquence :
continue. Tr. 35
break, return. Tr. 36
Inst. cond. : if
1- if ( expression ) if ( f i n == 1 )
p r i n t f ( ”Au r e v o i r ! ”) ;
instruction
if ( ( n==1) && (m>=10) ) {
2- if ( expression )
p r i n t f ( ” Bonjour ” ) ;
instruction1 fin = 1;
}
else else
instruction2 p r i n t f ( ”Au r e v o i r ” ) ;
i n t main ( ) {
p r i n t f ( ” V o u l e z vous i m p r i m e r l e mode d ’ e m p l o i ?\ n” ) ;
char c ;
s c a n f ( ”%c ” , &c ) ;
if ( c== ’ o ’ )
p r i n t f ( ” \ nJe l a n c e l e p r o c e s s u s d ’ i m p r e s s i o n ” ) ;
else {
i f ( c== ’ n ’ )
p r i n t f ( ” \ nJe ne f a i s r i e n ” ) ;
else
p r i n t f ( ” Tapez o ou n” ) ;
}
return 0 ;
}
char c ;
s c a n f ( ”%c ” , &c ) ; démo 8
switch ( c )
int i ;
{
s c a n f ( ”%d ” , & i ) ;
case ’a ’ :
switch ( i )
p r i n t f ( ” Choix ’a ’”) ;
{
break ;
case 1 :
case ’A ’ :
case 2 :
p r i n t f ( ” Choix ’A ’ ” ) ;
p r i n t f ( ” Choix 1 ou 2 ” ) ;
break ;
break ;
case ’b ’ :
case 3 :
p r i n t f ( ” Choix ’b ’”) ;
case 4 :
break ;
p r i n t f ( ” Choix 3 ou 4 ” ) ;
case ’B ’ :
break ;
p r i n t f ( ” Choix ’B ’ ” ) ;
default :
break ;
p r i n t f ( ” Mauvais choix ! ”) ;
default :
break ;
p r i n t f ( ” Mauvais choix ! ”) ;
}
break ;
}
i n t nb ;
p r i n t f ( ” \ n E n t r e z un nombre : ” ) ;
s c a n f ( ”%d” , &nb ) ;
démo 9
Instruction in t s [ 1 0 ] , i =0 , n =5634;
do {
Condition s [ i ] = n % 10;
i ++;
Vrai Faux n /= 1 0 ;
} while ( n > 0 ) ;
Initialisation
Exp 1
Rebouclage
Exp 3
Test
Exp 2
Instruction Vrai Faux
double ta b [ 4 ] = { 3 . 2 , 5 . 1 , 9 , −1.8};
int i ; démo 10
f o r ( i =0; i <=3; i ++)
char ch1 [ ] = ” Coucou ! ” ;
p r i n t f ( ” \ n V a l e u r : % l f ” , t ab [ i ] ) ;
char ch2 [ 5 0 ] ;
int i ;
i n t nb ;
f o r ( i =0; i <=s t r l e n ( ch1 ) ;
p r i n t f ( ” E n t r e z un nombre : ” ) ;
i ++)
s c a n f ( ”%d” , &nb ) ;
ch2 [ i ] = ch1 [ i ] ;
p r i n t f ( ” Copie=%s ” , ch2 ) ;
f o r ( i n t i=nb ; i >0; i −−)
p r i n t f ( ” I t e r numero : %d” , i ) ;
Rupture : continue
int i , j = 0 ;
char c =0;
f o r ( i = 0 ; c != ’ \n ’ ; i ++){
s c a n f ( ”%c ” , &c ) ;
i f ( ( c == ’ ’ | | ( c == ’ \ t ’ ) | | ( c == ’ \n ’ ) )
continue ;
j ++;
}
démo 11
Le programme compte le nombre de caractères non blancs entrés au clavier
et le nombre total de caractères (jusqu’à un Retour-chariot).
ë i contient le nombre total de caractères qui ont été tapés au clavier ;
ë j contient le nombre de caractères non blancs ;
Rupture : break
i n t i , j =0;
char c =0;
f o r ( i =0; ; i++ ) {
s c a n f ( ”%c ” ,& c ) ;
i f ( c == ’ \n ’ ) break ;
i f ( ( c == ’ ’ ) | | ( c == ’ \ t ’ ) ) continue ;
j++ ;
}
// En−t ê t e de l a fonction
void A f f i c h e ( ) ;
// D é c l a r a t i o n de l a fonction
void A f f i c h e ( ) {
// f o n c t i o n principale
p r i n t f ( ” Message ” ) ;
i n t main ( ) {
}
// 1 p p e l de l a fct
Affiche () ;
// f o n c t i o n principale
return 0 ;
i n t main ( ) {
}
// Appel de l a fct
Affiche () ;
// D é c l a r a t i o n de l a fonction
return 0 ;
void A f f i c h e ( ) {
}
p r i n t f ( ” Message ” ) ;
}
#include<s t d i o . h>
#include<math . h>
// D é c l a r a t i o n de l a f o n c t i o n
double S i n u s ( ) {
double a n g l e ;
s c a n f ( ”% l f ” , &a n g l e ) ;
return s i n ( a n g l e ) ;
}
i n t main ( ) {
double r e s ;
// Appel de l a f o n c t i o n
res = Sinus () ;
p r i n t f ( ”\ nRe sult at = %l f ” , r e s ) ;
return 0 ;
}
démo 13
#i n c l u d e<s t d i o . h>
// D é c l a r a t i o n de l a f o n c t i o n
i n t Add ( i n t v a l 1 , i n t v a l 2 ) {
int r e s u l t ; // d e c v a r locale
r e s u l t = val1 + val2 ; // c a l c u l
return r e s u l t ; // r e t o u r
}
int main ( ) {
int res , a = 5 , b = 8;
// A p p e l s de l a f o n c t i o n
r e s = Add ( a , b ) ; p r i n t f ( ” \ n R e s u l t a t = %d ” , res ) ;
r e s = Add( −8 , 1 5 ) ; p r i n t f ( ” \ n R e s u l t a t = %d ” , res ) ;
r e s = Add( −8∗2 −5 , 6∗ a ) ; p r i n t f ( ” \ n R e s u l t a t = %d ” , res ) ;
return 0;
}
ë Les arguments transmis sont recopiés dans les variables locales de la fonction.
Fonctions récursives
ë La fonction s’appelle elle-même ! ë Exemple : 4! = 4 ∗ 3!.
démo 16
#i n c l u d e <s t d i o . h>
// D é c l a r a t i o n de la fonction
int f a c t ( int n) { fact(4) 4*fact(3) 4*6 = 24
if ( n<=1)
return 1;
fact(3) 3*fact(2) 3*2 = 6
else
return n∗ f a c t ( n−1) ;
}
fact(2) 2*fact(1) 2*1 = 2
int main ( ) {
// Appel de la fonction
p r i n t f ( ”\ n F a c t o r i e l 4 = %d ” , fact (4) ) ; fact(1) 1
return 0;
}
Pointeurs et adresses
Type pointeur
ë Variables : float x=-12.98587E-5 ; char c=’F’ ;
Octet Octet
x=-12.98567E-5 c=’F’
0x2ab091 0x2ab097
ë Pointeurs :
Déclaration : float* px ; et char* pc ;
Initialisation : px = &x ; et pc = &c ;
Octet Octet
px=0x2ab091 pc=0x2ab097
0x2fc0b3 0x2fc0b8
Schéma global :
px c pc x
Autre exemple :
i n t x=1 , y =2;
i n t ∗ px ; // p i p o i n t e s u r un i n t
px = &x ; // p i p o i n t e s u r x
y = ∗px ; // y r e ç o i t la valeur 1 (x)
∗px = 0 ; // x vaut 0
Remarques :
ë &*p est identique à p (pour p un pointeur)
ë Opérateurs sur les pointeurs : +, -, ++, --, +=, -=, ==, != ...
ë p=NULL : identique à l’initialisation à 0 d’une variable entière ou
flottante.
#i n c l u d e <s t d i o . h>
void main ( ) {
int i = 0 ;
i n t ∗p ;
float x = 3.14;
float ∗ f ;
p = &i ;
∗ f = 666;
f = &x ;
∗ f = ∗p ;
∗p = 3 4 ;
p = f;
∗p = ∗p + 1 ;
p r i n t f ( ” \ n i=%d ; ∗ f=%f ” , i , ∗ f ) ;
}
Pointeurs et Tableaux
ë Tableau 1D (Vecteur) : int vect[5] = {2, 3, 4, 5, 6} ;
vect[0] vect[1] vect[2] vect[3] vect[4]
2 3 4 5 6
0x2fcb03 0x2fcb05 0x2fcb07 0x2fcb09 0x2fcb0b
f l o a t ∗p , ∗q ;
f l o a t tab [ 5 ] = { 1 , 2 , 3 , 4 , 5 } ;
p = &tab [ 2 ] ;
p = tab +2;
∗p= 0 . 0 ;
q = p++; \\ Post−i n c ré m e n t a t i o n !
∗ ( q+2) = −10;
ý Types d’allocation :
ý Allocation statique :
ë Pour créer et supprimer des ¿ objets À lors de la compilation.
ë Utilise la pile (limitée en taille).
ë La taille de la mémoire à allouer doit être connue à la compilation.
ý Allocation dynamique :
ë Pour créer et supprimer des ¿ objets À lors de l’execution.
ë Utilise le tas (limitée par la mémoire de votre PC).
ë La taille de la mémoire à allouer peut être connue lors de l’éxecution.
démo 12
#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>
i n t main ( ) {
int t a i l l e , i ;
p r i n t f ( ” E n t r e z l a t a i l l e du v e c t e u r : ”) ;
s c a n f ( ”%d” , & t a i l l e ) ;
double ∗ ta b ;
ta b = ( double ∗ ) m a l l o c ( t a i l l e ∗ s i z e o f ( double ) ) ;
f o r ( i =0; i < t a i l l e ; i ++) t a b [ i ] = 8 . 0 ∗ i ;
f r e e ( ta b ) ;
return 0 ;
}
1 2 3 4 5 6 7 8
démo 12bis
int main ( ) {
int a = 5 , b = 8;
p r i n t f ( ” \ na= %d , b = %d ” , a, b) ;
Swap(&a , &b ) ;
p r i n t f ( ” \ na= %d , b = %d ” , a, b) ;
return 0;
}
ë Les arguments transmis sont les adresses des variables. Les valeurs des
variables de la fonction appellante sont modifiées.
démo 15
i n t s t r l e n 1 ( char ∗ s ) {
int n ;
f o r ( n =0;∗ s != ’ \0 ’ ; n++) s ++;
return n ;
}
i n t s t r l e n 2 ( char ∗ s ) {
char ∗ p=s ;
while ( ∗p != ’ \0 ’ ) p++;
return p−s ; // Conv . hé x a −> dé c .
}
i n t main ( ) {
int t a i l l e 1 , t a i l l e 2 ;
char c h a i n e [ ] = ” La p i e c h a n t e . ” ;
t a i l l e 1 = s t r l e n 1 ( chaine ) ;
t a i l l e 2 = s t r l e n 2 ( chaine ) ;
p r i n t f ( ” \ n t a i l l e 1=%d , t a i l l e 2=%d” , taille1 , taille2 ) ;
return 0 ;
}
i n t ∗ C o n c a t V e c t ( i n t ∗ Vect1 , i n t ∗ V e c t 2 ) {
i n t ∗ NewVect ;
NewVect = ( i n t ∗ ) m a l l o c ( 2 ∗ TAILLE∗ s i z e o f ( i n t ) ) ;
return NewVect ;
}
i n t main ( ) {
i n t t a b 1 [ TAILLE ] = { 1 , 2 , 3 } ;
i n t t a b 2 [ TAILLE ] = { 4 , 5 , 6 } ;
int ∗ tab12 ;
tab12 = ConcatVect ( tab1 , tab2 ) ;
...
f r e e ( t a b 1 2 ) ; // l i b é r a t i o n mémoire
return 0 ;
}
Compilation séparée
main.c fichier.c
Precompilation
main.i fichier.i
Compilation
main.o fichier.o
Edition de liens
prg
// main . c // f i c h i e r . c
On délocalise les en-têtes des fonctions dans un fichier ¿ header file À, que
l’on appelle généralement fichier.h (extension .h). Dans ce fichier, on y
ajoute la définition des constantes, des structures, les macro-fonctions ...
// f i c h i e r . h
extern i n t p l u s ( i n t a , i n t b ) ;
extern i n t mult ( i n t a , i n t b ) ;
// f i c h i e r . c
// main . c
int plus ( int a , int b) {
#i n c l u d e ” f i c h i e r . h”
int c = a + b ;
return c ;
i n t main ( ) {
}
int a = 5 , b = 8 ;
int r e s u l t 1 = plus ( a , b) ;
i n t mult ( i n t a , i n t b ) {
i n t r e s u l t 2 = mult ( a , b ) ;
int c = a ∗ b ;
return 0 ;
return c ;
}
}
démo 17 à modifier
ë Principe du Makefile
ë Au lieu de taper toutes les commandes de compilation et
d’édition de liens, on peut les regrouper dans un fichier
(généralement appelé Makefile ou makefile).
ë Les Makefile doivent respecter une syntaxe très particulière.
ë On lance la compilation grâce à l’utilitaire make, qu’il suffit
d’exécuter avec make (ou make -f Makefile).
ë La compilation par make est intelligente, au sens où n’est
recompilé que ce qui a été modifié.
ë Exemple de Makefile
# C ré a t i o n de l ’ e x é c u t a b l e par é d i t i o n de l i e n s .
prg : main . o f i c h i e r . o
g c c −o prg main . o f i c h i e r . o
# C ré a t i o n de f i c h i e r . o par c o m p i l a t i o n .
fichier .o: fichier . c fichier .h
g c c −c f i c h i e r . c
Préprocesseur
Variables du pré-processeur
ý Constante de pré-compilation
Macro-expression ou macro-fonction
ý Directive : #define.
ý Exemple : #define add(x1,x2) ((x1) += (x2)) .
ý add(a,b) est remplacé par ((a) += (b))
ý Attention au parenthésage : Il faut toujours encadrer les
pseudo-variables par des parenthèses.
Évaluation de macro-expressions
démo 18
// T e s t . h
#i f n d e f TEST H
#d e f i n e TEST H
extern i n t add ( i n t C, i n t D) ;
int VarGlobale ;
#e n d i f
Structures et pointeurs
Structures et fonctions
démo 19
#i n c l u d e<s t d i o . h>
s t r u c t Point2D {
double x ;
double y ;
};
i n t main ( ) {
s t r u c t Point2D point ;
double a , b ;
p r i n t f ( ” E n t r e z deux v a l e u r s : ” ) ;
s c a n f ( ”% l f % l f ” , &a , &b ) ;
point = InitPoint (a , b) ;
p r i n t f ( ” x=%l f , y=%l f ” , p o i n t . x , p o i n t . y ) ;
return 0;
}
démo 20
#i n c l u d e<s t d i o . h>
s t r u c t Point2D {
double x ;
double y ;
};
int main ( ) {
i n t ok = ComparePoint ( p o i n t 1 , p o i n t 2 ) ;
i f ( ok == 1 )
p r i n t f ( ” L e s deux p o i n t s s o n t i d e n t i q u e s ” ) ;
else
p r i n t f ( ” L e s deux p o i n t s s o n t d i f f e r e n t s ” ) ;
return 0;
}
démo 21
#i n c l u d e<s t d i o . h>
s t r u c t Point2D {
double x ;
double y ;
};
int main ( ) {
p r i n t f ( ” \ nAvant : p o i n t 1 (% f ,% f ) , p o i n t 2 (% f ,% f ) ” , p o i n t 1 . x ,
point1 . y , point2 . x , point2 . y) ;
A j o u t e P o i n t (& p o i n t 1 , p o i n t 2 ) ;
p r i n t f ( ” \ n A p r e s : p o i n t 1 (% f ,% f ) , p o i n t 2 (% f ,% f ) \n” , p o i n t 1 . x ,
point1 . y , point2 . x , point2 . y) ;
return 0;
}
#i n c l u d e < s t r i n g . h>
struct a t h l e t e {
int Age ;
char Nom [ 1 5 ] ;
double BestJump ;
};
void main ( ) {
struct a t h l e t e CompetitionSaut [ 1 0 ] ;
C o m p e t i t i o n S a u t [ 0 ] . BestJump = 7.4;
C o m p e t i t i o n S a u t [ 0 ] . Age = 26;
s t r c p y ( C o m p e t i t i o n S a u t [ 0 ] . Nom, ” Durant ” ) ;
}
CompetitionSaut
Structure et
allocation dynamique de mémoire
s t r u c t Point2D ∗ pPt ;
pPt = ( s t r u c t Point2D ∗ ) m a l l o c ( s i z e o f ( s t r u c t Point2D ) ) ;
...
f r e e ( pPt ) ; pPt = NULL ;
Octet
pPt
0x2ab097 x y
s t r u c t Point2D ∗ pTabPt ;
pTabPt = ( s t r u c t Point2D ∗ ) m a l l o c ( c p t ∗ s i z e o f ( s t r u c t Point2D ) ) ;
...
f r e e ( pTabPt ) ;
pTabPt = NULL ;
Octet
pTabPt
0x2ab097 x y x y x y
démo 23
ë Queue ou file d’attente : Liste FIFO ¿ First In, First Out À
(Ex : File d’attente à un guichet)
ë Pile : Liste LIFO ¿ Last In, First Out À
ë Listes circulaires
ë Listes symétriques
Les fichiers
ý Rangement des fichiers : Le système de répertoires est un outil de
classement organisé sous forme arborescente :
ë Il existe un répertoire racine (root) à partir duquel s’organise
l’arborescence.
ë Chaque répertoire (à l’exception du répertoire racine) possède
un répertoire père.
ë Un répertoire peut contenir à la fois des fichiers et d’autres
répertoires (qui sont ses répertoires fils).
ë L’organisation sous forme de répertoires permet de positionner
les différents fichiers du disque. La position d’un fichier au sein
de l’arborescence est donnée par un chemin (path) qui part de
la racine jusqu’au répertoire contenant le fichier.
ý Descripteurs pré-définis :
ë stdin : flux d’entrée standard
ë stdout : flux de sortie standard
ë stderr : flux de sortie des messages d’erreur
do {
fprintf ( s t d o u t , ” V o u l e z vous c o n t i n u e r ( o /n ) ?\ n” ) ;
f s c a n f ( s t d i n , ” %c ” , &r e p ) ;
} while ( r e p== ’ o ’ ) ;
Est équivalent à :
do {
p r i n t f ( ” V o u l e z vous c o n t i n u e r ( o /n ) ?\ n” ) ;
s c a n f ( ” %c ” , &r e p ) ;
} while ( r e p== ’ o ’ ) ;
ý Exemple récapitulatif :
#include<s t d i o . h>
i n t main ( ) {
FILE ∗ f ;
char p ;
f = fopen ( ” texte . txt ” , ” r ” ) ;
if ( f==NULL) {
printf (” Impossible d ’ ouvrir ! \n” ) ;
exit (0) ;
}
while ( f e o f ( f ) ==0){
f s c a n f ( f , ”%c ” , &p ) ;
p r i n t f ( ”%c ” , p ) ;
}
fclose ( f ) ;
}
par caractère :
ë int fgetc(FILE* f) : Lecture d’un caractère à partir du
fichier pointé par f. Ex : char c = fgetc(ficIn) ;.
ë int fputc(char c, FILE* f) : Écrit le caractère c dans le
fichier pointé par f. Ex : char c = ’o’ ; fputc(c,
ficIn) ;.
par ligne :
ë char* fgets(char* ch, int n, FILE* f) : Lecture de
n-1 caractères sur le fichier pointé par f. Les caractères lus
sont rangés dans ch.
ë int fputs(char* ch, FILE* f) : Écrit la chaı̂ne de
caractères ch dans le fichier pointé par f.
FILE∗ f i c I n = f o p e n ( ” . . \ o r i g i n a l . t x t ” , ” r ” ) ;
i f ( f i c I n == NULL) e x i t ( 0 ) ;
FILE∗ f i c O u t = f o p e n ( ” . \ temp\ c o p i e . t x t ” , ”w” ) ;
i f ( f i c O u t == NULL) e x i t ( 0 ) ;
while ( f e o f ( f i c I n ) == 0 ) {
c = fgetc ( ficIn ) ;
fputc (c , ficOut ) ;
}
fclose ( ficIn ) ;
f c l o s e ( ficOut ) ;
}
ë Écriture :
int fwrite(void* p, int s, int nb, FILE* f) ;.
Cette fonction transfert, vers le fichier associé à f, nb éléments
de taille s octets et dont le type est celui de *p. La fonction
retourne le nombre d’octets écrits.
Exemple :
char mot [ 2 0 ] = ” Bonjour ” ;
f w r i t e ( mot , 1 , s t r l e n ( mot ) , g ) ;
#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>
struct i n d i v i d u {
char nom [ 1 5 ] ;
int age ;
};
void main ( ) {
struct i n d i v i d u e l e v e ;
int t a i l l e = si z e o f ( struct individu ) ;
FILE∗ f i c I n = f o p e n ( ” c : \ \ temp \\ o r i g i n a l . b i n ” , ” r b ” ) ;
i f ( f i c I n == NULL) e x i t ( 0 ) ;
FILE∗ f i c O u t = f o p e n ( ” c : \ \ temp \\ c o p i e . b i n ” , ”wb” ) ;
i f ( f i c O u t == NULL) e x i t ( 0 ) ;
// B o u c l e de r e c o p i e
while ( f e o f ( f i c I n ) == 0 ) {
f r e a d (& e l e v e , t a i l l e , 1 , ficIn ) ;
f w r i t e (& e l e v e , t a i l l e , 1 , ficOut ) ;
}
fclose ( ficIn ) ;
f c l o s e ( ficOut ) ;
}
ý Exemple
#include ” s t d i o . h”
p r i n t f ( ” \nNombre d ’ arguments : %d : \ n” , a r g c ) ;
f o r ( i =0; i <a r g c ; i ++)
printf (” Arg #%d : %s \n” , i , argv [ i ] ) ;
}
démo 25
Pointeur de fonction
ý Pointeur pointant vers une fonction (et non plus sur un nombre) !
Il s’agit donc d’une variable qui peut contenir l’adresse d’une
fonction.
void AjouteUn ( i n t ∗x ) {
∗x += 1 ;
}
void ( ∗ i n c ) ( i n t ∗ z ) ; // d é c l a r a t i o n
i n c = AjouteUn ; // i n i t i a l i s a t i o n
int a = 1 0 ;
i n c (&a ) ; // i n c ré m e n t e a de 1
ý Exemple
i n t main ( ) {
int f;
p r i n t f ( ” \ n Q u e l l e f o n c t i o n ( 1 ou 2 ) : ” ) ; s c a n f ( ”%d” , &f ) ;
double ( ∗ p f c t ) ( double z ) ;
if ( f ==1)
pfct = fct 1 ;
else
pfct = fct 2 ;
p r i n t f ( ” \n f c t (% l f ) = % l f ” , 9 . 0 , pfct (9.0) ) ;
p r i n t f ( ” \n f c t (% l f ) = % l f ” , 1 2 . 0 , p f c t ( 1 2 . 0 ) ) ;
return 0 ;
}
Les énumérations
ý Sert à définir des variables entières qui ne peuvent prendre que certaines
valeurs précises :
ý Exemple
enum c o l o r { n o i r , bl eu , v e r t , cyan , rouge , magenta , b l a n c } ;
typedef enum c o l o r c o u l e u r ;
c o u l e u r c1 = magenta ;
p r i n t f ( ” \ nCouleur = %d” , c1 ) ; // a f f i c h e 5
ý Remarques :
ë Les type sont soit int (équiv. signed int), soit unsigned int.
ë Ils peuvent entraı̂ner des problèmes de portabilité entre
machines (¿ Low Indian À et ¿ Big Indian À)
FIN