Université de Nice-Sophia Antipolis POLYTECH
ELEC4 2020–2021
Examen de Programmation C++
Durée : 1h
Aucun document autorisé
Mobiles interdits Nom : Prénom :
1 Questions de cours
I1. Expliquez de façon synthétique ce qu’est UML ? Donnez un exemple d’agré- gation.
voir cours.
. . . . I2. Expliquez de façon synthétique ce qu’est un patron de conception.
voir cours.
. . . . I3. Décrivez et expliquez le patron de conception décorateur. Vous donnerez son
diagramme de classes.
voir cours.
. . . .
2 Programmation
I4. En utilisant, la classestd::ifstreamet ses méthodesis_open,get,eofet close, écrivez la classeFileInputStreamqui permet de lire un fichier d’octets (et uniquement d’octets). Votre classe comprendra dans sa partie publique :
— un constructeur qui ouvre en lecture un fichier dont le nom est passé en paramètre. Si l’ouverture en lecture n’est pas possible, le constructeur
1
émettra l’exceptionIOException, dont vous devez donner la programma- tion.
— la fonctionint read()qui renvoie le prochain octet lu dans le fichier. Si la fin de fichier est atteinte, la fonctionreadrenvoie la valeur−1.
— la fonctionbool eof()qui renvoietruesi on est en fin de fichier ; etfalse sinon.
— la procédurevoidclose()qui ferme le fichier.
c l a s s FileInputStream { p r i v a t e:
std :: ifstream ios;
bool fdf;
p u b l i c: /*
* rôle : ouvre en lecture le fichier d’octets in
FileInputStream (*/ c o n s t std :: string &in) : ios(in), fdf(f a l s e) { i f (!t h i s->ios. is_open ())
throw IOException (in + " : ouverture en lecture impossible ");
} /*
* rôle : renvoie le prochain octet lu sur le fichier d’octets ouvert this ,
* ou -1 si la fin de fichier est atteinte
*/
i n t read () { i n t c = ios.get ();
i f (t h i s->ios.eof ()) { t h i s->fdf = t r u e; r e t u r n -1;
}r e t u r n c;
} /*
* rôle : renvoie vrai si this en fin de fichier , et faux sinon
*/
bool eof () c o n s t { r e t u r n t h i s->fdf;
} /*
* rôle : ferme le fichier courant void*/ close () {
t h i s->ios. close ();
};}
c l a s s IOException : p u b l i c std :: exception { p r i v a t e:
std :: string msg;
p u b l i c:
IOException (c o n s t std :: string &s) : msg(s) {};
2
v i r t u a l c o n s t char * what () c o n s t noexcept override { r e t u r n msg. c_str ();
};}
. . . . I5. À l’aide de la classeFileInputStream, écrivez la fonctionmainqui ouvre un
fichier de texte, et le recopie sur la sortie standard.
i n t main () {
FileInputStream f(" test .cpp");
i n t c;
w h i l e ((c = f. read ()) != -1) std :: cout << (char) c;
f. close ();
r e t u r n EXIT_SUCCESS ; }
. . . . I6. On veut maintenant pouvoir lire dans un fichier, des objets de type simple (entiers, réels, booléens,etc.). Écrivez la classeDataInputStreamqui fournit ce service. Cette classe comprendra dans sa partie publique :
— un constructeur qui initialise unDataInputStreamà partir d’unFileInputStream passé en paramètre. Attention, les objets de typeifstreamne sont pas copiables.
— la procédurevoidclose()qui ferme le fichier.
— la fonctionbool readBoolean(), qui lit le prochain octet dans le fichier.
Elle renvoiefalsesi cet octet est égal à 0, etvrai, s’il est différent de 0.
S’il n’y a aucun octet à lire, la fonction émettra l’exceptionIOException (héritère deIOException), dont vous devez donner la programmation.
c l a s s DataInputStream { p r i v a t e:
FileInputStream &fis;
p u b l i c:
/*
* rôle : crée un DataInputStream à partir du fichier
* d’octets fourni en paramètre .
*/
DataInputStream ( FileInputStream &f) : fis(f) {}
/*
* rôle : lit le prochain octet sur le fichier d’octets sous -jacent , et
* renvoie faux si égal à 0 et vrai sinon . lève l’exception
* EOFException si la fin de fichier est atteinte
*/
bool readBoolean () { i n t c = t h i s->fis. read ();
3
i f (t h i s->fis.eof ()) throw EOFException ();
//r e t u r n c==0 ? f a l s e : t r u e; }
/*
* rôle : ferme le fichier d’octets sous - jacent void*/ close () {
t h i s->fis. close ();
};}
c l a s s EOFException : p u b l i c IOException { p u b l i c:
EOFException () : IOException ("Fin de fichier ") {}
};
. . . . I 7. Sur quel patron de conception sont organisées les deux classesFileInputStream
etDataInputStream?
Le patron de conception décorateur.
. . . . I 8. Le fichier d’octets de nomfichBoolreprésente un suite de booléens. À l’aide deDataInputStream, écrivez la fonctionmainqui lit la totalité de ce fichier et affiche sur la sortie standard la valeur (trueoufalse) de chacun de ces booléens.
i n t main () {
FileInputStream f(" fichBool ");
DataInputStream dis(f);
t r y {
std :: cout << std :: boolalpha ;;
w h i l e (t r u e)
std :: cout << dis. readBoolean () << " ";
}ca tch ( EOFException e) { dis. close ();
}std :: cout << std :: endl ; r e t u r n EXIT_SUCCESS ; }
. . . .
4