11
votes

C ++: Utilisation de ifstream avec GetLine ();

Vérifiez ce programme xxx

le fichier hey.txt a beaucoup de caractères. Bien sur un 1000

mais ma question est Pourquoi dans la deuxième fois que j'essaie d'imprimer une ligne. Il ne reçoit pas d'impression?


0 commentaires

4 Réponses :


49
votes

La manière idiomatique de lire des lignes à partir d'un flux est la suivante: xxx

notes:

  • non ferme () . C ++ s'occupe de la gestion des ressources pour vous lorsqu'il est utilisé idiomatiquement.

  • Utilisez le fichier std :: getline , pas la fonction membre du flux.


7 commentaires

Cela n'aide réellement pas mon problème du tout


@ MohamedahmedNabilal: Vous ne vérifiez jamais la valeur de retour de vos opérations d'entrée. Il est donc tout à fait impossible de dire ce que fait votre programme.


La première fois que je imprime la ligne, il imprime les 99 premiers caractères, mais la prochaine fois que je fais qu'il imprime rien


@MohamedahMédNabil: voir ci-dessus. Si vous ne vérifiez pas la condition d'erreur après getline , Il n'y a aucune garantie que quelque chose sera le cas .


Je dois faire le fichier in.clear () entre chaque ligne de gaine pour que cela fonctionne. Est-ce que tu sais pourquoi?


Le problème est qu'il est considéré comme une défaillance s'il n'y a pas de nouvelle ligne dans les 98 caractères et, par conséquent, le flux est mis en mode défaillance, c'est-à-dire stdbit :: ios_base :: écheckbit est défini. Avec ce bit, le flux n'extrait aucun des caractères. Étrangement, cependant, il modifie la matrice de caractères pour stocker un caractère null dans le prochain, c'est-à-dire le premier emplacement.


C'est ainsi le moyen le plus idiomatique dont on traite avec le flux.



13
votes

Selon la référence C ++ ( ici ) GetLine définit le iOS :: échouer lorsque le nombre de caractères Compter-1 a été extrait. Vous devriez appeler filein.clear (); entre les getline () appels.


4 commentaires

Certaines explications de votre réponse seraient super. Qu'est-ce que iOS :: échouer et ce qui se passe: D


J'aime les gens comme toi, me poussant d'avancer comme ça. Merci encore


Il existe plusieurs bits qui gardent une trace de l'état interne d'un flux défini dans STD :: iOS_Base: Goodbit, Badbit, échec, Eofbit. Lorsque l'un des bits «mauvais» est défini, le flux arrête de lire et d'évaluer en faux (par exemple, utilisé comme pendant condition). C'est pourquoi Kerrek SB a suggéré d'utiliser la boucle tandis que.


Les bits n'affectent que le flux. Rien n'arrive vraiment au fichier.



1
votes

Comme Kerrek SB a dit correctement, il y a 2 possibilités: 1) La deuxième ligne est une ligne vide 2) Il n'y a pas de deuxième ligne et de plus de 1000 caractères est en une seule ligne, donc seconde getline n'a rien à obtenir.


1 commentaires

En fait, même s'il s'agissait d'une ligne, GetLine devrait continuer là où il s'est arrêté



2
votes
#include<iostream>
using namespace std;
int main() 
{
ifstream in;
string lastLine1;
string lastLine2;
in.open("input.txt");
while(in.good()){
    getline(in,lastLine1);
    getline(in,lastLine2);
}
in.close();
if(lastLine2=="")
    cout<<lastLine1<<endl;
else
    cout<<lastLine2<<endl;
return 0;
}

1 commentaires

Bien que ce code puisse résoudre la question, y compris une explication de la manière et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre poster et aboutit probablement à plus de votes ultérieurs. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement la personne qui demande maintenant. S'il vous plaît Modifier Votre réponse Pour ajouter des explications et donner une indication de quelles limitations et hypothèses s'appliquent.