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++

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 114
    Points : 44
    Points
    44
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu positionnes ton curseur à la fin et tu remontes.
    Boost ftw

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    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
    Points : 4 625
    Points
    4 625
    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.
    Boost ftw

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Ben pour lire dans l'autre sens, c'est pareil... (enfin je vois pas l'intérêt de garder la position de départ et de reculer de deux à chaque fois, il suffit de faire un peek).
    std::getline c'est pas magique.
    Boost ftw

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    On pourrait réduire l'éventuelle perte de performance en utilisant un buffer. Par exemple on lit les 100 derniers caractères, on parcourt le tableau interne à partir de la fin et le recharge si on arrive au début.
    Mais bon, quoi qu'on puisse inventer, ce sera quand même plus simple de s'interroger sur la nécessité de savoir lire un fichier à partir de la fin.

  9. #9
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    koala1 > push_front n'existe pas pour un vector. Avec une deque ou list éventuellement.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par HanLee
    koala1 > push_front n'existe pas pour un vector. Avec une deque ou list éventuellement.
    ouppsss.... sorry

    Bon, ben, que penser de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabresult.insert(tabresult.begin(),str):
    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

  11. #11
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Oui ça marche aussi.

    - Pourquoi vouloir s'en tenir à vector sinon ?
    - Ou sinon, on peut s'en tenir à ta proposition, avec les reverse_iterator. (c'est ce que je préfère, c'est peut-être pas pertinent de stocker un fichier dans l'ordre inverse).

  12. #12
    Membre actif
    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
    Points : 280
    Points
    280
    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