Test de rattrapage n° 2 de système

(10 mars 2001 – durée : 2h)

 © D. Mathieu    mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 09/03/2001 - Dernière mise à jour : 09/03/2001

Tout document autorisé

Fichier séquentiel indexé

    Considérons qu'un fichier texte est composé de lignes de tailles quelconques, chaque ligne étant terminée par le caractère '\n'. On souhaiterait créer une classe CRandomAccess permettant de gérer ce fichier, telle qu'elle permette l'utilisation suivante :
 
{
    CRandomAccess Fich ("NomDeFichier");
    // ...
    string StrLue = Fich [i];                // {1}
    // ...
    Fich [j] = string ("Nouvelle ligne");    // {2}
    // ...
}

    La ligne {1} montre qu'il faudrait surcharger l'opérateur [] pour qu'il puisse extraire la ième ligne du fichier et la renvoyer sous forme d'un objet de la classe standard string.

    La ligne {2} montre qu'il faudrait surcharger l'opérateur [] pour qu'il puisse écrire un objet de la classe standard string dans la jème ligne du fichier.

    La surcharge de l'opérateur [] entrant plus dans le cadre d'un test de C++ que de système, on se contentera ici de pouvoir en faire l'utilisation suivante, moins élégante :
 
{
    CRandomAccess Fich ("NomDeFichier");
    // ...
    string StrLue = Fich.Get (i);               // {1}
    // ...
    Fich.Set (j, string ("Nouvelle ligne"));    // {2}
    // ...
}

    Le principe proposé est le suivant :

    Lorsque la fonction Get(i) est appelée, elle utilise les informations de l'élément i du tableau pour puis construit la chaîne correspondante qu'elle renvoie. Comme en C/C++, la première ligne a pour indice 0.

    Lorsque la fonction Set(i, Str) est appelée, elle utilise les informations de l'élément i du tableau :

   Dans les deux cas, le tableau est mis à jour.

    Le destructeur :

Travail à réaliser :

    La classe CRandomAccess doit posséder :

Constructeur

    Le constructeur :
  • ouvre le fichier source, ou le crée s'il n'existe pas,
  • remplit le tableau en lisant le fichier ligne par ligne. On rappelle que :
  • Modifieur

        La fonction Set() écrit la chaîne passée en paramètre dans le fichier. Plusieurs cas doivent être envisagés :

     Accesseur

        La fonction Get() lit la ligne i dans le fichier et renvoie la chaîne string corespondante. Plusieurs cas doivent être envisagés :

       Destructeur

        Le destructeur :     Deux fonctions peuvent être utilisées pour cela
     
    #include <cstdio>

    char *tempnam (const char *rep, const char *préfixe);  // fonction standard du C

    int rename(const char *oldpath, const char *newpath);  // fonction système

        La fonction tempnam() renvoie un pointeur vers une chaîne de caractères allouée dynamiquement par la fonction, et qui contient un nom de fichier unique situé dans le répertoire rep (si rep != 0), et préfixé d'au maximum 5 caractères de la chaîne prefixe (si prefixe != 0). Une saine utilisation nécessiterait de libérer ensuite l'espace mémoire, par appel de la fonction free() : hors sujet.

        La fonction système rename() renomme le fichier oldpath en newpath. On supposera que son wrapper Rename() a été ajouté dans l'espace de noms nsSysteme.

    Corrigé :      RandomAccess.cxx
     

    © D. Mathieu    mathieu@romarin.univ-aix.fr
    I.U.T.d'Aix en Provence - Département Informatique