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 :

Déplacement dans un fichier seekg tellg


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut Déplacement dans un fichier seekg tellg
    Bonjour,

    Dans l´objectif de convertir un fichier de mash dans un autre format. Un certain nombre de lignes d´un format particulié sont inutile à la création de l´autre format. mon idée est de lire toutes ces lignes en testant le format de la ligne, à la première différence je m´arrête et me replace au début de la ligne pour la relire ne enregistrant les infos.

    Puisqu´un bout de code vaut mieux qu´un long discours voici mon code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    string dat_file;
    int Up1;
     
    ifstream f_dat(dat_file.c_str());
     
    if (!f_dat)
    {
    	cout << "Erreur d ouverture f_dat" << endl;
    };
     
     
    while (test == 102) // Les lignes à ignorer ont 102 comme deuxième valeur
    {
    	Up1 = f_dat.tellg();
    	cout << f_dat.tellg() << endl;
    	f_dat >> temp >> test >> temp >> temp;
    	cout << test << "\t" << temp << endl;
     
    };
     
    f_dat.seekg(Up1);
     
    cout << f_dat.tellg() << endl; //ici je récupère bien Up1
     
    f_dat >> temp >> test >> temp >> temp; // Ici rien à voir je suis trois ligne plus loin et pas sur la première ligne sans erreur
    cout << test << "\t" << temp << endl;
    Je suis un peu nouveau avec c++, j´ai lu l´aide relative à tellg et seekg : http://www.cplusplus.com/reference/i...eam/seekg.html

    Je dois me planter sur un concept fondamental...

    Voici si cela peut aider le bout de mon fichier à lire qui pose problème :

    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
    16
    17
    18
    19
    20
    21
    22
     
    49 102 47 48 
    46 102 1 45 
    52 102 49 50 
    20 102 24 4 
    8 102 14 15 
    58 102 54 55 
    4 102 11 12 
    35 102 36 7 
    18 102 22 23 
    12 102 17 18 
    24 102 27 28 
    21 102 6 25 
    238 203 45 102 1 
    181 203 84 54 55 
    104 203 67 74 73 
    86 203 61 11 12 
    210 203 42 95 94 
    154 203 78 25 26 
    239 203 99 15 97 
    182 203 83 87 84 
    105 203 68 72 74
    Mon objectif est d´ignorer les lignes qui ont pour deuxième valeur 102, et ensuite de lire celle avec 203.

    J´utilise VC2005

    Merci du coup de main

    Renan

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Et, pourquoi ne pas faire, tout simplement, autrement:

    Tu ouvre ton fichier source en lecture, et ton fichier cible en écriture
    • tu lis toute la ligne dans le fichier source et
    • selon la valeur de la deuxième variable, tu écris ou non dans le fichier cible...


    une p'tite structure pour nous y aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct values
    {
        int val1;/* rien n'empeche de mettre des noms plus explicites ;) */
        int val2;
        int val3;
        int val4;
    };
    Et la lecture sous la forme de
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    //ouverture des deux fichiers
    std::ifstream ifs("source.ext");
    std::ofstream ofs("cible.ext");
    // les test classiques
    if(!ifs)
    {
        /*erreur d'ouverture du fichier source */
    }
    else
    {
        if(!ofs)
        {
            /* erreur d'ouverture du fichier cible */
        }
        else
        {
             /* une chaine pour lire la ligne entière */
             std::string line;
             /* on lit la ligne entiere */
             while(std::getline(line,ifs))
             {
                  /* on converti la ligne lue */
                  std::istringstream iss(line);
                  values recup;
                  oss>>recup.val1>>recup.val2>>recup.val3>>recup.val4;
                  /* et on écrit dans le fichier cible si recup.val2 le permet */
                  if(recup.val2!=102)
                      ofs<<recup.val1<<" "
                         <<recup.val2<<" "
                         <<recup.val3<<" "
                         <<recup.val4<<std::endl;
             }
        }
    }
    Finalement, ce n'est qu'une adaptation de plein de concepts abondamment décrits dans la FAQ
    [EDIT]n'oublie pas d'inclure les fichier d'entete <string>, <fstream> et <sstream> pour que cela compile
    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
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut Encore une petite question
    Salut !

    Merci pour ta réponse je n´y croyais plus , peut être que le titre fait un peu peur.

    J´ai donc développer une autre méthode quii ressemble un peu à la tienne (avec un case et non un if car le numéro correspond au format d´un élément de 1d, 2d à 2, 3, 4 points). Bref cela fonctionne maintenant très bien. Je me compliquait en effet un peu le machin.

    J´ai encore deux questions (je débute en c++, étant plus habitué au fortran, suis un matheux ) :

    - Comment fonctionne réellement l´alliance des fonctions seekg et tellg. Je promets de toujours chercher une autre possibilité que d´utiliser ces fonctions. C´est plutôt par curiosité.

    - Quel est l´intérêt d´utiliser une structure à la place de 4 variables indépendantes ?

    Merci du coup de main

    Renan

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par renlel
    Salut !

    Merci pour ta réponse je n´y croyais plus , peut être que le titre fait un peu peur.
    Et pourtant, ma réponse date du jour meme ... peut etre as tu simplement oublié de demander à etre prévenu des réponses
    - Comment fonctionne réellement l´alliance des fonctions seekg et tellg. Je promets de toujours chercher une autre possibilité que d´utiliser ces fonctions. C´est plutôt par curiosité.
    Tu devrais trouver pas mal de réponse sur l'uttilisation des fichier dans la FAQ:http://c.developpez.com/faq/cpp/?page=fichiers
    - Quel est l´intérêt d´utiliser une structure à la place de 4 variables indépendantes ?
    Les memes que n'importe quelle structure:
    • Permettre de s'assurer que toutes les valeurs ont bien toutes trait à un seul objet donné
    • Eviter d'avoir une multitude d'argument à passer aux différentes fonction: on peut se contenter de fournir (un pointeur ou une référence sur) la structure concernée, et disposer, malgré tout de l'ensemble des informations que la structure contient
    • créer une interdépendance forte entre les valeurs
    • etre sur qu'en déclarant une seule variable de type structure, on puisse disposer de l'ensemble des valeurs et fonctions que la structure implique
    • ...
    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

Discussions similaires

  1. Lecture et déplacement dans un fichier
    Par draithor dans le forum C++/CLI
    Réponses: 2
    Dernier message: 30/08/2012, 16h19
  2. Lecture et déplacement dans un fichier
    Par draithor dans le forum C++
    Réponses: 22
    Dernier message: 09/08/2012, 16h23
  3. Déplacement dans un fichier, windows/linux
    Par Rniamo dans le forum Débuter
    Réponses: 10
    Dernier message: 24/05/2008, 20h20
  4. déplacement dans un fichier.txt
    Par yohann007 dans le forum C
    Réponses: 11
    Dernier message: 21/03/2007, 11h06
  5. Réponses: 4
    Dernier message: 19/05/2006, 17h06

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