TP Numéro 3bis : un parser de fichiers
Sujet du TD
Je vous propose aujourd'hui d'écrire un parser de fichier assez
utile. Il permet de lire des fichiers dont chaque ligne peut :
-
Etre vide,
-
Commencer par un '#', en ce cas, il s'agit d'une ligne de commentaire qui
est ignorée,
-
Commencer par un mot clé, suivi de valeurs correspondant à
ce mot clé,
-
Si la ligne ne commence pas par un mot-clé pertinent elle peut (au
choix du programmeur) être ignorée ou bien générer
une exception.
Les fichiers au format .obj, servant à décrire les
objets 3d utilisés lors des TPs de synthèse d'image du second
trimestre sont de ce type là.
Ici, un exemple d'utilisation dans le programme
JVisu écrit par Stephane Vinter, un élève de maîtrise
de l'an dernier.
Objets 3d et format des fichiers .obj
Un objet 3d est composé de :
-
Une liste de sommets (x, y, z),
-
une liste de faces (3 indices de sommets dans la liste des sommets),
-
une position (x, y, z),
-
une orientation (tangage, roulis, ???),
-
des attributs de surface (coefficients de reflexion de la lumière
Ka, Kd, Ks, m)
-
une couleur.
Exemple de fichier .obj, le fichier cube.obj décrivant
un cube 3D composé de faces triangulaires, dont un coin est tronqué
Travail à faire
-
Ecrire la classe Objet3d,
-
Cela vaut-il la peine de créer une classe pour chacun des attributs
d'un objet 3d ?
-
La classe Objet3d devra possèder un constructeur et une
méthode public void ReadObject(InputStream f) {...} permettant
de lire un objet, ainsi qu'une méthode toString() affichant
les valeurs de tous ses attributs. Ecrire la classe Objet3D et
si besoin les classes associées,
-
Ecrire une classe de test ouvrant un fichier, obtenant un InputStream
à partir de ce fichier, puis instanciant un Objet3D et
invoquant la méthode readObject(InputStream is).
Algo de lecture
Voici l'algo que je propose pour lire les fichiers dont il est objet dans
ce TD :
TantQue (fichier non terminé)
Faire
Si((ligne de taille non nulle) et (ligne ne commande par par '#'))
Alors
-je regarde par quoi la ligne commence et en fonction du mot-clé
je lis les valeurs qui suivent ou bien je produit un message d'erreur
FinSi
-Je passe a la ligne suivante
FinFaire
Notes relatives à l'implémentation
Je vous conseille d'utiliser un StreamTokenizer pour faire la lecture des
donnees, ou bien un DataInputStream (lecture ligne par ligne avec readLine()),
couple a un StringTokenizer pour parser les lignes...