Bonjour, voilà, j'aimerai avoir votre avis sur un bout de code.
l'objet est de construire une classe qui implemente un playlist (mais pas comme celle d'un lecteur multimedia, c'est pour un jeu, les pistes ont des numéro(index) et une correspondance entre le numero et le volume sonore ainsi que le son est réalisé dans un fichier texte)

bref, la classe n'est pas complete, mais je voudrait votre avis sur le code de la fonction loadfile() qui doit lire le fichier des pistes sonore...

au fait, ca compile bien.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
// fichier playlist.h
#if !defined(SNDPLAYLIST_FAB2009)
#define SNDPLAYLIST_FAB2009
 
#pragma warning (disable : 4786) //C4786 warnings VC6
 
#include <string>
#include <map>
#include "sdlstuff.h"
 
typedef struct 
	{
	bool loaded;
	std::string file;
	Uint8 vol;
	} listitem;
 
class playlist
{
public :
	playlist(); // constructeur
	virtual ~playlist(); // destructeur
	bool loadfile(const std::string path,const std::string file);
	std::string getFile(Uint8 n);
	Uint8 getVol(Uint8 n);
private :
	Uint16 nb;
	std::map<Uint8,listitem> tracklist;
};
 
#endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// fichier playlist.cpp
 
#include "playlist.h"
#include <fstream> //pour std::ifstream
#include "toolbox.h" // pour Str2Uint et cleanstring
 
playlist::playlist() :nb(0)
{
}
 
 
bool playlist::loadfile(const std::string path,const std::string file ) // charge le fichier "tracklist" et construit la map.
{
	std::string nomfichier;
	nomfichier=path+"/"+file;
	std::ifstream fich( nomfichier.c_str() );
	if (!fich || fich.fail()) return false;
 
	std::string line;
 
	std::string filesound;
	Uint8 tracknr=0, volume=0;
 
	while ( std::getline( fich, line ) )
	{
 
		tracknr=0;
		volume=0;
		filesound="";
		if(line.size()>1 && line.substr(0,1)!="#")
		{
			tracknr=Str2Uint(line.substr(0,3));
			volume=Str2Uint(line.substr(4,3));
			filesound=cleanstring(line.substr(14,20));
 
			listitem item;
			item.file=filesound;
			item.vol=volume;
			item.loaded=false;
 
			tracklist[tracknr]= item;
			nb++;
		}
 
	}
	fich.close();
	return true;
}
 
playlist::~playlist()
{
	tracklist.clear();
}
j'ai pas encore fais les getter mais ca sera un truc assez simple comme
getVol (uint n) { return tracklist[n].vol; }

et le fichier de config aurra cette tête là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
001 050      intro.mid
002 050      theme1.mid
là où j'ai un doute, c'est sur la methode pour bien nettoyer tout ca, j'ai plus l'habitude des vecteurs avec des pointeurs (std::vector<obj*> ... comme ca c'est moi qui fais le delete des objets) mais là, c'est un struc... si je fais un tracklist.clear() dans le destructeur ca devrait suffire ?
bref qu'en pensez-vous ?

Merci de vos conseils...

Ps : ha au fait ca ne servira peut être pas, mais voici deux fonction de la toolbox utilisé ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Uint16 Str2Uint( const std::string & x )
{ //avant Uint16 Str2Uint(std::string x)
    std::istringstream iss(x);
    long nombre;
    iss >> nombre;
	return nombre;
}
std::string cleanstring(std::string s)
{
	std::string::size_type p=0;
	std::string x(" *+\r\t\n"); // les caracteres a supprimer
	while((p= s.find_first_of(x))!=std::string::npos)
	{
		s.erase(p,1);
	}	
	return s;
}