2010-11-10 6 views
0

J'ai écrit une fonction assez simple qui lit dans les noms de joueurs possibles et les stocke dans une carte pour une utilisation ultérieure. Fondamentalement dans le fichier, chaque ligne est un nouveau nom de joueur possible, mais pour une raison quelconque, il semble que tout, mais le nom de famille a un nouveau caractère de ligne invisible après. Mon impression le montre comme ceci ...Caractère de nouvelle ligne dans un document texte?

nameLine = Georgio 

Name: Georgio 
0 
nameLine = TestPlayer 

Name: TestPlayer 0 

Voici le code actuel. Je suppose que je dois retirer quelque chose, mais je ne suis pas sûr de ce que je dois vérifier.

bool PlayerManager::ParsePlayerNames() 
{ 
    FileHandle_t file; 
    file = filesystem->Open("names.txt", "r", "MOD"); 

    if(file) 
    { 
     int size = filesystem->Size(file); 
     char *line = new char[size + 1]; 

     while(!filesystem->EndOfFile(file)) 
     { 
      char *nameLine = filesystem->ReadLine(line, size, file); 

      if(strcmp(nameLine, "") != 0) 
      { 
       Msg("nameLine = %s\n", nameLine); 
       g_PlayerNames.insert(std::pair<char*, int>(nameLine, 0)); 
      } 

      for(std::map<char*,int>::iterator it = g_PlayerNames.begin(); it != g_PlayerNames.end(); ++it) 
      { 
       Msg("Name: %s %d\n", it->first, it->second); 
      } 
     } 

     return true; 
    } 

    Msg("[PlayerManager] Failed to find the Player Names File (names.txt)\n"); 
    filesystem->Close(file); 
    return false; 
} 
+0

Soyez prudent lorsque vous utilisez 'char *' comme clé dans une carte. Utilisez plutôt 'std :: string' pour représenter les chaînes. –

+0

Comment le fichier names.txt ressemble (ce qui donne le résultat ci-dessus)? – Default

+0

Êtes-vous sûr que ReadLine ne lit pas le caractère de nouvelle ligne? – Default

Répondre

1

ReadLine inclut clairement la nouvelle ligne dans les données qu'elle renvoie. consultez et supprimer:

char *nameLine = filesystem->ReadLine(line, size, file); 

// remove any newline... 
if (const char* p_nl = strchr(nameLine, '\n')) 
    *p_nl = '\0'; 

(Qu'est-ce que cela ne fait remplacer le caractère de nouvelle ligne avec un nouveau terminaison NUL, qui tronque efficacement la chaîne ASCIIZ à ce moment

+0

Cela a fonctionné parfaitement, merci. –

+0

Bon à entendre - de rien. –

0

Très probablement la fonction ReadLine lit aussi le caractère de nouvelle ligne. Je suppose que votre fichier n'a pas de nouvelle ligne à la dernière ligne, donc vous n'obtenez pas de nouvelle ligne pour ce nom. Mais jusqu'à ce que je sache ce que filesystem, FileHandle_t et Msg est, il est très difficile de déterminer où le problème pourrait être.

2

Vous devez vraiment envisager d'utiliser iostreams. . et std :: string le code ci-dessus est beaucoup plus simple si vous utilisez le C++ construit à votre

problèmes avec votre code:.

  1. pourquoi yo u allouer un tampon pour une seule ligne qui est la taille du fichier?
  2. Vous ne nettoyez pas ce tampon!
  3. Comment ReadLine remplit le tampon line?
  4. vraisemblablement nameLine des points au begining du tampon line, le cas échéant, compte tenu de la std::map, la clé est un pointeur (char*) plutôt qu'une chaîne que vous attendiez, et le pointeur est le même! Si différent (c'est-à-dire que vous lisez une ligne puis déplacez le pointeur pour chaque nom, alors std::map contiendra une entrée par joueur, mais vous ne pourrez pas trouver une entrée par nom de joueur car la comparaison sera une comparaison de pointeur plutôt que d'une comparaison de chaînes que vous attendez!

Je suggère que vous regardez à mettre en œuvre ce en utilisant iostreams, voici quelques exemples de code (sans test)

ifstream fin("names.txt"); 
std::string line; 
while (fin.good()) 
{ 
    std::getline(fin, line); // automatically drops the new line character! 
    if (!line.empty()) 
    { 
    g_PlayerNames.insert(std::pair<std::string, int>(line, 0)); 
    } 
} 
// now do what you need to 
} 

Pas besoin de faire tout manuel gestion de la mémoire, et std::map est tapé avec std::string!

Questions connexes