2009-01-25 7 views
8

Comment puis-je détecter et passer à la ligne suivante en utilisant std :: ifstream?ifstream, fin de ligne et passer à la ligne suivante?

void readData(ifstream& in) 
{ 
    string sz; 
    getline(in, sz); 
    cout << sz <<endl; 
    int v; 
    for(int i=0; in.good(); i++) 
    { 
     in >> v; 
     if (in.good()) 
      cout << v << " "; 
    } 
    in.seekg(0, ios::beg); 
    sz.clear(); 
    getline(in, sz); 
    cout << sz <<endl; //no longer reads 
} 

Je sais bien cela me dire si une erreur est survenue, mais le flux ne fonctionne plus une fois que cela arrive. Comment puis-je vérifier si je suis à la fin de la ligne avant de lire un autre int?

Répondre

3

Vous devez effacer l'état d'erreur du flux avec in.clear(); après la boucle, puis le flux fonctionnera à nouveau comme si aucune erreur ne s'était produite.

Vous pouvez également simplifier la boucle:

while (in >> v) { 
    cout << v << " "; 
} 
in.clear(); 

Les rendements d'extraction de flux si l'opération a réussi, vous pouvez le tester directement sans vérifier explicitement in.good();.

+0

Il est possible qu'un int valide soit immédiatement suivi de la fin du fichier. Pour considérer l'analyse comme un succès, vous devez vérifier in.fail() pour false, car in.good() retournera false si la fin du fichier est atteinte même si l'opération d'extraction a réussi. –

+0

Intéressant Charles! –

+0

@Charles: L'opérateur implicite void * 'appelle' fail', donc 'while (in >> v)' réussira si l'extraction réussit, indépendamment de l'état EOF. – dalle

16

Utilisez ignorer() pour ignorer tout jusqu'à ce que la ligne suivante:

in.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 

Si vous devez le faire simplement vérifier manuellement le caractère othe pour voir si est « \ n »

char next; 
while(in.get(next)) 
{ 
    if (next == '\n') // If the file has been opened in 
    { break;  // text mode then it will correctly decode the 
    }     // platform specific EOL marker into '\n' 
} 
// This is reached on a newline or EOF 

C'est probablement échouer parce que vous faites une recherche avant d'effacer les mauvais bits.

in.seekg(0, ios::beg); // If bad bits. Is this not ignored ? 
          // So this is not moving the file position. 
sz.clear(); 
getline(in, sz); 
cout << sz <<endl; //no longer reads 
Questions connexes