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 :

Positionnement avec fseek


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 54
    Par défaut Positionnement avec fseek
    Je lis un fichier physique créé par blocs note auquel je dois accéder par un index.chaque enreg est une chaine de caracteres.
    Donc j'utilise fseek puis fgets mais ça ne marche pas du tout, il y a toujours un décalage.
    Je n'y comprends rien
    Quelqu'un a une idée ? Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Il faudrait que tu postes ton code, car on ne peut pas deviner où est le problème sinon.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    fseek ne marche pour des fichiers texte que sous certaines conditions restrictives :
    - le déplacement doit être 0 ou une valeur retournée par ftell
    - le paramètre de positionnement doit être SEEK_SET

    Si tu dois te positionner sur une ligne d'un fichier texte, utilise fgets pour sauter les lignes précédentes (Et là tu pourras faire un ftell si tu as besoin de te repositionner plus tard sur cette même ligne)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 54
    Par défaut
    ok j'essaye ça. Merci

  5. #5
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    fseek ne marche pour des fichiers texte que sous certaines conditions restrictives :
    - le déplacement doit être 0 ou une valeur retournée par ftell
    - le paramètre de positionnement doit être SEEK_SET
    Ca sort d'où ?????????

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Ca sort d'où ?????????
    de la norme!
    7.19.9.2 The fseek function
    Synopsis
    1 #include <stdio.h>
    int fseek(FILE *stream, long int offset, int whence);

    Description
    2 The fseek function sets the file position indicator for the stream pointed to by stream. If a read or write error occurs, the error indicator for the stream is set and fseek fails.

    3 For a binary stream, the newposition, measured in characters from the beginning of the file, is obtained by adding offset to the position specified by whence.The specified position is the beginning of the file if whence is SEEK_SET,the current value of the file position indicator if SEEK_CUR,orend-of-file if SEEK_END.Abinary stream need not meaningfully support fseek calls with a whence value of SEEK_END.

    4 For a text stream, either offset shall be zero, or offset shall be a value returned by an earlier successful call to the ftell function on a stream associated with the same file and whence shall be SEEK_SET.

    5 After determining the newposition, a successful call to the fseek function undoes any effects of the ungetc function on the stream, clears the end-of-file indicator for the stream, and then establishes the newposition. After asuccessful fseek call, the next operation on an update stream may be either input or output.

    Returns
    6 The fseek function returns nonzero only for a request that cannot be satisfied.

  7. #7
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Effectivement, la norme qui, je l'avoue, n'est pas mon livre de chevet, indique bien cela mais les raisons de cette régression m'échappent quelque peu (effet de bord pervers de la normalisation poussée à l'extrême ?).

    Personnellement, avec mes compilos GNU, je continuerai à faire des fseek dans tous les sens, depuis le début, l'endroit où je suis ou la fin quand cela est nécessaire, fichier texte ou pas !

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    La raison est pourtant très simple: Il est assez difficile de gérer les offsets et cie sur un système utilisant CR+LF comme fin de ligne (car la lecture d'un fichier en mode texte fait la conversion à-la-volée vers LF).

    Si l'on voulait avancer de 10 "octets" vers l'avant, doit-il s'agir d'octets réels ou d'octets virtuels?

    En clair, ce n'est pas une question d'extension GNU, mais de système: Tu auras des problèmes sous MinGW si tu agis en dépit de la norme.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Personnellement, avec mes compilos GNU, je continuerai à faire des fseek dans tous les sens, depuis le début, l'endroit où je suis ou la fin quand cela est nécessaire, fichier texte ou pas !
    C'est ton choix de développer des programmes non portables.


    Je crois que cela est dû à la définition très souple des fichiers texte qui fait que la représentation du contenu d'un fichier texte dans le programme peut différer du contenu physique du fichier. Alors, sans précautions, on ne sait pas trop où on se situe dans le fichier physique.

    Par compléter, la norme dit :

    7.19.2 Streams
    ....
    2 A text stream is an ordered sequence of characters composed into lines, each line consisting of zero or more characters plus a terminating new-line character. Whether the last line requires a terminating new-line character is implementation-defined. Characters may have to be added, altered, or deleted on input and output to conform to differing conventions for representing text in the host environment. Thus, there need not be a one-to-one correspondence between the characters in a stream and those in the external representation. Data read in from a text stream will necessarily compare equal to the data that were earlier written out to that stream only if: the data consist only of printing characters and the control characters horizontal tab and new-line; no new-line character is immediately preceded by space characters; and the last character is a new-line character.
    Whether space characters that are written out immediately before a new-line character appear when read in is implementation-defined.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 54
    Par défaut
    Bon ça marche avec ftell et fseek. Et apparemment ça ne marche pas autrement.
    En plus il faut faire attention avec l'éditeur du .txt (par ex bloc notes) car si on s'amuse à rajouter des blancs à la fin de la chaine de caracteres, cela peut compter comme des nouveaux enregistrements...

    Merci à tous de votre aide

Discussions similaires

  1. [Swing]Gestion du positionnement avec GridBagLayout
    Par yoshï dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/04/2006, 22h14
  2. [CSS]Problème de positionnement avec div
    Par Tueur_a_gage dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 26/10/2005, 00h48
  3. pb positionnement avec float
    Par jerome38000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/08/2005, 20h40
  4. Access violation avec fseek
    Par baleine dans le forum C
    Réponses: 7
    Dernier message: 18/03/2005, 17h41
  5. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 08h17

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