Support Cours C++ Allo Dynamique Structure Fichier
Support Cours C++ Allo Dynamique Structure Fichier
Support Cours C++ Allo Dynamique Structure Fichier
C++
Parties traitées :
1
Liberation dynamique de memoire
Elle ne doit être appliquée qu’a des pointeurs pointant sur une zone
allouée dynamiquement.
C++ : Libération d’un élément
delete p;
Explication
Libère et restitue au système d’exploitation la zone mémoire pointée par
le pointeur p et rend indéterminée la valeur de p.
Liberation d’un tableau
delete[] p;
Explication
Libere la zone mémoire allouée au pointeur p. Ce sont les crochets qui
indiquent au système que l’adresse dans p réfère une structure tabulaire.
Exemple :
2
Tableau à 2 dimensions :
Libération de la mémoire
int** Tab;
int i;
delete []Tab;
3
Partie 2 : Structures
#include<iostream>
using namespace std;
struct point
{
double x,y;
};
int main()
{
point a,b,c;
a.x=3.2;
a.y=6.4;
4
cout << "Tapez l'abscisse de b : ";
cin >> b.x;
cout << "Tapez l'ordonnee de b : ";
cin >> b.y;
c.x = (b.x + a.x) / 2;
c.y = (b.y + a.y) / 2;
cout << "Abscisse de c : " << c.x << endl;
cout << "Ordonnee de c : " << c.y << endl;
return 0;
}
Utilisation de typedef
#define MAX_POINTS 10
typedef struct
{
char nom[20] ;
char nb_points ;
double y[MAX_POINTS] ;
} T_COURBE ;
5
T_COURBE parabole ;
T_COURBE sinus = { "sinusoide", 4, { 1., 0., ‐1., 0. } } ;
T_COURBE* ptr ;
Exemple d’application
1- On peut définir une structure employe qui est défini par un nom, un
prénom et un salaire. Le nom et le prénom comporteront au
maximum 9 caractères utiles.
Code :
struct employe {
char nom[10];
char prenom[10];
double salaire;
};
2- Définir les fonctions saisir_employe et affiche_employe
Code :
void saisir_employe(employe &e) {
cout<<"Tapez le nom : ";
cin>>e.nom;
cout<<"Tapez le prenom : ";
cin>>e.prenom;
cout<<"Tapez le salaire : "; cin>>e.salaire;
}
void affiche_employe(employe e) {
cout<< e.nom <<" "<< e.prenom <<" " << e.salaire << ;
}
3- On veut maintenant gérer une liste d’employé, sachant que cette liste
peut contenir au maximum 100 emplyés
6
Code :
struct liste {
int nb;
employe t[100];
};
4- On s’intéresse maintenant à la définition des fonctions suivantes qui
manipulent la liste de ces employés
Code :
void affiche(liste l) {
int i;
if(l.nb==0)
cout<<"LISTE VIDE "<< ;
7
for(i=0; i<l.nb; i++)
affiche_employe(l.t[i]);
}
Fonction qui recherche le nom donné d’un employé dans la liste :
8
Partie 3 : Fichiers
cstdio ou fstream
Il existe principalement 2 bibliothèques standard pour écrire des fichiers :
• cstdio qui provient en fait du langage C.
• fstream qui est typiquement C++.
9
sur lequel on souhaite travailler. Le paramètre mode indique le mode
d'ouverture de filepath : lecture ou écriture, texte ou binaire.
Le mode peut avoir l'une des valeurs suivantes :
• "r" (read) : lecture,
• "w" (write) : écriture, fichier créé ou écrasé s'il existait déjà,
• "a" (append) : écriture en fin de fichier existant (ajout de données).
Sur certaines plateformes (Windows par exemple), on peut y ajouter le type
d'écriture (texte ou binaire), sur les autres (Linux par exemple) le type est
ignoré :
• "b" : mode binaire,
• "t" : mode texte.
Enfin, on peut ajouter le signe "+" afin d'ouvrir le fichier en lecture et
écriture à la fois.
Exemples :
• "r+" : ouverture en lecture et écriture,
• "wb" : ouverture en écriture binaire
La fonction fopen retourne le pointeur NULL si l'ouverture du fichier a
échouée. Dans le cas contraire, elle retourne
un pointeur vers une structure FILE. Ce pointeur servira à écrire ou lire dans
le fichier, ainsi qu'à le fermer.
La fonction fclose(FILE *)
#include <iostream>
#include<cstdio>
using namespace std;
int main (void)
{
FILE * f;
int a = 78, i, t1 [6];
double b = 9.87;
char c = 'W', t2 [10];
for(i = 0; i < 6; i++)
t1 [i] = 10000 + i;
strcpy (t2, "AZERTYUIO");
cout << t2 << endl;
f = fopen ("toto.xyz", "wb");
if (f == NULL)
cout << "Impossible d'ouvrir le fichier en écriture !" << endl;
else
{
fwrite (&a,sizeof(int),1,f);
fwrite (&b,sizeof(double),1,f);
fwrite (&c,sizeof(char),1,f);
fwrite (t1,sizeof(int),6,f);
fwrite (t2,sizeof(char),10,f);
11
fclose (f);
}
return 0;
}
#include <iostream>
#include<cstdio>
using namespace std;
int main (void)
{
FILE * f;
int a, t1 [6], i;
double b;
char c, t2[10];
f = fopen("toto.xyz", "rb");
if (f == NULL)
cout << "Impossible d'ouvrir le fichier en lecture !" << endl;
else
{
fread (&a,sizeof(int),1,f);
fread (&b,sizeof(double),1,f);
fread (&c,sizeof(char),1,f);
12
fread (t1,sizeof(int),6,f);
fread (t2,sizeof(char),10,f);
fclose (f);
}
cout << "a=" << a << endl
<< "b=" << b << endl
<< "c=" << c << endl;
for (i = 0; i < 6; i++)
cout << t1 [i] << endl;
cout << t2 << endl;
return 0;
}
#include <iostream>
#include<cstdio>
using namespace std;
int main (void)
{
FILE * f;
int a = 78, t1 [6], i;
double b = 9.87;
char c = 'W', t2 [10];
for (i = 0; i < 6; i++)
t1 [i] = 10000+i;
strcpy (t2, "AZERTYUIO");
f = fopen ("toto.txt", "wt");
if (f == NULL)
cout << "Impossible d'ouvrir le fichier en écriture !" << endl;
else
{
fprintf (f, "%d %lf %c ", a, b, c);
for (i=0;i<6;i++)
fprintf (f, "%d ", t1[i]);
fprintf (f, "%s ", t2);
fclose (f);
}
return 0;
}
14
Dans ce programme, on ouvre le fichier texte nommé toto.txt en écriture.
Si on a réussi à ouvrir le fichier, on y écrit un entier, un double, un char,
puis un tableau de 6 entiers et finalement une chaîne de caractères sans
espace contenu dans un tableau de char.
#include <cstdlib>
#include <iostream>
#include<cstdio>
using namespace std;
int main (void)
{
FILE * f;
double b;
int a, t1 [6], i;
char c, t2 [10];
f = fopen ("toto.txt", "rt");
if (f == NULL)
cout << "Impossible d'ouvrir le fichier en lecture !" << endl;
else
{
fscanf (f, "%d %lf %c ", &a, &b, &c);
for (i = 0; i < 6; i++)
fscanf (f, "%d ", &t1 [i]);
fscanf (f, "%s ", t2);
fclose (f);
}
cout << "a=" << a << endl
15
<< "b=" << b << endl
<< "c=" << c << endl;
for (i = 0; i < 6; i++)
cout << t1 [i] << endl;
cout << t2 << endl;
return 0;
}
Dans ce programme, on ouvre le fichier binaire nommé toto.txt en lecture.
Si on a réussi à ouvrir le fichier, on lit un entier, un double, un char, puis
un tableau de 6 entiers et finalement une chaîne de caractères.
NB :
Les TDs et TPs de ces chapitres sont fournis dans un autre document.
16