compter le nombre de lignes dans un fichier texte
Je suis en train de lire les lignes hors de fichier texte, et je me demande si c'est une bonne façon de procéder? J'ai dû écrire la fonction numberoflines
diminution de la number_of_lines variable
par un car à l'intérieur de la boucle while, pour chaque ligne il lire il ajoute 2 à la number_of_lines variable.
#include <iostream>
#include <fstream>
using namespace std;
int number_of_lines = 0;
void numberoflines();
int main(){
string line;
ifstream myfile("textexample.txt");
if(myfile.is_open()){
while(!myfile.eof()){
getline(myfile,line);
cout<< line << endl;
number_of_lines++;
}
myfile.close();
}
numberoflines();
}
void numberoflines(){
number_of_lines--;
cout<<"number of lines in text file: " << number_of_lines << endl;
}
Est-il des autres plus facile de mieux?
source d'informationauteur silent
Vous devez vous connecter pour publier un commentaire.
Votre hack de décrémenter le comte à la fin correspond à un hack.
De loin préférable d'écrire votre boucle correctement en premier lieu, de sorte qu'il ne prend pas en compte la dernière ligne deux fois.
Personnellement, je pense que dans ce cas, C-code de style est parfaitement acceptable:
Edit: bien sûr, C++ vous permettra aussi de faire quelque chose d'un peu similaire:
Je pense que votre question est, "pourquoi suis-je en obtenir un plus de ligne qu'il y a dans le fichier?"
Imaginer un fichier:
Le fichier peut être représenté en ASCII comme ceci:
(Où
\n
est le byte0x10
.)Maintenant, nous allons voir ce qui se passe avant et après chaque
getline
appel:Maintenant, vous pensez que le flux de la marque
eof
pour indiquer la fin du fichier, non? Nope! C'est parce quegetline
jeux deeof
si la fin de fichier marqueur est atteint "à l'époque de l'opération". Parce quegetline
s'arrête lorsqu'il atteint\n
la fin-de-fichier marqueur n'est pas lu, eteof
n'est pas marqué. Ainsi,myfile.eof()
retourne false, et la boucle passe par un autre itération:Comment voulez-vous résoudre ce problème? Au lieu de vérifier
eof()
voir si.peek()
retourneEOF
:Vous pouvez également vérifier la valeur de retour de
getline
(implicitement casting bool):