15-03-2011 10:05:26
- Metallizer
- Membres

- Date d'inscription:
- Messages: 100
- IP: 212.19.170.66
- Courriel Site web
Salut à tous,
Je vous expose mon problème en espérant que des pros de la lecture de fichiers puissent m'aiguiller !
Je souhaite lire un fichier de traduction des textes de mon jeu, il a un format très simple :
identifiant1=texte1
identifiant2=texte2
etc...Du coup j'ai une classe Translation avec une méthode loadTextData qui s'occupe d'ouvrir le fichier, de lire caractère par caractère puis de stocker les traductions dans une map définie telle que :
Code c++ :
typedef map<core::stringc, core::stringw> translationMap;Notez bien le stringw utilisé pour que les chaînes unicode soient gérées.
Seulement voila, j'ai beau lire et relire mon code, je ne vois pas ce qui cloche. J'affiche toujours dans la console des adresses mémoire au lieu du texte. Pourtant, si je change le stringw en stringc, mon texte s'affiche bien (mais mal encodé si il y a des caractères accentués).
Code c++ :
void Translation::loadTextData(const core::stringc& fullPath) {
wifstream textFile(fullPath.c_str(), ios::in);
if(textFile) {
wchar_t currentChar;
bool inTextIdentifier = true;
bool inTextValue = false;
core::stringc identifier = "";
core::stringw value = L"";
while(textFile.get(currentChar)) {
if(currentChar == '\
' || currentChar == '\
') {
// Ici, la console affiche : "translation added: test = 0x22cc0c0" :(
cout << "translation added: " << identifier.c_str() << " = " << value.c_str() << endl;
textData[identifier] = value;
identifier = "";
value = L"";
inTextValue = false;
inTextIdentifier = true;
}
if(inTextValue) {
value.append(currentChar);
}
if(inTextIdentifier) {
if(currentChar == '=') {
// Passage de l'identifiant a la valeur
inTextIdentifier = false;
inTextValue = true;
} else {
identifier.append(currentChar);
}
}
}
textFile.close();
}
}Donc si quelqu'un a déjà rencontré des problèmes de ce type avec stringw, je suis toute ouïe. Merci d'avance
Hors ligne
15-03-2011 15:37:01
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 91.103.40.50
- Courriel Site web
Je ne saurais pas te dire d'où vient le problème, mais déjà, je pense que parcourir le fichier par caractère n'est pas la meilleure solution.
Tu manipules ton fichier à l'aide d'un flux wifstream, utilise donc les opérateurs de flux >> et << . Ca nécessite une petite transformation de tes fichiers, par exemple tu considères que l'identifiant est le numéro de ligne (ce que je fais, et je stocke tout dans un tableau au lieu d'une map), auquel cas, tu peux directement récupérer ta valeur avec
Code c++ :
textFile >> value
(Peut être une étape intermédiaire en passant par un tableau de wchar_t)
Ou alors, si tu tiens vraiment à ton identifiant, tu peux faire une ligne sur deux (value/identifier), mais je ne suis pas sûr que ce soit vraiment une bonne idée.
Hors ligne
16-03-2011 10:39:55
- Metallizer
- Membres

- Date d'inscription:
- Messages: 100
- IP: 212.19.170.66
- Courriel Site web
Oui justement, c'est le fait d'avoir identifiant=valeur qui fait que je voulais lire caractère par caractère, ça permettait de savoir si au moment du premier égal trouvé, on passe de l'identifiant à la valeur dans l'analyse.
A la rigueur je peux transformer mon traitement pour qu'à chaque ligne récupéré par les opérateurs de flux, j'analyse aussi caractère par caractère...
Merci pour ton intervention ^^
Hors ligne



