Mais pour aller la chercher dans le fichier, tu es obligé de le parcourir, et lire chaque ligne, quit a ne pas les garder en mémoire, ne garder que la i_ième que tu veux
Arg. Le tuto a une erreur sur la lecture des lignes. J'espère que cela sera patché prochainement.
Sinon, on peut procéder de la sorte, qui sera un chouilla plus efficace que de jouer avec getline.
// syntaxe de mémoire
for (size_t i=0; i<n && fichier.ignore(std::numeric_limit<std::streamsize>::max(), "\n") ; ++i)
{}
std::string ligne;
if (std::getline(fichier, ligne) {
cout << "La " << (n+1) << "e ligne est :" << ligne << "\n";
}
malekith25, lmghs a raison. J'ai moi-même eu ce problème sa méthode est optimale tu devrais l'adopter. Voici un tutoriel très utile pour compléter celui de m@théo21 et nanoc. Dans l'exemple de fin de ce tutoriel j'ai ajouter un bout de code qui extrait une ligne particulière dans un texte conformément à la méthode de lmghs:
#include <iostream>
#include <fstream>
#include <string>
#include <limits> // pour utiliser numeric_limits<int>::max()
using namespace std;
int main()
{
string toto = "toto.txt";
ifstream fichier_toto(toto.c_str(), ios::in);
if(fichier_toto.fail())
cout << "Le fichier " << toto << " n'existe pas !" << endl;
ifstream fichier("D:/docs/cours/test.txt", ios::in);
if(!fichier.fail())
{
cout << "Le fichier existe bien et est correctement ouvert !" << endl;
cout << "A l'ouverture du fichier, le curseur de trouve a l'octet " << fichier.tellg() << "." << endl << endl;
cout << "Le fichier contient : " << endl << endl;
string ligne;
while(getline(fichier, ligne))
cout << ligne << endl;
cout << endl << "Une fois tout le fichier lu, le \"eofbit\" est passe a " << boolalpha << fichier.eof() << "." << endl;
/* boolalpha sert à afficher en toutes lettres un booléen */
cout << endl << "Pour revenir au debut du fichier, on peut tenter un \"fichier.seekg(0, ios::beg\". Est-ce que ca a fonctionne ?" << endl;
fichier.seekg(0, ios::beg);
cout << endl << "On se trouve au " << fichier.tellg() << "ieme octet." << endl;
if((int)fichier.tellg() != 0)
{
cout << "Oh non, ca n'a pas fonctionne ! Je vais tenter de faire un \"fichier.clear()\"." << endl;
fichier.clear();
fichier.seekg(0, ios::beg);
cout << endl << "On se trouve au " << fichier.tellg() << "ieme octet." << endl;
}
int nbLignes(0);
while(fichier.ignore(numeric_limits<int>::max(), '\n'))
nbLignes++;
cout << "Le fichier contient " << nbLignes << " lignes." << endl;
cout << "Comme on a parcouru a nouveau le fichier, le \"eofbit\" est passe a " << boolalpha << fichier.eof() << "." << endl;
cout << "Faisons à nouveau \"fichier.clear()\"." << endl;
fichier.clear();
fichier.seekg(0, ios::beg);
cout << endl << "On se trouve à nouveau au " << fichier.tellg() << "ieme octet." << endl;
cout << endl << "Cherchons la 4ieme ligne de notre fichier" << endl;
for(size_t nbLignes=0; nbLignes<3 && fichier.ignore(numeric_limits<int>::max(), '\n'); ++nbLignes)
{
// Ne rien mettre ici.
/* La boucle parcourt simplement le fichier tout en ignorant ce qu'elle y trouve (elle ne conserve rien en mémoire)
et a la 4ieme ligne, elle s'arrete. */
}
if(getline(fichier,ligne))
cout << "La 4ieme ligne de notre fichier est " << ligne << endl;
/* La condition 'if' récupère la ligne où nous nous sommes arretes */
fichier.close();
}
else
cerr << "Impossible d'ouvrir le fichier !" << endl;
return 0;
}
Bon codage.
Aller a une ligne d'un fichier
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html