Salut,
Le plus facile, c'est d'utiliser un ifstream, qui est prévu pour...
Les ifstream sont déclarés dans l'entete <fstream> et sont à utiliser sous la forme de
std::ifstream fichier(nom_fichier)
ou nom fichier est une chaine C-like (tableau de caractères terminé par zero). Ce qui pourrait très bien prendre la forme (chaine étant une chaine de type std::string) de
std::ifstream fichier(chaine.c_str());
Du fait de la structure précise du fichier, le plus facile, apres vérification de l'ouverture du fichier, est sans doute de lire "chaine de caractère par chaine de caractère" et de convertir en fonction de ce qui est trouvé sous la forme de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
std::string lecture;
while(!fichier.eof())//une boucle pour lire tout le fichier
{
//on lit une premiere chaine de caractères
//ca ne devrait pas arriver, mais on veille à ce que la lecture se passe
// bien
if(!(fichier>>chaine))
throw std::runtime_error("erreur de lecture");
//une suite de test pour savoir à quoi on a affaire
if(chaine=="#") //ligne de commentaire, on se contente de lire le reste
//de la ligne
getline(fichier,chaine);
if(chaine=="v")
{
//une ligne pour un vecteur on lit trois coordonnées que l'on converti
//une solution serait de les introduire dans une std::map<int,Vertice>
//où int sera le numéro du vertice (auto-incrémenté)
}
if(chaine=="usemtl")
{
// la chaine qui suit est le nom du matériau à utiliser pour les faces
//à mettre en relation avec la liste des matériaux utilisables
}
if(chaine=="f")
{
//ce qui suit est une liste de numéro de vertice, terminée par
//la chaine "g"
//encore une fois, on les lit un par un, puis on converti en entier
// et ca peut servir comme valeur à chercher comme cle dans
//la map indiquée plus haut
}
} |
La convertion en réel ou en entier se baserait alors sur un ifstringstream et ce qui est indiqué dans la FAQ:
1 2 3 4 5 6 7 8
|
std::ifstringstream iss(chaine);
//convertion en entier
int entier;
iss>> entier;
//convertion en réel
float reel;
iss>>reel; |
selon le cas 
PS: le code met des apostrophes, mais, normalement ce sont des guillemets qui sont à utiliser comme valeur de test de la chaine
Partager