Vous êtes sur la page 1sur 106

Facult des sciences

EAI

Langage C
Benayad NSIRI

Bibliographie : support de cours A.Thpaut & P.Geffroy, ENST Bretagne


Universit Hassan II An Chock 1 Benayad NSIRI

Facult des sciences

EAI

Pourquoi le langage C ?
Langage incontournable dans de nombreux domaines : logiciels temps rel, embarqus, systme dexploitation (linux), etc.

But du module : matriser le langage connatre quelques outils associs mise en vidence des points forts et des faiblesses du langage insister sur les aspects dlicats

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Historique
Premire dition du langage C en 1978

Les auteurs (B. Kernighan, D. Ritchie) ont souhait respecter quelques caractristiques :
faire confiance au programmeur

conserver une syntaxe simple et concise


ISO 9899 C (norme C ANSI ou C ISO)

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Quelques caractristiques
Quelques caractristiques : Pas de bibliothque obligatoire mais des bibliothques standard. Un programme contrlant une lave-vaisselle n'a pas besoin de la fonction printf. Programmes portables (en C il n y a que des programmes ports !!!) assembleur de haut niveau (pour criture de pilotes, ) absence de bibliothque dexcution (runtime) ce qui est excut est le code que lon a crit et rien dautre possibilit davoir un contrle fin sur ce qui sexcute

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Les mots rservs

auto const double float int short struct unsigned

break continue else for long signed switch void

case default enum goto register sizeof typedef volatile

char do extern if return static union while

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Structure d'un programme C

Un programme C est constitu d un ou plusieurs fichiers comprenant des :

dclarations ou dfinitions de fonctions,

une ou plusieurs fonctions


structure en rteau une et une seule fonction main()

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Structuration en fichiers
Il est dusage de respecter lordre suivant :
inclusion de fichiers d'en-tte (fichiers avec extension .h) dfinition des directives du prprocesseur, dfinition des types, dfinition des variables globales dclaration des fonctions dfinition des fonctions.
Universit Hassan II An Chock 7 Benayad NSIRI

Facult des sciences

EAI

Les types de base (ou prdfinis)


Les types entiers
{[ signed | unsigned ]}{ [short ]|[ long ]} int

signed char signed short signed int signed long

short int i= -1 ; int j= 89 ; long int k= +123 ; char reponse = O ; char buffer = 0x0A ; codage des entiers (dpend de la machine et du
compilateur)

machine / OS PC / linux DEC / Alpha

char 1 1

short int 2 4 2 4
8

long 4 8
Benayad NSIRI

Universit Hassan II An Chock

Facult des sciences

EAI

Les types de base (suite)


Les nombres flottants (voir float.h ou limits.h.) float double long double float pi = 3.14 ; double somme = +0.00345e+6 ; codage des flottants :
machine / OS PC / linux PC / Windows float 4 8 double 8 8 long double 12 12

le type void (codage des procdures) void affiche();

Universit Hassan II An Chock

Benayad NSIRI

Facult des sciences

EAI

Dclaration d "objets "


Syntaxe: [const] type var1, var2, ..., varn;

int un_nombre, mon_entier, i; int compteur = 100; char reponse; float un_reel, x, y; const int max = 20;

Dfinition de type:
typedef int LARGEUR ;
/* une LARGEUR est code par un entier*/

Universit Hassan II An Chock

10

Benayad NSIRI

Facult des sciences

EAI

