#0 

15-03-2011 11:05:26

Metallizer
Abonné
Lieu: Région Parisienne
Date d'inscription: 07-01-2007
Messages: 100
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 :

Code:

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 == '\n' || currentChar == '\r') {
        // Ici, la console affiche : "translation added: test = 0x22cc0c0" sad
        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

Dernière modification par Metallizer (15-03-2011 11:06:03)

Hors ligne


#1 

15-03-2011 16:37:01

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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


#2 

16-03-2011 11:39:55

Metallizer
Abonné
Lieu: Région Parisienne
Date d'inscription: 07-01-2007
Messages: 100
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é
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
46 invités en ligne
Aucun membre connecté
RSS Feed