TP n°8 : Les fonctions d'écriture du SGF

Les TP n°7 ET n°8 sont à rendre
ensemble sur AMETICE avant
le mercredi 11 décembre 2024 à 18h15.

Écrire caractère après caractère

Le principe est le même que pour la lecture. Les caractères sont placés dans le buffer tant que celui-ci n'est pas plein. Une fois le buffer complété, un nouveau bloc est ajouté au fichier. Pour re-programmer les fonctions d'écriture, suivez les étapes ci-dessous :

  1. Re-programmez la fonction sgf_putc du fichier sgf-io.c et tester son bon fonctionnement avec le code ci-dessous.
    OFILE* file = sgf_open("essai.txt", WRITE_MODE);
    sgf_puts(file, "Ceci est un petit texte qui occupe\n");
    sgf_puts(file, "quelques blocs sur ce disque fictif.\n");
    sgf_puts(file, "Le bloc faisant 128 octets, il faut\n");
    sgf_puts(file, "que je remplisse pour utiliser\n");
    sgf_puts(file, "plusieurs blocs.\n");
    sgf_close(file);
    
  2. Programmez la fonction sgf_append_block et testez de nouveau l'écriture.
  3. Programmez la fonction sgf_close et assurez vous que vous ne perdez pas les derniers caractères du fichier.
  4. Terminez par la fonction de destruction sgf_remove. Faites en sorte que cette fonction imprime l'état du disque (nombre de blocs libres par exemple). Vous devez notamment vérifier qu'il n'y a pas de fuite mémoire (le nombre de bloc libres ne cesse de diminuer).

Ouvrir un fichier en mode ajout

On vous demande de mettre en place un mode d'ouverture en ajout que ne vide pas le fichier mais qui permet de l'agrandir. Suivez les étapes ci-dessous:

  1. Modifiez le fichier sgf-header.h pour enrichir la déclaration suivante
    typedef enum {
        READ_MODE,         /* Fichier ouvert en lecture         */
        WRITE_MODE,        /* Fichier ouvert en écriture        */
        APPEND_MODE,       /* Fichier en mode ajout             */
    } MODE;
    
  2. Commencez par ajouter le cas APPEND_MODE à la fonction sgf_open. Cette dernière doit maintenant lire le dernier bloc du fichier si la taille n'est pas un multiple de la taille des blocs. (il faut lire le dernier bloc incomplet pour le compléter).
  3. Attention : la fonction sgf_append_block doit maintenant être modifiée. En mode ajout, il ne faut pas ajouter un nouveau bloc mais simplement récrire la nouvelle version du dernier bloc. Une fois cette opération réalisée, nous ne sommes plus en mode ajout.
  4. Testez ce mode en vidant un fichier (ouverture en écriture) puis en l'ouvrant 300 fois en mode ajout afin, à chaque fois, d'ajouter un seul caractère.