Les fonctions
Dclaration (spcification) d'une fonction : type_rendu nom(dclaration ou type des paramtres); int add(int i, int j); int add(int, int); Dfinition (corps) d'une fonction: type_rendu nom(dclaration des paramtres) instruction compose instruction compose: { dclarations d'objets locaux instructions simples instructions composes } instruction simple: expression;

Universit Hassan II An Chock

11

Benayad NSIRI

Facult des sciences

EAI

Un premier programme simple


simple.c int main( ) /* prconis pour gcc */ /*ou int main(void) ou main() */ { printf("notre premier programme C\n");

}
Compilation pour gnrer un fichier excutable a.out: % cc simple.c ou % gcc [-Wall] [-g] [-o simple] simple.c A l'excution nous obtenons : % simple notre premier programme C % /* Commentez vos fonctions : rle, arguments attendus, valeur rendue, etc. */
Universit Hassan II An Chock 12 Benayad NSIRI

Facult des sciences

EAI

Programme avec appel de fonction


void affiche(int nombre, float reel) { printf("l'entier vaut %d, le reel vaut %f \n", nombre, reel); } int main( ) { int un_entier; float un_reel; un_entier = 10; un_reel = 2.7; affiche(un_entier, un_reel); }

A l'excution nous obtenons :


l'entier vaut 10, le reel vaut 2.7
Universit Hassan II An Chock 13 Benayad NSIRI

Facult des sciences

EAI

Programme avec appel de fonction


void affiche(int nombre, float reel) ;

int main( ) { int un_entier; float un_reel; un_entier = 10; un_reel = 2.7; affiche(un_entier, un_reel); } void affiche(int nombre, float reel) { printf("l'entier vaut %d, le reel vaut %f \n", nombre, reel); }

Universit Hassan II An Chock

14

Benayad NSIRI

Facult des sciences

EAI

Instruction conditionnelle "if"


syntaxe : if(expression) instruction simple ou compose if(expression) instruction simple ou compose else instruction simple ou compose exemple :

if (nombre == 0) printf("votre nombre est nul\n"); else { printf("le nombre que vous\n"); printf("avez rentre vaut %d\n", nombre); }
Universit Hassan II An Chock 15 Benayad NSIRI

Facult des sciences

EAI

Instruction d'aiguillage "switch"


syntaxe : switch (expression) { case constante1: instructions simples ou instruction compose break; case constante2: instructions simples ou instruction compose break; case constante3: instructions simples ou instruction compose break;

case ...
default: instruction simple ou compose }
Universit Hassan II An Chock 16 Benayad NSIRI

Facult des sciences

EAI

"switch" (exemple)
/* Fonction qui teste si un caractere est une voyelle */

int voyelle (char caractere)


{switch (caractere) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': return (1); default: return (0); } }

Universit Hassan II An Chock

17

Benayad NSIRI

Facult des sciences

EAI

Instruction rptitive : le "while"


syntaxe : while (condition) instruction simple ou compose

exemple :
while (i > 0) { ... i--; ... } } while (i - -) { ... ... ...

Les deux constructions ci-dessus sont quivalentes

Universit Hassan II An Chock

18

Benayad NSIRI

Facult des sciences

EAI

Instruction rptitive : le "do while"


syntaxe : do instruction simple ou compose while (condition) exemple : /* test de divisibilit par trois */ int main( ) { int nombre; do { printf("entrez un nombre divisible par 3 \n "); scanf(" %d ", &nombre); if(nombre % 3 == 0) printf("c'est correct, termine !!\n"); else printf("erreur, essayez encore \n"); } while ( nombre % 3 != 0); }
Universit Hassan II An Chock 19 Benayad NSIRI

Facult des sciences

EAI

Instruction rptitive : le "for"


syntaxe : for (initialisation; condition; progression) instruction simple ou compose

exemple : for ( i = 1 ; i < 100 ; i ++) printf ("i = %d, i **2 = %d \n", i, i * i);

Universit Hassan II An Chock

20

Benayad NSIRI

Facult des sciences

EAI

L'instruction "return"
return; La fonction s'interrompt et rend la main la fonction appelante

return expression; permet de renvoyer la valeur de l'expression la fonction appelante et rend la main la fonction appelante

int add(int i, int j) { return i + j ; } main() {....... resu = add (7,16); }


Universit Hassan II An Chock 21 Benayad NSIRI

Facult des sciences

EAI

Exemple
Entrez une suite de nombres >0, suite termine par 0 et affichez le plus petit et le plus grand void affiche(int min, int max) { printf("le plus petit est %d et le plus grand est %d\n", min, max); } int main( ) { int nombre_lu, le_min, le_max; printf("Entrez une suite ...\n"); scanf("%d", &nombre_lu); le_min = nombre_lu; le_max = nombre_lu; while (nombre_lu != 0) { if (le_min > nombre_lu) le_min = nombre_lu; else if (le_max < nombre_lu) le_max = nombre_lu; scanf("%d", &nombre_lu); } affiche (le_min, le_max); }
Universit Hassan II An Chock 22 Benayad NSIRI

Facult des sciences

EAI

Les oprateurs
Arithmtiques : + - * / % Unaires : ++ - Logiques : ! Bit bit : ~
(nexiste pas en Java)

&

&&

||

(pas de boolen en C)

| & ^ <<

>>

Relationnels : == != < <= > >=

Universit Hassan II An Chock

23

Benayad NSIRI

Facult des sciences

EAI

Les sorties formates


syntaxe: printf(" formats ", var1,,varn); Le format d une variable s indique derrire un % %d -> en dcimal sign %u -> en dcimal non sign %o -> en octal %x -> en hexadcimal %f -> rel sans exposant %1.2f -> rel sans exposant %e -> rel avec exposant %c -> un caractre %s -> chane de caractres

Universit Hassan II An Chock

24

Benayad NSIRI

Facult des sciences

EAI

Les entres formates


syntaxe: scanf( formats , &var1,,&varn);

Exemple: int i; float x; printf(" entrez un entier dcimal et un reel\n "); scanf(" %d%f ",&i, &x);

Universit Hassan II An Chock

25

Benayad NSIRI

Facult des sciences

EAI

Les pointeurs
Un pointeur est un objet pouvant contenir l'adresse d'une variable. Sa dclaration se fait avec l'oprateur * et le type de l'objet point. L'oprateur * plac devant un pointeur permet d'accder la variable pointe. L'oprateur & donne l'adresse d'une variable. &i reprsente l'adresse de la variable i.
int *pentier, nombre ;

pentier

nombre

pentier = &nombre ;

pentier

nombre

*pentier = 4 ; 4
pentier nombre

Universit Hassan II An Chock

26

Benayad NSIRI

Facult des sciences

EAI

Les pointeurs (suite)


int *px; char *pchar; /* px est un pointeur d'entiers */ /* pchar est un pointeur de caractres*/

pchar et px sont des pointeurs de types diffrents, ils ne pourront donc pas tre directement affects l'un l'autre.

Pour raliser cette opration, il faut utiliser une conversion explicite de type (cast) :

pchar = px; pchar = (char *) px;

/* interdit */ /* le pointeur px est converti en un pointeur de char */

Universit Hassan II An Chock

27

Benayad NSIRI

Facult des sciences

EAI

Affectation des pointeurs


Soit la dclaration :
int x, y, *ptr_x, *ptr_y ;

ptr_x

ptr_y

x = 5; y = 9; ptr_x = &x; ptr_y = &y;

5 x ptr_x

9
y ptr_y

Ne pas confondre :
ptr_y = ptr_x;
ptr_y 5 ptr_x

Avec :
*ptr_y = *ptr_x;
5 ptr_x

5 ptr_y

Universit Hassan II An Chock

28

Benayad NSIRI

Facult des sciences

EAI

Les tableaux
Un tableau en C est caractris par 4 lments : son nom le type des lments qu'il contient sa dimension sa classe d'allocation Contrairement Java, un tableau en C ne connat pas sa taille Ce qui va occasionner des problmes de dbordement et des comportements imprvisibles.. Dclaration et cration d'un tableau: int tabint[10]; char tabcar[20];

Universit Hassan II An Chock

29

Benayad NSIRI

Facult des sciences

EAI

initialisation d'un tableau


int tabpair[5] = { 2, 4, 6, 8, 10 }; char tabcar[] = { 'a', 'b', 'c', 'd', 'e' };

Accs un lment d'un tableau (les indices sont des entiers dbutant 0) tabpair[2] = 22; tabcar[0] = 'x'; if (tabpair[3] = = 8) ...

Universit Hassan II An Chock

30

Benayad NSIRI

Facult des sciences

EAI

Remplissage d'un tableau


int main( )

{
int tab[20], i; printf ("entrez 20 nombres\n"); for (i = 0; i < 20; i++)

scanf("%d", &tab[i]);
printf ("voici les nombres que vous avez entrs \n"); for (i = 0; i < 20; i++)

printf (" tab[%d] = %d \n", i, tab[i] );


}

Universit Hassan II An Chock

31

Benayad NSIRI

Facult des sciences

EAI

Les tableaux multidimensionnels


En ralit cest un tableau de tableaux int b[5] [3] ; int c[10][10][10] ; col 1 b[0][0] b[1][0] b[2][0] b[3][0] b[4][0] col2 b[0][1] b[1][1] b[2][1] b[3][1] b[4][1] col3 b[0][2] b[1][2] b[2][2] b[3][2] b[4][2]

ligne 1 ligne 2 ligne 3 ligne 4 ligne 5

Universit Hassan II An Chock

32

Benayad NSIRI

Facult des sciences

EAI

Les tableaux et les pointeurs


int tab[3] = {12,30,5}; le nom du tableau tab est une constante de type pointeur dsignant l'adresse du premier lment du tableau tab est quivalent &tab[0] tab[i] est quivalent *(tab + i)

tab

tab[0] 12 tab[1] 30 5

0 1 2

Universit Hassan II An Chock

33

Benayad NSIRI

Facult des sciences

EAI

Les chanes de caractres


Une chane de caractres est un tableau de caractres dont le dernier caractre est '\0' char message[8] = "bonjour"; ou char message[ ] = "bonjour"; ou char message [8] = { b', o' ,n , j , o', u', r', '\0'};
message 'b' 'o' 'n' 'j' 'o' 'u' 'r' '\0'

char *chaine = "bonsoir";


'b' 'o' 'n' 's' 'o' 'i' chaine 'r' '\0'

chaine = "salut";
s' a' l'

u' t' \0'

Une chane peut tre lue par scanf scanf("%s", message); ou crite par printf printf("%s", message);
Universit Hassan II An Chock 34 Benayad NSIRI

Facult des sciences

EAI

Affectation de chanes de caractres


char *message1 = "bonjour"; char *message2;
'b' 'o' 'n' 'j' 'o' 'u' 'r' '\0'

message1

message2

message2 = message1;
'b' 'o' 'n' 'j' 'o' 'u' 'r' '\0' message1

message2

char chaine1[8] = "bonjour"; char chaine2[8]; chaine2 = chaine1; /* sera refuse par le compilateur chaine1 et chaine2 tant des constantes.*/ Pour une copie "profonde", il faut utiliser la fonction strcpy :
char *strcpy(char *arrivee, char * depart);
Universit Hassan II An Chock 35 Benayad NSIRI

Facult des sciences

EAI

Copie d'une chane de caractres


Utilisation de tableaux : void strcpy(char d[] , const char s[]) { int i; i = 0; while ((d[i] = s[i]) != '\0') i++; }

Utilisation de pointeurs : void strcpy(char *d ,const char * s) { while ((*d++ = *s++) != '\0'); }

En C, le passage des paramtres tableaux s'effectue par adresse, contrairement aux autres types (passage par valeur).
Universit Hassan II An Chock 36 Benayad NSIRI

Facult des sciences

EAI

Dautres fonctions de la bibliothque <string.h>


char *strcat(char*s,char*ct) ; concatne la chane ct la suite de la chane s ; retourne s int strcmp(char*cs, char*ct) ; compare la chane cs la chaine ct retourne val <0 si cs<ct val = 0 si cs==ct val >0 si cs >ct int strlen(char * cs) ; retourne la longueur de cs

Exmple: char *tableau; char *tab; tableau="aa aabcccvhjjgjlfkkghlkj"; tab=(char*)malloc(strlen(tableau)); strcpy(tab,tableau);


Universit Hassan II An Chock 37 Benayad NSIRI

Facult des sciences

EAI

Cours 2

Universit Hassan II An Chock

38

Benayad NSIRI

Facult des sciences

EAI

L'allocation dynamique de mmoire


La fonction C malloc retourne l'adresse de l' espace mmoire rserv de size octets: void *malloc(size_t size); Le type void * est le type pointeur gnrique, c'est dire capable de pointer vers n'importe quel type d'objet
int *pentier;

pentier

pentier = (int *) malloc ( sizeof (int) );

pentier

*pentier = 4; 4
pentier

rappel : (int *) permet de convertir void * en un pointeur sur un entier ; char caractere= a ; int i= 1; caractere =caractere + (char) i;

Universit Hassan II An Chock

39

Benayad NSIRI

Facult des sciences

EAI

Oprations sur les pointeurs


Addition avec un entier i: pentier = pentier + i; incrmente pentier non pas de i, mais de i * sizeof (*pentier), pentier pointe sur le ime entier suivant.

pentier = malloc ( 3 * sizeof (int) ); *pentier = 4; *(pentier + 1) = 5; *(pentier + 2) = 6;

4
pentier

Universit Hassan II An Chock

40

Benayad NSIRI

Facult des sciences

EAI

Oprations sur les pointeurs (suite)


L'affectation

px = py;

px contient la mme adresse que py

Ne pas confondre avec

*px = *py;

qui recopie l'objet point par py dans l'objet point par px

Universit Hassan II An Chock

41

Benayad NSIRI

Facult des sciences

EAI

Oprations sur les pointeurs (suite)


La soustraction entre deux pointeurs de

mme type donne un rsultat entier (nombre


d'lments possibles entre les deux adresses). L'addition est interdite. px taille = py - px;

py

La comparaison de deux pointeurs est possible avec == != < <= > >=

Universit Hassan II An Chock

42

Benayad NSIRI

Facult des sciences

EAI

Les tableaux et les pointeurs


Allocation dynamique d'un tableau avec calloc : void *calloc(size_t nb, size_t size); int *ptab, i; /* ptab est ici une variable*/ ptab = calloc (10, sizeof (int)); for( i= 0; i < 10; i++) *(ptab + i) = 2; /* ou bien ptab[i] = 2; */ On libre l'espace allou par malloc ou calloc au moyen de la procdure free qui admet un seul paramtre : un pointeur prcdemment rendu par un appel malloc ou calloc. int * p; p = malloc(sizeof(int)); ... /* utilisation de la mmoire alloue */ free(p);
Universit Hassan II An Chock 43 Benayad NSIRI

Facult des sciences

EAI

Les pointeurs de fonctions


Possibilit de dfinir des pointeurs de fonctions que l'on peut passer en argument des fonctions int plus(int a, int b) { return a + b ; } Indication de passage de l adresse d une int moins(int a, int b) { return a - b ; } fonction

int plus_ou_moins(int a, int b, int (* oper) (int , int )) { return oper (a , b ) ; }

Paramtre effectif main ( ) En C, le nom d une { Paramtre formel : opr est un pointeur sur unefonction est un fonction int i, somme, diff; pointeur qui ("Rentrez deux nombres \n"); printfadmet 2 entiers et retourne 1 entier [remplac pardu paramtre formel Remplacement plus] scanf("%d %d", &i, &j); oper par paramtre effectif : somme = plus_ou_moins(i, j, plus); plus_ou_moins() ramne diff = plus_ou_moins(i, j, moins); return plus(a,b) printf ("La somme est gale %d \n", somme); printf ("La diffrence est gale %d \n", diff); }

Universit Hassan II An Chock

44

Benayad NSIRI

Facult des sciences

EAI

Les tableaux de pointeurs


On peut stocker des pointeurs dans un tableau :
char *tableau[max_elements];

tableau

tableau[0]

s u j o u r q

max_lments

tableau[0] est un pointeur sur le caractre "s" *tableau[0] vaut "s" *(tableau[0] + 1) vaut "u"

Universit Hassan II An Chock

45

Benayad NSIRI

Facult des sciences

EAI

Paramtres de la ligne de commande


Possibilit de passer des arguments de la ligne de commande la fonction principale main( )

int main (int argc, char *argv[ ]) Public static void main (String args[ ]) -- en Java

- Les noms argc et argv sont des noms traditionnels qui peuvent tre remplacs par n'importe quels autres noms (seuls les types doivent tre respects). argc (argument count), reprsente le nombre de mots de la ligne de commande ; argv (argument values) est l'adresse d'une table de pointeurs ; ces pointeurs pointent sur chaque mot de la ligne de commande.

Universit Hassan II An Chock

46

Benayad NSIRI

Facult des sciences

EAI

Exemple
Par exemple le lancement du programme : cp fichier1 fichier2 initialisera les arguments argc et argv comme ci-dessous : argc = 3 argv
Pointeur commande
Pointeur argument 1 Pointeur argument 2 Pointeur argument n

cp fichier1 fichier2

argv[0] pointe sur le nom de lexcutable.

En Java argv[0] dsigne le premier paramtre

Universit Hassan II An Chock

47

Benayad NSIRI

Facult des sciences

EAI

Passage de paramtres une fonction


En C tous les paramtres des fonctions sont passs par valeur. La fonction appele ne possde pas de moyen direct de modifier les variables de la fonction appelante. void echange( int pi, int pj) : /* attention */ { /* ne fonctionne pas ! */ int tempo; tempo = pi; pi = pj; pj = tempo; } echange (x,y); La fonction echange ne peut changer les arguments x et y du programme appelant car elle travaille sur des copies de x et y. Pour obtenir le fonctionnement souhait, la fonction appelante doit passer l'adresse des variables devant tre modifies.
Universit Hassan II An Chock 48 Benayad NSIRI

Facult des sciences

EAI

Passage des paramtres par valeur


En C tous les paramtres sont passs par valeur. void func (char car) { putchar(car); car = 'b'; putchar(car); } main() { char caract = 'a'; func(caract); putchar(caract); }

A l'excution nous obtenons : aba

Universit Hassan II An Chock

49

Benayad NSIRI

Facult des sciences

EAI

Passage des paramtres


main() { char caract = 'a'; func(caract); putchar(caract); } void func (char car) { }

Etape N1 Etape N2

car

'a' ...Contexte...

caract

'a' Allocation de la var. caract de la fonction main() Appel de func(caract) allocation de car copie de la valeur de caract

Universit Hassan II An Chock

50

Benayad NSIRI

Facult des sciences

EAI

Passage des paramtres


main() void func (char car) { { char caract = 'a'; putchar(car); func(caract); car = 'b'; putchar(caract); putchar(car); EtapeN 4 N3 Etape } }

car

b' ...Contexte...

caract

'a' Excution de l'instruction car = 'b' ; la modification Fin de la fonction func, a lieu dans la variable locale et retour la fonction la fonction (registre ou pile appelante main(), d excution) dans laquelle caract n'a pas t modifi

Universit Hassan II An Chock

51

Benayad NSIRI

Facult des sciences

EAI

Adresse d'une variable en paramtre


Pour pouvoir modifier la valeur d'une variable dans une fonction appelante, il faut passer l'adresse de cette variable en paramtre la fonction appele. void echange( int *pi, int *pj) { int tempo; tempo = *pi; *pi = *pj; *pj = tempo; } main() { int i, j; i = 10; j = 15; echange(&i, &j); printf("i = %d, j = %d\n", i, j); } L'excution donne : i = 15, j = 10
Universit Hassan II An Chock 52 Benayad NSIRI

Facult des sciences

EAI

Passage de l'adresse des variables


main() { int i, j; i = 10; j = 15; echange(&i, &j); printf("i = %d, j = %d\n", i, j); }

Etape N 1 : 1 5 10 j i

Allocation des variables


Universit Hassan II An Chock 53 Benayad NSIRI

Facult des sciences

EAI

Passage de l'adresse des variables


void echange( int *pi, int *pj) main() { { int tempo; int i, j; tempo = *pi; i = 10; *pi = *pj; j = 15; *pj = tempo; echange(&i, &j); printf("i = %d, j = %d\n", i, j); } } Etape N 2 : tempo &j &i 1 5 10 pj pi j i

Appel de la fonction echange ; allocation de pi et pj et copie de &i et &j allocation de tempo


Universit Hassan II An Chock 54 Benayad NSIRI

Facult des sciences

EAI

Passage de l'adresse des variables


void echange( int *pi, int *pj) main() { { int tempo; int i, j; tempo = *pi; i = 10; *pi = *pj; j = 15; *pj = tempo; echange(&i, &j); printf("i = %d, j = %d\n", i, j); } } Etape N 3 10 &j &i 1 5 10 tempo pj pi j i

Excution de tempo = *pi ; affectation de 10 tempo


Universit Hassan II An Chock 55 Benayad NSIRI

Facult des sciences

EAI

Passage de l'adresse des variables


void echange( int *pi, int *pj) main() { { int tempo; int i, j; tempo = *pi; i = 10; *pi = *pj; j = 15; *pj = tempo; echange(&i, &j); } printf("i = %d, j = %d\n", i, j); } Etape N 4 10 &j tempo pj

&i
1 0 15

pi
j i

Excution de *pi = *pj Affectation de 15 *pi (cad i = 15) et *pj = tempo (cad j = 10)
Universit Hassan II An Chock 56 Benayad NSIRI

Facult des sciences

EAI

Passage de l'adresse des variables


void echange( int *pi, int *pj) main() { { int tempo; int i, j; tempo = *pi; i = 10; *pi = *pj; j = 15; *pj = tempo; echange(&i, &j); printf("i = %d, j = %d\n", i, j); } }

Etape N 5 :

1 0 15

j i

Fin de la fonction echange dsallocation de pi, pj et tempo

Universit Hassan II An Chock

57

Benayad NSIRI

Facult des sciences

EAI

Rcursivit
Ecrire une fonction rcursive calculant n!

n! = 1 pour n =1 n! = n * (n-1)! pour n > 1

int factoriel ( int n)


{ if (n == 1) return 1; else return n * factoriel(n - 1); }

Universit Hassan II An Chock

58

Benayad NSIRI

Facult des sciences

EAI

Les dfinitions de type


Syntaxe: typedef type dclarateur; typedef long Couleur ; donne le nom Couleur au type long Couleur couleur, tableCouleurs[128] ;

Universit Hassan II An Chock

59

Benayad NSIRI

Facult des sciences

EAI

Les numrations
Une numration en C est une suite de constantes symboliques automatiquement transformes en int. enum couleur {ROUGE, BLEU, JAUNE, VERT}; enum couleur tube1, tube2; enum couleur est un nouveau type Les lments de la liste ont des valeurs entires affectes par dfaut partir de 0 ; =>ROUGE = 0, BLEU = 1, ... tube1 = JAUNE; /*quivalent tube1 = 2 */ typedef enum {FAUX, VRAI} Booleen ; Booleen reponse = VRAI ; Intrt de l numration : permet au compilateur de vrifier que les valeurs affectes aux variables appartiennent bien aux lments de l'numration les programmes sont plus lisibles il est d'usage dans le monde UNIX de donner un nom en majuscules aux constantes nommes d'un programme.
Universit Hassan II An Chock 60 Benayad NSIRI

Facult des sciences

EAI

Les structures
Une structure est un moyen de dfinir un nouveau type comprenant plusieurs champs pouvant tre de types diffrents. Diffrents champs Dfinition de type identificateurs

struct l_adresse { int numero; char rue[15]; long codepostal; char ville[15]; }; struct compte{ long numero; char nom[15]; char prenom[15]; Variable de type struct l_adresse adresse; compte } compte1; struct compte compte2, *pcompte;
Universit Hassan II An Chock 61 Benayad NSIRI

Facult des sciences

EAI

nouveau type

Initialisation d'une structure

struct famille { char nom[20]; char prenompere[15]; char prenommere[15]; int nombre_enfants; variable }; struct famille fam_dupont = {"dupont", "luc", "odile", 3}; typedef struct famille Famille; typedef struct { float partie_reelle; float partie_imaginaire; Dfinition de type } Complexe; Complexe c1 = { 4.0, 5.7}; C est le type !

Universit Hassan II An Chock

62

Benayad NSIRI

Facult des sciences

EAI

Accs aux membres d'une structure


L'oprateur . partir d'une variable de type structure :

struct famille fam; /* ou Famille fam; */


strcpy(fam.nom ,"durand"); strcpy(fam.prenompere ,"benoit"); strcpy(fam.prenommere , "sylvie"); ... if (fam.nombre_enfants > 3) printf("c'est une famille nombreuse\n");

L'oprateur -> partir d'un pointeur sur une structure : struct compte *pcompte;

pcompte = malloc (sizeof (struct compte));


pcompte-> numero = 450004; pcompte-> adresse.numero = 5;

Universit Hassan II An Chock

63

Benayad NSIRI

Facult des sciences

EAI

Oprations sur les structures


Il existe trois oprations possibles sur les structures : obtenir l'adresse d'une structure & accder un membre d'une structure . ou -> affecter une structure une autre structure de mme type : struct famille fam1, fam2; ... fam2 = fam1; Par contre il n'est pas possible de comparer deux structures : if (fam1 == fam2) ou if (fam1 != fam2) sont des tests interdits Pour raliser ces tests il faut connatre la topologie exacte de la structure, puis crire la fonction dsire
Universit Hassan II An Chock 64 Benayad NSIRI

Facult des sciences

EAI

Les listes
Une liste d'objets est une suite d'objets de mme type. Une liste chane est un ensemble de cellules, chaque cellule comprenant l'objet lui-mme, mais aussi l'adresse d'une autre cellule. Une variable de type liste contient l'adresse d'une cellule :

struct cellule {
int valeur; struct cellule *suivant; }; typedef struct cellule Cellule;

valeur suivant

Universit Hassan II An Chock

65

Benayad NSIRI

Facult des sciences

EAI

Une liste d'entiers


Cellule * tete; /* ou struct cellule * tete; */

10 tete

76

4 NULL

On peut dfinir le type liste de la manire suivante : typedef struct cellule * Liste ;

/* ou typedef Cellule * Liste ;

*/

Universit Hassan II An Chock

66

Benayad NSIRI

Facult des sciences

EAI

Insertion d'un entier en tte de liste


Liste nouvelle; /* ou struct cellule * nouvelle; */ nouvelle = malloc (sizeof(Cellule)); nouvelle ->valeur = 25;

nouvelle 2 5

Universit Hassan II An Chock

67

Benayad NSIRI

Facult des sciences

EAI

Ajout d'un entier en tte de liste


Liste nouvelle; nouvelle = malloc (sizeof(Cellule)); nouvelle ->valeur = 25; nouvelle ->suivant = tete; tete = nouvelle;
nouvelle

25

10 tete

76

4 NULL

Universit Hassan II An Chock

68

Benayad NSIRI

Facult des sciences

EAI

Cours 3

Universit Hassan II An Chock

69

Benayad NSIRI

Facult des sciences

EAI

Les unions
mme syntaxe que les structures ( part le mot cl union) permet de raliser des enregistrements variants (la variable dfinie peut contenir, des moments diffrents, des objets de type et de taille diffrente. union int-ou-float { int n ; float x ; }; main ( ) { union int-ou-float longueur ; longueur.n = 10 ; printf( "resu entier %d , rsu flottant %f \n " , longueur.n, longueur.x) ; longueur.x = 10.0 ; printf( "resu entier %d , rsu flottant %f \n " , longueur.n, longueur.x) ; } /* resu entier 10 , rsu flottant 0.0000000 */ /* resu entier -17034526 , rsu flottant 10.0 */
Universit Hassan II An Chock 70 Benayad NSIRI

Facult des sciences

EAI

Champs de bits
C est un assembleur. On peut donc manipuler des tranches de bits dans des octets. Il existe des directives de reprsentations permettant de dcrire une structure (ou une union) bit bit.

struct IEEEFloat32 { int signe : 1 ; unsigned int mantisse : 24 ; signed int exposant : 7 ; } /*dfinition d un entier de 32 bits en trois champs */ A manier avec beaucoup de prcautions Ces constructions ne sont pas portables...
Universit Hassan II An Chock 71 Benayad NSIRI

Facult des sciences

EAI

Allocation des variables en mmoire


Un programme C dispose de 4 types de mmoire : statique ou permanente la pile les registres du processeur le tas (allocation dynamique au fur et mesure des besoins avec malloc, calloc ...) Il existe 4 classes d'allocation des variables : externe mot-cl -> extern automatique mot-cl -> auto statique mot-cl -> static registre mot-cl -> register

Exemple de dclarations de variables extern char car; static int nombre = 15; register int i; /* on ne peut pas appliquer & i*/ auto float x; /* peu utilis*/

Universit Hassan II An Chock

72

Benayad NSIRI

Facult des sciences

EAI

Visibilit des variables

variable

visibilit

externe

locale

mmoire permanente pile

registre permanente tas

Universit Hassan II An Chock

73

Benayad NSIRI

Facult des sciences

EAI

Les variables externes


Ce sont des variables globales dfinies dans un fichier et visibles sous cette dfinition. Ces variables sont connues de lditeur de liens et exportables.
main.c module1.c func (float unReel) { } double notreReel ; main ( ) { notreReel = 1.0 ; extern double notreReel ; func1 (float unReel) { }

Objet dj cr un autre fichier extern sert importer une variable Var globale visible aprs sa dfinition

Universit Hassan II An Chock

74

Benayad NSIRI

Facult des sciences

EAI

Les variables statiques


locales : dfinies dans une fonction globales : dfinies dans un fichier ( l extrieur des fonctions) Une variable statique locale garde sa valeur d un appel sur l autre de la fonction ou elle est dfinie
int calcul1 ( ) { int var = 100 ; return var + 10 ; } La fonction calcul1 retournera la valeur 110 chaque appel int calcul2 ( ) { static int var = 100 ; /* intialise une seule fois*/ var = var + 10 ; return var ; } La fonction calcul2 retournera les valeurs 110, 120, 130, etc.
Universit Hassan II An Chock 75 Benayad NSIRI

Facult des sciences

EAI

Les variables statiques locales


long deltatime ( ) { static long avant, flag-debut = 1 ; /* intialise une
fois*/

long delta, maintenant ; if (flag-debut) { flag-debut = 0 ; avant = time (0) ; return (0) ; } else { maintenant = time (0); delta = maintenant - avant ; avant = maintenant ; return ( delta ) ; } } Cette fonction donne le temps entre 2 appels car la variable avant conservera sa valeur.
Universit Hassan II An Chock 76 Benayad NSIRI

Facult des sciences

EAI

Les variables statiques globales


Une variable statique globale est spcifique au fichier o elle est dfinie ; elle nest pas exportable car cache lditeur de liens
main.c int buffer ; /*exportable*/ int func1 ( ) { } Var accessible dans d autres fichiers par : extern int buffer ; externes Var externe module.c static int buffer ; /*masque*/ int func2 ( ) { } Pas de conflits - Variable globale toutes les fonctions de ce fichier. - inaccessible aux autres fichiers Exportables

static

Universit Hassan II An Chock

77

Benayad NSIRI

Facult des sciences

EAI

Initialisation des variables


Linitialisation des variables varie selon la classe d'allocation : classe externe et statique : peut tre ralis directement par le compilateur au moment de la dclaration des variables

classe automatique et registre a lieu chaque excution de la fonction ; par dfaut elles sont indfinies avant leur utilisation

Dans tous les cas de figure, il est prfrable d'initialiser toutes les variables.

Universit Hassan II An Chock

78

Benayad NSIRI

Facult des sciences

EAI

Les phases de la compilation


fic.c Prtraitement gcc -E fic.e Compilation gcc -S fic.s Assembleur gcc -c Optimiseur gcc - O
Traitement textuel : suppression des caractres inutiles, commentaires, traitement directives traitement macros Traduit le source en langage mnmonique

Traduit mnmonique en fichier objet

fic.o
Rsout les problmes de rfrences croises, relie les modules objet avec les librairies pour faire un excutable, etc. 79 Benayad NSIRI

Edition de liens ld a.out


Universit Hassan II An Chock

Facult des sciences

EAI

Le prtraitement
Le prprocesseur (cpp) va traiter les directives (#) : definition et expansion des pseudofonction (macros)
#define MAX 10

L option gcc -E fichier.c permet de visualiser le rsultat du prtraitement


inclusion de fichiers
#include <math.h>

compilation conditionnelle
#ifdef MAX

Universit Hassan II An Chock

80

Benayad NSIRI

Facult des sciences

EAI

Traitement des macros


Macros sans paramtres :
#define NB_LIGNES 24 #define NB_COLONNES 80 #define TAILLE_TAB NB_LIGNES * NB_COLONNES

Macros sans paramtres dfinies lappel du compilateur (-D) :


cc -DNB_LIGNES=48 fichier.c

Universit Hassan II An Chock

81

Benayad NSIRI

Facult des sciences

EAI

Macros avec paramtre


souvent utilises avec oprateur conditionnel #define fabs(x) (( x > 0) ? (x) : (- x)) /* on rend valeur absolue*/

#define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) main( ) { int i,j,k; i = min(j,k); /* quivalent : i = j < k ? j : k ; */ i = max(j,k); /* quivalent : i = j < k ? k : j ; */ }

Universit Hassan II An Chock

82

Benayad NSIRI

Facult des sciences

EAI

Usage dlicat
Attention aux erreurs difficiles dceler : Si le caractre qui suit le nom de la macro est une parenthse ouvrante alors macro avec paramtres Sinon macro sans paramtre Donc sil y a un blanc avant la parenthse alors macro sans paramtre

Exemple 1
#define CARRE (a) a * a

CARRE(2) /*aura comme expansion (a) a * a(2)*/

Exemple 2
#define CARRE(a) a * a CARRE(a+b) /*aura comme expansion : a+b * a+b */ CARRE(2) /*aura comme expansion : 2 * 2
Universit Hassan II An Chock

*/

83

Benayad NSIRI

Facult des sciences

EAI

Rgles respecter
Rgle 1 : parenthser les occurrences des paramtres formels Rgle 2 : parenthser le corps complet de la macro.

Une dfinition de CARRE deviendrait :

#define CARRE(a) ((a) * (a)) CARRE(a+b) /*aura comme expansion ((a+b) * (a+b)) */ CARRE(2) /*aura comme expansion : ((2) * (2)) */

Universit Hassan II An Chock

84

Benayad NSIRI

Facult des sciences

EAI

Inclusion de fichiers
#include " nom-de-fichier " #include < nom-de-fichier > cpp remplace cette ligne par le contenu du fichier nom-de-fichier. si on utilise ", le fichier inclure est un fichier utilisateur, il sera donc recherch dans l'espace de fichiers de l'utilisateur (rpertoire courant sous Unix). si on utilise < et >, le fichier est un fichier systme, il sera recherch dans un ou plusieurs espaces de fichiers systmes (/usr/lib/include sous Unix)

Universit Hassan II An Chock

85

Benayad NSIRI

Facult des sciences

EAI

Compilation conditionnelle
Il existe 5 directives de compilation conditionnelle : if, ifdef, ifndef, else, endif Ces directives permettent : - dviter les inclusions multiples, - de tester lexistence des pseudo constantes. Le prprocesseur analysera le rsultat de ces tests pour conserver ou supprimer des lignes du fichier source

Exemple pour viter les multiples dfinitions :


#ifndef VRAI #define VRAI 1 #define FAUX 0 #endif /*VRAI*/ Test et annulation d une dfinition #ifdef MAX #undef MAX #endif /* MAX */ #define MAX 20
Universit Hassan II An Chock 86 Benayad NSIRI

Facult des sciences

EAI

Mise au point de programmes


La compilation conditionnelle permet la gnration automatique dinstructions de mise au point. #ifdef DEBUG

printf( "taille du tableau: %d ",taille) ;


#endif /*DEBUG*/ Le symbole DEBUG sera dfini dans un fichier dentte #define DEBUG

ou encore mieux au moment de la compilation grce l option -D gcc -DDEBUG principale.c module1.c

Rappel : on peut faire aussi gcc -DMAX=30 mainc.c quivalent : #define MAX 30
Universit Hassan II An Chock 87 Benayad NSIRI

Facult des sciences

EAI

Compilation spare
Afin de structurer une application il ne faut pas hsiter la partitionner en plusieurs fichiers (fichier1.c, fichier2.c, ...) Ce fichiers seront compils indpendamment afin de ne pas recompiler toute l application chaque fois. Loption -c permet d obtenir des fichiers relogeables (.o) Les fichiers .o seront lis par lditeur de liens qui compltera les rfrences manquantes gcc -c fichier1.c -> cration de fichier1.o gcc -c fichier2.c -> cration de fichier2.o .... gcc -o fic fichier1.o fichier2.o ... -> dition de liens et cration d'un fichier excutable nomm fic
Universit Hassan II An Chock 88 Benayad NSIRI

Facult des sciences

EAI

Loutil Make
Permet la gestion des divers fichiers en vitant les compilations inutiles. La commande make excute les commandes crites dans le fichier Makefile. cible : liste_de_fichiers <TAB>commandes de mise jour <CR>

leprog.c main() { opere(); cherche(); insere(); } operation.c void opere(void) { moins(); divise(); } divise.c void moins(void) void divise(void) {...... {...... ...... ...... ...... ...... } } soustrait.c recherche.c void cherche(void) { ..... tri(); } tri.c void tri(void) {...... ...... ...... } insertion.c void insere(void) { en_ordre(); en_tete(); }

debut.c ordre.c void en_ordre(void) void en_tete(void) {...... {...... ...... ...... ...... ...... } }

Universit Hassan II An Chock

89

Benayad NSIRI

Facult des sciences

EAI

Le fichier Makefile
Makefile
# stp2.c ---------------------+ stp2.o----------------+stp2 # | | # ./include/liste-note.h--| | # | # ./src/liste-note.c --------+-->./src/liste-note.o--| # | # ./include/liste-note.h---| stp2 : ./src/liste-note.o stp2.o gcc -g o stp2 ./src/liste-note.o stp2.o stp2.o : ./include/liste-note.h stp2.c gcc I ./include c stp2.c ./src/liste-note.o : ./include/liste-notes.h ./src/liste-note.c gcc I ./include c ./src/liste-note.c clean : /bin/rm f *.o a.out core ./src/*.o

Universit Hassan II An Chock

90

Benayad NSIRI

Facult des sciences

EAI

La commande make
Excute les commandes crites dans le fichier Makefile La commande make doit comporter un nom de cible: make stp2.o make clean

Si aucune cible nest prcise, cest la premire du fichier Makefile qui sera prise en compte. make make f autreMakefile

Adapte pour :
supporter la structure modulaire de lapplication La mise jour des fichiers objets La gnration des excutables

Universit Hassan II An Chock

91

Benayad NSIRI

Facult des sciences

EAI

Les bibliothques
Il existe de nombreuses bibliothques standards ; on consultera le manuel du systme.

Quelques bibliothques de fichiers dentte : stdio.h : entre / sorties, flux, errno.h : manipulation des erreurs (perror ...), math.h : fonctions mathmatiques, signal.h : signaux Unix, string.h : manipulation de chanes (strcat ...), time.h : manipulation de date et temps, curses.h : manipulation du curseur ..etc. Si l on souhaite utiliser les fonctions de ces bibliothques il faut le prciser en dbut de programme. Exemple : #include <stdio.h> va inclure le fichier /usr/include/stdio.h
Universit Hassan II An Chock 92 Benayad NSIRI

Facult des sciences

EAI

Trois exemples de bibliothques


La bibliothque string.h contient des fonctions de manipulation de chanes : - comparaison : strcmp, strncmp - recopie : strcpy, strcat - calcul longueur : strlen - recherche occurrence : strchr La bibliothque ctype.h contient des fonctions de manipulation de caractres telles que : isalpha(), isprint(), isupper(), tolower(), etc.

La bibliothque math.h contient des fonctions telles que : exp( ), log( ), power( ), sqrt(), sin( ), atan( ) , fabs()

Universit Hassan II An Chock

93

Benayad NSIRI

Facult des sciences

EAI

La bibliothque ctype.h
isalpha retourne une valeur non nulle si le caractre est dans l'intervalle A-Z ou a-z. isalnum retourne une valeur non nulle si le caractre est dans l'intervalle A-Z ou a-z ou 0-9. isdigit retourne une valeur non nulle si le caractre est dans l'intervalle 0-9. isxdigit retourne une valeur non nulle si le caractre est dans l'intervalle 0-9 ou a-f ou A-F. iscntrl retourne une valeur non nulle si le caractre appartient l'ensemble (FF, NL, CR, HT, VT, BEL ou BS). isspace retourne une valeur non nulle si le caractre appartient l'ensemble (espace, FF, NL, CR, HT ou VT). ispunct retourne une valeur non nulle si le caractre est non-alnum, non-espace et non-cntrl. isgraph retourne une valeur non nulle si le caractre est isalnum ou ispunct. isprint retourne une valeur non nulle si le caractre est isspace ou isgraph. islower retourne une valeur non nulle si le caractre est dans l'intervalle a-z. isupper retourne une valeur non nulle si le caractre est dans l'intervalle A-Z. tolower si isupper retourne le caractre minuscule, sinon retourne le caractre. toupper si islower retourne le caractre majuscule, sinon retourne le caractre.

Universit Hassan II An Chock

94

Benayad NSIRI

Facult des sciences

EAI

Les Entres-Sorties
Largument principal d une opration d E/S est un flot (stream) qui fait rfrence la nature de l E/S, au type de fichier, la mmoire tampon, la position courante dans le fichier, etc.) un fichier est toujours un flot doctets inorganis, muni d un accs squentiel et dun accs direct (au niveau caractre) Un flot en mode texte est une suite de lignes spares par des \n. Un flot binaire est une suite doctets non traits (par exemple une image). Association du flot un fichier ou un priphrique en l ouvrant La fermeture du flot annule ce lien par un vidage de la mmoire tampon et une fermeture de la communication. Les fonctions, types et macros sont dfinis dans le fichier stdio.h,
Universit Hassan II An Chock 95 Benayad NSIRI

Facult des sciences

EAI

Ouverture dun fichier


Avant daccder un fichier il faut louvrir (initialisation d un nouveau flot)

FILE *fopen(const char *name, const char *mode); name nom externe du fichier mode mode d'ouverture du fichier :

"r" pour la lecture "w" pour l'criture "a" pour ajout "r+ " pour lecture et mise jour
Si on ouvre un fichier qui n'existe pas en "w" ou en "a", il est cre. Si on ouvre en "w" un fichier qui existe dj, son ancien contenu est perdu fopen rend un pointeur sur une structure FILE, et NULL en cas d'erreur (fichier protg, etc.)
Universit Hassan II An Chock 96 Benayad NSIRI

Facult des sciences

EAI

Utilisation
Avant daccder un fichier il faut louvrir (initialisation d un nouveau flot)

#include <stdio.h>
FILE *fp; if ((fp = fopen ("resultats","r")) == NULL) printf("Impossible d'ouvrir le fichier resultats\n");

Lorsque les critures / lectures sont termines sur un fichier on en informe lOS par la fonction fclose qui vide la mmoire tampon et ferme la communication. fclose (fp);

Universit Hassan II An Chock

97

Benayad NSIRI

Facult des sciences

EAI

Lecture, criture de fichiers texte


Lecture caractre par caractre int getc(FILE *fp);

- La fonction getc() lit un caractre du fichier et le retourne dans un int (cas du eof)
- getchar() est identique getc(stdin) Ecriture caractre par caractre int putc(char c, FILE *fp); putchar(c) est identique putc(c, stdout) int c; FILE *fi,*fo; while ((c = getc(fi)) != EOF) putc(c,fo);
Universit Hassan II An Chock 98 Benayad NSIRI

Facult des sciences

EAI

Entres / sorties formates dans un fichier


Lecture int fscanf(FILE *fp, const char *format,...); La valeur retourne est le nombre ditems effectivement crits ou lus par la fonction (ou une valeur ngative en cas derreur). fscanf(fichierTampn,"%d %d ",&resu1, &resu2); Si le flot dentre contient 12 et 35, resu1 et resu2 contiendront respectivement 12 et 35 Ecriture int fprintf(FILE *fp, const char *format,...);

fprintf(stdout, "resultat :%d ", resu);


/* quivalent */ printf("resultat :%d ", resu);

Universit Hassan II An Chock

99

Benayad NSIRI

Facult des sciences

EAI

Lecture, criture de chanes de caractres


Lecture de chanes de caractres char * gets(char *s) ; char * fgets(char *s, int n, FILE *stream) ; gets( ) lit des caractres sur le clavier jusquau caractre newline et les range dans le tableau point par s auquel il rajoute le caractre \0 . fgets lit n-1 caractres dans le fichier stream. criture de chanes de caractres int puts(const char *s) ; int fputs(const char *s, FILE *stream); puts( ) crit sur lcran la chane s, fputs lcrit dans le fichier. Les deux fonctions retournent le nombre de caractres crits.

Universit Hassan II An Chock

100

Benayad NSIRI

Facult des sciences

EAI

Copie d'un fichier texte


#include <stdio.h> main() { FILE *fpin, *fpout; char carlu; if ( ( fpin = fopen("fich_origine", "r") )!= NULL ) { printf("OK ouverture de 'fich_origine'\n"); if((fpout = fopen("fich_destination", "w")) != NULL) { printf("OK ouverture de 'fich_destination'\n"); while ( ( carlu = getc( fpin ) ) != EOF ) { putc( carlu, fpout ); /*ecriture dans le fichier*/ putc( carlu, stdout ); /*affichage a l'ecran */ putchar( carlu ); /*affichage a l'ecran */ } fclose( fpout ); fclose( fpin ); } else { printf(" erreur ouverture fich_destination'\n"); fclose( fpin ); } } else printf(" erreur ouverture de 'fich_origine'\n"); }
Universit Hassan II An Chock 101 Benayad NSIRI

Facult des sciences

EAI

Lecture criture de fichiers non texte


Lecture de n'importe quel type de donnes size_t fread (void *ptr, size_t size, size_t nitems, FILE *fp ); Cette fonction transfre, depuis le fichier associ fp, nitems lments de size octets vers une zone mmoire dbutant l'adresse ptr. fread retourne le nombre d'objets rellement lus. Ecriture de n'importe quel type de donnes size_t fwrite (void *ptr, size_t size, size_t nitems, FILE *fp ); Cette fonction transfre, vers le fichier associ fp, nitems lments de size octets depuis une zone mmoire dbutant l'adresse ptr. fwrite retourne le nombre d'objets rellement crits.
Universit Hassan II An Chock 102 Benayad NSIRI

Facult des sciences

EAI

Copie d'un fichier d'individus


#include <stdio.h> main() { struct individu { char nom[15]; char prenom[10]; int age; }; struct individu indi; int taille; FILE *fpout, *fpin; taille = sizeof(struct individu); fpin = fopen("data_individu", "r" ) ; fpout = fopen("copie_individu", "w" ) ; while( fread(&indi, taille, 1, fpin) ) { fwrite(&indi, taille, 1, fpout); /* affichage du contenu du fichier l'ecran */ printf("nom :%s, prenom : %s \n", indi.nom, indi.prenom); printf("est age(e) de %d ans\n\n", indi.age); } fclose(fpout); } fclose(fpin);
103 Benayad NSIRI

Universit Hassan II An Chock

Facult des sciences

EAI

Positionnement dans un fichier


Il peut tre utile daccder un fichier de manire directe afin dy effectuer des critures ou des lectures. Cette opration est possible en grant directement le pointeur doctets qui donne la position courante dans le fichier une lecture ou une criture ultrieure dbutera partir de cette nouvelle position.

Universit Hassan II An Chock

104

Benayad NSIRI

Facult des sciences

EAI

La fonction fseek()
extern int fseek(FILE *stream, long offset, int origin ); Paramtres : stream : identificateur du fichier dans lequel on cherche se positionner offset : dplacement, partir de lorigine, de la prochaine lecture ou criture origin : peut tre gal

SEEK_SET : dbut du fichier SEEK_CUR : position courante dans fichier SEEK_END : fin du fichier #define #define #define SEEK_SET 0 SEEK_CUR 1 SEEK_END 2

Universit Hassan II An Chock

105

Benayad NSIRI

Facult des sciences

EAI

Fin cours 4

Universit Hassan II An Chock

106

Benayad NSIRI