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 :

Se déplacer dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Se déplacer dans un fichier
    Bonjour, je souhaiterai me déplacer dans un fichier txt se remplissant au fur et à mesure double par double sur 7 colonnes de doubles espacé de \t.

    J'utilise pour le moment fsetpos et fgetpos avec des fpos_t et des fseek/ftellmais j'ai vu récemment je ne sais plus où que de mélanger les fseek et les fgetpos n'étaient pas bon. Je voudrais donc savoir comment unifier tout cela car j'effectue des remontées et des descente dans mon fichier danc les deux paires de fonctions me sont utiles...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // fseek me permet essentiellement de remonter caractère par caractère depuis la fin, c'est essentiellement cela que je souhaiterai faire exclusivement en fgetpos / fsetpos ...
    fseek(fic, -1, SEEK_END)...
     
    // fgetpos et fsetpos me permettent de me placer à la fin des fseek
    fgetpos(fic, &pos_a);
    Voilà, je voulais donc savoir si j'avais le droit de marier les deux sans perdre en fiabilité? Si non comment faire tout en fgetpos/fsetpos qui est le seul portable selon le man..Merci d'avance

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    D'après le man, fseek et ftell sont de l'AINSI C (C89 si je ne m'abuse), ils sont donc bel et bien portables.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Oui c'est ce que je me suis toujours dis mais là j'avais un besoin plus poussé des fonction de positionnement ce qui m'a permis de tomber sur ça :

    http://www.cplusplus.com/reference/cstdio/ftell/


    Il y a le petit commentaire //non portable à côté de la ligne qui correspond à l'utilisation de fseek que je souhaite faire. Est-ce que je me prends la t^te pour rien ou est-ce que cela a une importance?

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    fseek, ftell et fgetpos sont bien des fonctions standard, je ne vois pas en quoi ca ne serait pas portable...
    De meme pour SEEK_CUR, SEEK_END et SEEK_SET....

    Tout cela est par exemple present dans le paragraphe 7.19.9 de la norme C99.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    En allant sur la page dédiée à fseek(), on peut lire ceci http://www.cplusplus.com/reference/cstdio/fseek/
    For streams open in text mode, offset shall either be zero or a value returned by a previous call to ftell, and origin shall necessarily be SEEK_SET.

    If the function is called with other values for these arguments, support depends on the particular system and library implementation (non-portable).
    Mon interprétation est que ce n'est donc pas fseek() qui n'est pas portable, mais l'utilisation de SEEK_END (d'après cette page sur fseek(), je rajouterais "dans un flux texte" mais d'après l'exemple de code de la page que tu cites, je dirais plutôt "quelque soit le mode du flux").

    Ceci dit, la page de manuel ne dit rien sur une non portabilité : http://man.developpez.com/man3/fseek.3.php

    http://www.gnu.org/software/libc/man...sitioning.html donne une précision :
    Portability Note: In non-POSIX systems, ftell, ftello, fseek and fseeko might work reliably only on binary streams.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bktero Voir le message
    For streams open in text mode, offset shall either be zero or a value returned by a previous call to ftell, and origin shall necessarily be SEEK_SET.

    If the function is called with other values for these arguments, support depends on the particular system and library implementation (non-portable).
    Mon interprétation est que ce n'est donc pas fseek() qui n'est pas portable, mais l'utilisation de SEEK_END
    Bien vu mais moi j'irais même jusqu'à dire que SEEK_CUR doit aussi être évité...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet: Avec SEEK_CUR et n'importe quel offset (positif ou négatif), même 1, la norme ne précise pas ce qui se passe en mode texte si on tombe sur un \r\n...
    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.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Ouais donc son utilité reste limité si on ne peux utiliser que SEEK_SET avec les gros fichiers si tu veux aller à la fin depuis le début c'est un peu galère quoi. Car fgetpos et fsetpos ne font clairement pas tout. C'est bien la première fois que je suis aussi déçu d'une bibli standard...snif! En tout cas merci pour vos explications et interprétation ca m'a permis d'y voir plus clair. Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux quelque chose qui fait le café, ouvre ton fichier en mode binaire et gère les fins de ligne toi-même: Tu pourras alors utiliser fseek() à son plein potentiel.
    Ou bien, tu indexes le fichier, en le lisant une fois et en mémorisant les valeurs retournées par ftell() (ou fgetpos()) à chaque ligne par exemple.
    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.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bien vu mais moi j'irais même jusqu'à dire que SEEK_CUR doit aussi être évité...
    Oui aussi. Je cherchais juste à analyser le commentaire "non-portable" du code dont parlait le PO

    Pas bête l'idée de Médinoc de travailler en binaire.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Pas bête l'idée de Médinoc de travailler en binaire.
    Moui je suis pas certain que ce soit aussi marvellous.
    Parce qu'imagine le fichier texte contenant la ligne suivante:
    azerty
    Sous Unix, il sera écrit "azerty\n". Sous zindow (où tout le monde sait que pour eux simplicité égale performance), il sera écrit "azerty\r\n".

    Ensuite tu ouvres le fichier en binaire => ok. Puis tu demandes un fseek(fp, -2, SEEK_END) puis tu fais un fgetc().
    Ben sous Unix tu te retrouves à lire le 'y' mais sous zindow tu te retrouves à lire le '\r'...

    Citation Envoyé par zibzab Voir le message
    C'est bien la première fois que je suis aussi déçu d'une bibli standard...snif!
    Ben comme tu le vois, c'est pas vraiment la faute aux programmeurs de la bibli qui font ce qu'ils peuvent mais qui sont démunis face à certaines aberrations...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Non ce n'est pas marvellous. De toute façon, je ne crois pas qu'il y est de solution marvellous à ce genre de problème, bien que je ne me sois jamais réellement penché sur le problème. Soit tu n'es pas portable, soit tu fais des codes un peu plus complexes. L'ouverture est en mode binaire est faite pour gérer explicitement les \r\n, pas pour faire un code aussi bête que celui que tu proposes, mais tu t'en doutais bien

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

Discussions similaires

  1. Se déplacer dans un fichier
    Par Invité dans le forum Débuter
    Réponses: 10
    Dernier message: 15/01/2014, 12h14
  2. [XPATH] Est-il possible de se déplacer dans un fichier xml
    Par areda dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/12/2010, 22h55
  3. [Forms - PL/SQL] Se déplacer dans un fichier
    Par Yoshidu62 dans le forum Forms
    Réponses: 2
    Dernier message: 15/11/2007, 11h21
  4. [Fichiers] Enregistrer/Déplacer dans un répertoire
    Par babyboy dans le forum Entrée/Sortie
    Réponses: 19
    Dernier message: 12/05/2004, 14h33

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