2014-07-25 4 views
0

(Désolé si mes sentances sont pleines de mystakes, je ferai de mon mieux pour écrire quelque chose de lisible) Salut, je travaille sur une fonction qui lit un fichier et stocke chaque ligne dont le premier char est ":" et supprime chaque tiret contenu dans la chaîne. Chaque fois que ce type de ligne est trouvé, push_back() est utilisé pour stocker cette ligne dans un vecteur. Le problème est que chaque fois que push_back() est utilisé, tous les éléments du vecteur prennent la valeur du dernier. Je ne comprends pas pourquoi cela arrive. Voici le code:std :: vecteur fait chose étrange

string listContent; 
size_t dashPos; 
vector<char*>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     char* c_listContent = (char*)listContent.c_str(); 
     cTagsList.push_back(c_listContent); 
    } 
} 

J'ai d'abord pensé qu'il avait un problème avec la fin du fichier, mais le processus de l'interruption recherche avant d'arriver à ce point donne les mêmes résultats.

+2

Tout d'abord, [ 'while (! Eof())' est faux.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) Deuxièmement, transtyper le résultat de 'c_str' en' char * 'est très mauvais. Troisièmement, ce pointeur est invalide dès que vous modifiez la chaîne, ce qui arrive juste après. Utilisez un vecteur de 'std :: string'. De toute façon, vous ne supprimez pas tous les tirets, vous supprimez tout après et y compris le premier tiret. Utilisez 'std :: remove' et associez-le avec' erase'. – chris

+3

Ne stockez pas les résultats de 'c_str'! Au lieu de cela, faites juste 'std :: vector cTagsList;' à la place et juste 'cTagsList.push_back (listContent);' – crashmstr

+0

utilisez char * uniquement lorsque vous traitez avec c pur, vous avez des chaînes en C++ – blade

Répondre

2

la c_str() - Méthode de std::string états:

Le pointeur renvoyé peut être invalidé par d'autres appels vers d'autres fonctions membres qui modifient l'objet.

Si vous êtes autorisé à utiliser un std :: vector < std :: string> au lieu du vecteur de char *, vous êtes très bien car il y aurait toujours une copie de la std :: string listContent poussé dans le vecteur, à savoir.

std::string listContent; 
size_t dashPos; 
std::vector<std::string>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     cTagsList.push_back(listContent); 
    } 
} 

(je ne l'ai pas testé)

+0

Comme je l'ai répondu au premier message, j'ai besoin d'un caractère, mais je vais essayer de l'obtenir en convertissant un std :: vecteur en un caractère, merci pour l'aide – Faeralis

+0

@ La lame de Faeralis indiquait déjà l'opérateur [] de std :: string qui fournit un accès aléatoire à chaque caractère de la chaîne et ce que vous pouvez faire alternativement est d'utiliser .c_str() comme vous le faisiez auparavant, mais sur les chaînes déjà stockées dans la chaîne. Vector –

+0

C'est ce que j'ai essayé et j'ai travaillé. – Faeralis