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 :

utiliser fseek dans un petit problème


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut utiliser fseek dans un petit problème
    bonsoir

    voilà je voudrais lire un fichier texte, ce dernier est exactement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    nom    : simpson
    prenom : bart
    age    : 10
     
    nom    : simpson
    prenom : homer
    age    : 40
     
    nom    : simpson
    prenom : marge
    age    : 38
    mon programme contient une struture de personne {nom, prenom, age}
    et j'ai un tableau de 3 personnes que je voudrais remplir en lisant le fichier texte en mode direct !!

    voilà une partie d'une fonction de mon programme incomplete, il ne manque que combien d'octects il faut pour se déplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(i=0 ; i<=2 ; i++)
    {
                 fseek(p, , SEEK_CUR);
                 fscanf(p, "%s", B[i].nom);
     
                 fseek(p, , SEEK_CUR);
                 fscanf(p, "%s", B[i].prenom);
     
                 fseek(p, , SEEK_CUR);
                 fscanf(p, "%d", &B[i].age);
     
                 fseek(p, , SEEK_CUR);
    }
    p est un FILE*, B est le tableau de personne(structure) .

    merci infiniment d'avance !!

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    En supposant que tu as fait un test sur ton fichier apres le fppen et que donc le fichier est effectivement accessible.

    En supposant que tu n'es pas de bufferOverFlow a cause d'une trop petite capacité de champ char de ta structure.

    En supposant que fseek soit effectivement bien employé (car je ne comprend pas ce que tu essaye de faire, d'autant plus que tu as un espace entre deux virgule, ce qui devrait generer des errors.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(i=0 ; i<=2 ; i++)
    {
        fseek(p, , SEEK_CUR);
        fscanf(p, "%s", B[i].nom);
     
        fseek(p, , SEEK_CUR);
        fscanf(p, "%s", B[i].prenom);
     
        fseek(p, , SEEK_CUR);
        fscanf(p, "%d", &(B[i].age));
     
        fseek(p, , SEEK_CUR);
    }
    Bon, en voyant le code et l'entrer formater, je serai plus tenter de faire ca (en essayant d'aprocher ton code) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for(i=0 ; i<=2 ; i++)
    {
     
        fscanf(p, "nom    : %s", B[i].nom);
        fseek(p, 1, SEEK_CUR);
     
        fscanf(p, "prenom : %s", B[i].prenom);
        fseek(p, 1, SEEK_CUR);
     
        fscanf(p, "age    : %d", &(B[i].age));
        fseek(p, 2, SEEK_CUR);
    }
    Resta a voir l'utilisation de fseek. Ce code devrait marcher si les ligne separant les bloc nom/prenom/age n'ont pas d'espace.

  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
    Abandonne cette question de compter les octets et fseek().
    Saute les champs qui sont inutiles. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       fscanf(p, "%*[^:]%*c%s", B[i].nom);
       fscanf(p, "%*[^:]%*c%s", B[i].prenom);
       fscanf(p, "%*[^:]%*c%d", &B[i].age);

  4. #4
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    Citation Envoyé par diogene Voir le message
    Saute les champs qui sont inutiles. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       fscanf(p, "%*[^:]%*c%s", B[i].nom);
       fscanf(p, "%*[^:]%*c%s", B[i].prenom);
       fscanf(p, "%*[^:]%*c%d", &B[i].age);
    je n'ai pas compris le "%*[^:]%*c%s", pourriez vous me citer un lien où il y a une explication de comment utilser fscanf ou scanf ??!! (faq ou tuto...)
    parce que je suis un petit peu débutant, je m'approfondis pas dans les details !!

    merci !!

  5. #5
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu peux jeter un coup d'oeil ici : http://xrenault.developpez.com/tutoriels/c/scanf/
    Ou encore sur la page de man

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Tu peux aussi écrire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fscanf(p, "nom    : %s\n", B[i].nom);
    fscanf(p, "prenom : %s\n", B[i].prenom);
    fscanf(p, "age    : %d\n", &B[i].age);
    puisque ton fichier suit ce format. (tu peux tester les retoures de fscanf() pour plus de robustesse)

  7. #7
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    non, mon problème c'est que j'ai le fichier texte que vous avez vu, ce que je voudrais extraire c'est seulement les chaines {simpson bart simpson homer simpson marge} et les nombres {10 40 38}, mais il y'a un problème : il y a les chaines {nom prenom age} et aussi le ":" qui derangent.
    je ne veux pas les supprimer, je voudrais laisser le fichier intact, et utiliser fseek pour me deplacer dans le fichier;

    j'ai besoin de votre aide pour compter le nombre d'octect qu'il faut sauter pour extraire seulement ce qu'on veut.

    et à propos voilà ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct personne
    {
              char nom[20];
              char prenom[20];
              int age;
    }personne;
    alors ??

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Les deux solutions que l'on t'a donner sont exactement celle qui te faut.

    Bon, la mienne est bancale alors que celle de Diogene fera exactement ce que tu voudra.

    Les as tu tester ? Si oui, as tu eu des probleme ?

  9. #9
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    vos solutions, ça a marché !!
    moi je me suis perdu à un moment où j'ai fait une chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    rewind(p);
     
    for(i=0 ; i<=n-1 ; i++)
    {
          fseek(p, 9, SEEK_CUR);
          fscanf(p, "%s", B[i].nom);
     
          fseek(p, 10, SEEK_CUR);
          fscanf(p, "%s", B[i].prenom);
     
          fseek(p, 10, SEEK_CUR);
          fscanf(p, "%d", &B[i].age);
     
          fseek(p, 2, SEEK_CUR);
    }
    c'est ma solution que j'attendais qu'elle marche (ça marche pas), mais
    quand je fais un petit changement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .....
    fseek(p, 3, SEEK_CUR);     //j'ai changé le 2 par 3
    }
    ça marche et ça fait ce que je veux !!

    à votre avis pourquoi ça a marché ?? (le 2 ---->3)

  10. #10
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Parce que fssek compte tout les caracteres, y compris les retour a la ligne et les espace. Or, ce sont des caracteres non detectable au simple coup d'oeil.

    Tout du moins, on ne peut affirmer leur nombre au simple coup d'oeil.

    Si tu selectionne ton texte, tu trouvera certainement un espace en trop, d'ou le decalage.

    C'est en ce point que la solution de Diogene est particulierment interressante et securitaire contrairement a la mienne ou a la tienne.

  11. #11
    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
    L'utilisation de fseek() sur des fichiers texte est extrèmement contrainte par des conditions précises si on veut être sûr de son comportement :

    1- Le déplacement DOIT être 0 ou une valeur renvoyé par ftell()
    et
    2- L'origine du déplacement DOIT être SEEK_SET.

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

Discussions similaires

  1. [XL-2010] Petit problème dans l'utilisation D'END(Xldown)
    Par kapoo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/03/2013, 14h05
  2. Réponses: 5
    Dernier message: 17/11/2009, 20h37
  3. Petit Problème dans une GTK-Table
    Par simtim dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 16/04/2007, 11h41
  4. Réponses: 2
    Dernier message: 28/08/2006, 10h12
  5. Réponses: 3
    Dernier message: 15/07/2005, 17h58

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