2010-03-10 7 views
0

Dans mon programme, fin est un objet ifstream et song est un string. Lorsque le programme s'exécute, il ouvre music.txt et lit à partir du fichier.C++: getline() ignorant les premiers caractères

J'essaie de lire chaque ligne avec: getline(fin,song);

J'ai essayé toutes les variantes de getline mais il ignore les 10 premiers caractères de chaque ligne avant de commencer à saisir des caractères. Par exemple, si le nom de la chanson est "songsongsongsongsongname", il se peut qu'elle ne prenne que "songname".

Des idées?

Voici le code simplifié:

void Playlist::readFile(ifstream &fin, LinkedList<Playlist> &allPlaylists, LinkedList<Songs*> &library) 
{ 
    string song; 
    fin.open("music.txt"); 
    if(fin.fail())   
    { 
     cout << "Input file failed. No saved library or playlist. Begin new myTunes session." << endl << endl; 
    } 
    else 
    { 
     while(!fin.eof() && flag) 
     { 
       getline(fin, song);  
       cout << song << "YES." << endl; 
       } 
.....} 
+1

Poster une source compilable minimale. Notez également que tant de contrôles ne sont généralement pas nécessaires: 'while (getline (fin, song)) {...}' est assez bon. – dirkgently

+0

Eh bien, votre variable 'flag' n'est pas définie. –

+0

J'ai pris l'initialisation "flag" lors de la simplification du code. Cela devrait être vrai. Voyez-vous quelque chose de mal avec la syntaxe getline/utilisation ci-dessus? – Gabe

Répondre

0

Une version fixe:

void Playlist::readFile(std::string const& filename, ...) { 
    std::ifstream fin(filename.c_str()); 
    if (!fin) throw std::runtime_error("Unable to open file " + filename); 
    for (std::string song; std::getline(fin, song);) { 
     ... 
    } 
} 

Plus important encore, j'ai enlevé le test de .eof(). Vous ne pouvez pas l'utiliser pour tester si vous pouvez en lire plus et vous ne pouvez pas non plus l'utiliser pour tester si la lecture précédente a réussi ou non. La vérification du succès d'une opération antérieure peut être effectuée en vérifiant l'indicateur d'échec, ou le plus souvent en testant le flux lui-même.

0

donner un essai de cette façon,

... 
else 
{ 
    while(fin) 
    { 
     getline(fin, song); //read first 
     if(!fin.eof() && flag) //detecting eof is meaningful here because 
     {      //eof can be detected only after it has been read 
      cout << song << "YES." << endl; 
     } 
    } 
} 
Questions connexes