#1 

15-03-2011 10:05:26

Metallizer
Membres
Avatar de Metallizer
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 smile


Hors ligne


#2 

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


#3 

16-03-2011 10:39:55

Metallizer
Membres
Avatar de Metallizer
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


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
139 invités en ligne
membre en ligne: -
RSS Feed