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

Langage C++ Discussion :

Obtenir la dernière ligne d'un fichier


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut [résolu]Obtenir la dernière ligne d'un fichier
    Bonjour à tous,

    Je cherche à obtenir la dernière ligne d'un fichier sans lire le fichier en entier (car il fait 500 000 lignes).
    J'ai trouvé ce code (message de sea otter) : http://www.webhostingtalk.com/archiv.../t-327009.html
    Je comprends ce que fais ce code mais pas la démarche algorithmique. Notamment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    is.seekg(length-min(length,_LL_BUFFSIZE_),ios::beg); // seek back from end a short ways
    Ca n'a aucun sens pour moi. Cette ligne place le curseur à length du début du fichier (c'est-à-dire à la fin) ou à BUFFSIZE si ce dernier est inférieur. WTF ?

    La suite m'est tout aussi incompréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // read in each line of the file until we're done
    buff[0]=0;
    do {
    // uncomment if you want to skip empty lines or lines that start with whitespace
    // fancier logic is probably called for
    /*
    if (!isspace(buff[0]) && buff[0] != 0)
    lastLine = buff;
    */
    } while (is.getline(buff, _LL_BUFFSIZE_));
    A commencer par la seule affectation de lastLine qui est commentée par défaut... De toute évidence ce code est faux.
    Pourtant le demandeur semble satisfait.

    Donc :
    1) Que fait ce code ?! Est-ce qu'il vaut quelque chose moyennant une correction ?
    2) Sinon comment obtenir la dernière ligne d'un fichier sans le lire (avec seekg(ios::end) je suppose) sachant qu'on ne connait pas la longueur de celle-ci ?

    Merci d'avance.
    Dernière modification par Invité ; 09/07/2010 à 11h11. Motif: résolu

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fichier.seekg( 0 , std::ios_base::end );
    Trouvé ici.

  3. #3
    Invité
    Invité(e)
    Par défaut
    seekg(0,end) permet de me placer à la fin du fichier. Donc à la fin de la dernière ligne. Qui est souvent un newline qui plus est.
    Cela ne me permet donc pas de me placer au début de la dernière "vraie" ligne pour pouvoir la lire.
    (merci quand même !)

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Le code a effectivement un problème pas mais le principe est là : lire bloc par bloc le fichier à partir de la fin pour rechercher le dernier '\n'.

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Je ne pense pas que le code ait un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    is.seekg(length-min(length,_LL_BUFFSIZE_),ios::beg);
    si length est =< _LL_BUFFSIZE_, on se retrouve au début du fichier.

    si length est > _LL_BUFFSIZE, on se retrouve à l'offset length - _LL_BUFFSIZE, et donc, on analyse le dernier "bloc" du fichier.

  6. #6
    Invité
    Invité(e)
    Par défaut
    @Sylvain :
    Okay je comprends le principe, mais, en supposant que ce qui est commenté ne l'est pas... et en supposant qu'on affecte pas un int (0) à un char (buff[0])...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    buff[0]='0';
    do {
    if (!isspace(buff[0]) && buff[0] != '0')
    lastLine = buff;
    } while (is.getline(buff, _LL_BUFFSIZE_));
    Je ne vois vraiment pas comment ce code peut sortir lastLine. Ni comment faire.


    @white_tentacle : Le code que tu cites n'a pas de problème, cf. ci dessus.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    le caractère '0' et le caractère avec le code ASCII 0 sont deux chose différente, buff[0] = 0 est équivalent à buff[0] = '\0'.
    '\0' représente la fin d'une chaine de caractère.

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Déroule le code pas à pas, en regardant ce que fait chaque fonction (notamment, le is.getline qui est en réalité celui qui fait tout le travail). Il fait bien ce qu'il prétend faire. A la sortie de la boucle, buff contient la dernière ligne du fichier (sauf si elle est plus longue que _LL_BUFFSIZE_). Si tu décommentes, c'est lastLine qui contiendra la dernière ligne non vide (même remarque).

    Tu as fait une petite erreur en recopiant le code, d'ailleurs : c'est bien buff[0]=0; et non buff[0]='0';

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ignorais qu'on pouvait représenter le caractère de fin de chaine par un simple zéro.

    Okay.
    Ce qui m'a induit en erreur c'est qu'en effet il y a une erreur dans ce code : lastLine = buff; n'aurait pas dû être commenté ; même si on veut skipper les sauts de lignes et les espaces en fin de fichier, on veut quand même affecter lastLine !
    En fait ce code est trivial, ça revient au même que lire le fichier en entier pour avoir la dernière ligne au dernier appel de getline, sauf qu'on se place un peu avant la fin.
    Je crois que tout est ok. (dites-le moi sinon...)
    Merci à vous deux !


    Edit : Ah oui, j'ai mis en résolu mais idéalement il faudrait un code générique qui marche quel que soit la longueur de la dernière ligne. Je pense à un truc à base de seekg(i,end); i--; dans un while(!file.get('\n')).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SPOOL : Effacer dernière ligne vide du fichier.
    Par Ujitsu dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 30/07/2007, 18h15
  2. lire les X dernières lignes d'un fichier.
    Par Empty_body dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2007, 11h58
  3. Effacer la dernière ligne d'un fichier texte
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2007, 11h52
  4. Supprimer 1ère et dernière ligne d'un fichier
    Par yabbiyou dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/03/2007, 09h05
  5. Comment lire la dernière ligne d'un fichier text.
    Par Ardely dans le forum Delphi
    Réponses: 29
    Dernier message: 20/01/2007, 23h29

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