IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

parcourir un fichier dans l'ordre inverse


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 114
    Par défaut parcourir un fichier dans l'ordre inverse
    je voudrais savoir comment je peux parcourir un fichier dans l'ordre inverse. par exemple, j'utilise getline() pour lire le fichier ligne par ligne du début à la fin de fichier.
    Existe t-il un mécanisme pour parcourir le fichier de la fin vers le début?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il n'y a rien à proprement parler qui est prévu pour cela...

    Simplement, parce que un fichier, c'est comme un livre: ca commence en haut de la page 1 pour finir en bas de la dernière page...

    Par contre, si la taille du fichier le permet, tu peux envisager de le charger entièrement, en le lisant du début à la fin, dans un tableau dans lequel l'ordre des lignes serait inversé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::ifstream ifs("monfichier.txt");//le fichier à lire
    std::string str; //une chaine pour la lecture
    std::vector<std::string> tabresult;// un tableau contenant les chaine lue
    while(std::getline(ifs,str))
    {
        tabresult.push_front(str);//insertion de la chaine au début du vecteur
    }
    ou, tu peux également envisager d'insérer les chaines dans l'ordre dans lequel elles sont lues (avec tabresult.push_front) et de parcourrir le taleau dans l'ordre inverse (avec rbegin(), rend() etc)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu positionnes ton curseur à la fin et tu remontes.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Bah non, pour lire ligne par ligne ça ne fonctionnera pas.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Et pour quelle raison ça ne fonctionnerait pas ?
    Tu lis à l'envers caractère par caractère jusqu'à rencontrer le caractère de fin de ligne ou jusqu'à arriver au début. Tu mets ça dans un buffer, que tu renvoies une fois le marqueur trouvé : ça te fait une ligne.
    Après avec un peu plus d'astuce t'es pas obligé de lire caractère par caractère.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Sauf que, déjà, le fait de lire un fichier en partant du début et en remontant, cela signifie:
    1. Garder la position de départ
    2. aller à la fin
    3. remonter d'un caractère pour commencer
    4. lire le caractère
    5. remonter de deux caractere pour fois suivantes
    6. lire un caractère
    7. recommencer en 5 jusqu'à ce qu'on aie lu tout le fichier...

    Sans oublier la gestion de chaque caractère qui est lu (pour le placer au bon endroit dans la chaine lue)

    Ca fait, à mon gout, relativement lourd à gérer, alors que la lecture du début à la fin en gardant les informations dans l'ordre qui nous intéresse est, malgré tout, plus facile

    D'autant plus que, finalement, s'il n'y a qu'un nombre de lignes précis qui se trouve en fin de fichier (lecture d'un fichier de log, par exemple), il est toujours possible de limiter le nombre de chaines mises dans le tableau
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé
    Profil pro
    Ingenieur
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingenieur

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Bonjour,

    j`ai un probleme du meme ordre moi aussi.

    Concernant la remarque de koala:
    Citation Envoyé par koala01
    Simplement, parce que un fichier, c'est comme un livre: ca commence en haut de la page 1 pour finir en bas de la dernière page...
    Je ne suis pas daccord, dans mon cas j ai un fichier 1.3Go et ce qui m interesse c est seulement la derniere occurence d une information qui m interesse....donc je n ai aucun interet a lire le fichier depuis le debut sachant que l information recherchee se situe a la fin

    Citation Envoyé par koala01
    Par contre, si la taille du fichier le permet, tu peux envisager de le charger entièrement, en le lisant du début à la fin, dans un tableau dans lequel l'ordre des lignes serait inversé:
    Dans mon cas vu la taille du fichier ce n est pas faisable donc je vais plutot faire une lecture par block en remontant le fichier progressivement a l aide de seekg

Discussions similaires

  1. requete avec un resultat dans l'ordre inverse de la table
    Par hellalaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/09/2009, 12h27
  2. Lister fichiers dans l'ordre alphabétique
    Par RENAUDER dans le forum Langage
    Réponses: 1
    Dernier message: 07/02/2009, 09h31
  3. tar : fichiers dans l'ordre de taille
    Par gifffftane dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 25/01/2008, 14h03
  4. fichier dans l'ordre alphabétique avec dirent
    Par drasalmed dans le forum POSIX
    Réponses: 6
    Dernier message: 03/12/2007, 23h19
  5. Afficher des fichiers dans l'ordre chronologique
    Par navis84 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2006, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo