TP 1 • mini_ls
| Champ | Valeur |
|---|---|
| Auteur·e | Élise |
| Édition | 2024-03-04 |
| Durée | 1 session |
| Taille des équipes | 1~3 personnes login des auteurs·rices dans author.txt |
| Rendu | via git, dépôt $YEAR_tp_readdir, droits en lecture à delivery_collector |
| Compilation | make avec règles all, clean, fclean, re |
| Binaires | mini_ls : exécutableut.out : tests unitaires |
Barème
| Critères | Points |
|---|---|
| Étape 1 | 5 |
| Étape 2 | 5 |
| Étape 3 | 5 |
| Étape 4 | 5 |
| Total des critères | 20 |
| Malus par ligne contenant une faute de norme | -0,5 |
| Malus dépôt sale | -5 |
| Note maximale | 20 |
Règlement de projet
Prévention de la triche
La réalisation de cet exercice est assujettie aux règles en vigueur dans l’école en matière de triche et de normalisation. Tricher vous expose à de graves sanctions.
Vous devez respecter les règles de normalisation suivantes : https://git.ecole-89.com/eriizu/coding_style/src/branch/main/norm.md
Le non-respect de la norme vous fera perdre une partie ou la totalité des points qui auraient pu être acquis, sur l’ensemble du rendu.
Fichiers à rendre et compilation
La structure de votre dépôt doit être la suivante :
Makefileà la racine de votre dépôt- fichiers
*.cdanssrc/ - fichiers
*.hdansinclude/ - fichiers
*.cde tests unitaires criterion danstest/
Votre Makefile doit au minimum avoir les règles all, clean, fclean et re
Vous devez aussi avoir une recette par binaire demandé dans le cartouche de sujet. La recette all doit dépendre de celles de binaires demandés.
Tests unitaires
Chacune de vos fonctions doit avoir des tests unitaires associés.
Fonctions autorisées et interdites
Pour tout le sujet, les fonctions autorisées sont :
writemallocfreeopendirreaddirclosedirstrerror
Introduction
Nous avons déjà vu comment travailler le contenu des fichiers, aujourd’hui on va regarder comment travailler avec des dossiers et les métadonnées des fichiers.
Théorie : readdir
Pour lire le contenu d’un dossier, on doit ouvrir un dir pointer avec opendir. Si la fonction nous renvoie NULL c’est qu’elle n’a pas réussi à ouvrir le dossier.
Sur un dossier ouvert on peut regarder les entrées du répertoire avec readdir qui nous renvoie un pointeur sur struct dirent (lit. directory entry). Chaque entrée du repertoire est un fichier ou un dossier contenu dans le repertoire.
Lorsque readdir renvoie NULL, on sait qu’il n’y a pas d’autres entrées.
Quand on a fini avec un dossier, on utilise closedir pour libérer les resources associées.
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
DIR *dir;
struct dirent *current_entry;
dir = opendir("./");
if (dir == NULL) {
return (1);
}
current_entry = readdir(dir);
while (current_entry) {
puts(current_entry->d_name);
current_entry = readdir(dir);
}
closedir(dir);
}
Étape 1 : début
Écrivez un programme mini_ls qui prend en argument un ou plusieurs noms de dossiers ou rien. Si aucun nom de dossier n’est passé en argument, vous travaillerez avec le dossier courant à la place.
Si vous n’avez qu’un dossier en argument ou aucun et que vous travaillez sur le dossier courant : affichez simplement le contenu du dossier, sans les fichiers cachés. Affichez le nom des fichiers, séparés par des espaces et terminés par un retour à la ligne.
Si vous avez plusieurs dossiers, faites la même chose, ajoutez juste une ligne vide et le nom du dossier que vous allez afficher avant chaque dossier.
$ ./mini_ls src include
src:
main.c readdir.c
include:
mini_ls.h tata.h
Étape 2 : fonction de tri
Écrivez la fonction suivante :
void strtab_sort(char **strtab);
Elle doit trier les chaînes de caractères du tableau strtab par ordre ASCII.
Algorithme de base du tri à bulle :
- on commence au début du tableau ;
- tant qu’on est pas sur la dernière case du tableau :
- si l’élément actuel est plus grand que l’élément suivant :
- on les intervertit,
- on passe à l’élément d’après,
- si l’élément actuel est plus grand que l’élément suivant :
- si on a fait un changement lors de notre traversée du tableau :
- on recommence ;
- si on a pas fait de changement lors de notre dernière traversée du tableau :
- le tableau est trié.
Enfin : vous devez écrire des tests unitaires pour votre fonction de tri
Étape 3 : tri des fichiers
Modifiez votre programme mini_ls de sorte qu’à chaque fois que vous affichez le contenu d’un dossier, il soit trié par ordre ASCII.
Étape 4 : affichage des erreurs
Modifiez votre programme mini_ls de sorte que si un des arguments n’est pas un dossier, vous affichez une erreur à l’aide de strerror.
Les erreurs doivent être au format suivant:
av0: nom_du_fichier: détails du problème
./mini_ls: patate: no such file or directory
./mini_ls: patate: not a directory
./mini_ls: patate: permission denied