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 :

Lecture et déplacement dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Gestionnaire informatique
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut Lecture et déplacement dans un fichier
    Bonjour,

    J'ai un petit soucie lors de ma lecture de fichier. Je souhaite pouvoir lire un entier dans mon fichier qui se trouve à la fin.
    J'ai donc utilisé la fonction ifstream pour ouvrir le fichier en lecture puis utilisé la fonction seekg() pour pouvoir lire à partir de la fin.
    Mon réel problème est de savoir à partir de où commencer la lecture (soit le premier paramètre de la fonction seekg() avec ios::end en second paramètre).

    Voiçi 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
    int main()
    {
    ifstream fichier("CATREL", ios::in ); // on ouvre en lecture
     
     
    if(fichier) // si l'ouverture a fonctionné
    {
    int entier1;
    fichier.seekg(87, ios::end);
     
    fichier>>entier1;	
    cout << entier1 << endl;
     
    fichier.close();
    }
    else
    cerr << "Impossible d'ouvrir le fichier !" << endl;
     
    system("pause");
    return 0;
    }
    J'ai pris le nombres de caractères en partant de la fin pour premier paramètre de ma fonction seekg() est-ce une erreur?

    J'ai en résultat :
    -858993460 (adresse mémoire?)

    et voici un exemple du fichier à lire :

    0411206 20053EUR2E9250114774662310712 310712PREL. FACTURATION 0000000000816O
    0711206 20053EUR2 92501147746 310712NOUVEAU SOLDE 0000002546949H
    0111206 20053EUR2 99861630874 300712 ** PAS DE MOUVEMENT CE JOUR ** 0000000000000{
    0711206 20053EUR2 99861630874 010812 ------------------------------ 0000000000000{

    La valeur en rouge est celle que je dois récupérer et comparer à la date système -1.

    Merci de vos réponses.

    Emilien.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Bonjour Emilien

    Il semble que tu consultes un fichier texte ? La méthode que tu tentes n'est pas la meilleure qui soit. Utiliser une position absolue risque de te causer des ennuis et peut-être sensible à des variations très hasardeuses, notamment sur la gestion des sauts de ligne. A ta place, je m'y prendrais de la manière suivante :

    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
    #include <iostream>
    #include <fstream>
    #include <sstream>
     
    int main(int argc, char * argv[])
    {
      std::string number_str;
     
      std::ifstream file("file.txt");
      if(file) {
        // Get the last line
        std::string prev_last_line, last_line;
        while(std::getline(file,last_line)) {
          prev_last_line = last_line;
        }
        last_line = last_line.size() ?  last_line : prev_last_line; // Manage the case of a std::endl at the end of the file
     
        // Get the 4th field (the number we are looking for)
        std::istringstream last_line_stream(last_line);
        for(int i=0;i < 4;i++) {
          std::getline(last_line_stream,number_str,' ');
        }
      }
     
      std::cout << number_str << std::endl;
      return 0;
    }
    Tu découpes le fichier en lignes, puis tu traites la dernière en la découpant selon les espaces. Il est possible de faire des analyses plus poussées sur les chaînes de caractères avec des regexp, mais une solution simple comme celle-ci peut te suffire. De cette manière, si le format d'un des champs change, ton code fonctionnera toujours.

    Ce n'est pas une très bonne idée de convertir ta date en nombre entier, car elle semble avoir un format JJMMAA.

  3. #3
    Membre habitué
    Homme Profil pro
    Gestionnaire informatique
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut
    Bonjour,

    Déjà je te remercie d'avoir pris du temps pour examiner mon problème.

    Il ne s'agit pas d'un fichier texte mais d'un fichier .OUT cela change t'il quelque chose ? Il s'agit de fichiers retournés par nos banques et ils sont différents en fonction des banques (des fois il n'y a pas d'espaces entre certains caractères ou des fichiers sur une seule et même ligne)... De plus il y a plusieurs espaces qui séparent les éléments de mon fichier (ils ne s'affichent pas sur le post).

    J'ai essayé ton code et je n'ai rien qui s'affiche à l'écran (sur un de mes fichiers avec des sauts de ligne et espaces entre les éléments)

    Je pense que cela va être dur de mettre en place vu tout ce qu'il y a à prendre en compte..

    Cdt,

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Dans ce cas, il te faudrait peut-être une configuration par banque pour savoir comment découper les fichiers.

    Autrement, tu peux infliger un prétraitement aux fichiers reçus pour tous les formater de la même manière. (petit script sed?)

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    Par défaut
    Est-ce que ces fichiers ont été conçus pour être conçu pour être traité informatiquement ??
    Sérieusement le formatage n'est pas le plus approprié au contraire...

    J'espère que tous ces formats sont tout de même prévu pour être traité de la même manière.


    Voici ce que je te proposerais, théoriquement ceci devrait marcher même si tout est sur une ligne, si les espaces séparent les champs, s'il y en a plusieurs, etc... :
    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
    36
    37
     
    struct Operation
    {
               int numCompte;
               float somme;
               int quelqueChose;
               int jeSaisPas;
               std::string nomitation; 
               int autreChose;
     
    };
    // Il me semble que ifstream hérite de ostream, dans le cas contraire, 
    std::istream & operator>>(std::istream & entre, Operation & sortie)
    {
              std::string tmp;
              entre >> sortie.numCompte >> sortie.somme >> tmp;
              int centime;
              entre >> centime;
              sortie.somme += centime(float)/100;
              entre >> sortie.quelqueChose;
              entre >> sortie.jeSaisPas;
              sortie.nomination = "";
              char lu;
               entre.read(&lu, 1);
              while(lu < '0' || lu > '9')
              {
                        sortie.nomination += lu;
                         entre.read(&lu, 1);
               }
               //là tu peux supprimer les caractère au début et à la fin de ton std::string avec erase en parcourant ta string avec les itérateur et reverse_iterator jusqu'à trouver un caractère alphanumérique.
               entre.putback(lu);
               entre >> sortie.autreChose;
    }
     
    ifstream fichier("CATREL", ios::in );
    while(onAPasAtteindsLaLigneDesirée)
              fichier >> operation;

  6. #6
    Membre habitué
    Homme Profil pro
    Gestionnaire informatique
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut
    Bonjour,

    Merci de vos réponses, je pense m'être lancé dans quelque chose de difficile ^^.
    Oui les fichiers sont destinés à un traitement informatique, ils sont intégrés à notre ERP.

    Le programme ne compile pas Neckara :
    error C4716: 'operator>>' : doit retourner une valeur

    J'ai peut être oublié de corriger quelque chose mais je ne vois pas :S

    Cdt,

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

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. Réponses: 4
    Dernier message: 19/05/2006, 17h06
  3. lecture d'éléments dans mon fichier
    Par gillou4 dans le forum C
    Réponses: 9
    Dernier message: 23/10/2005, 16h19
  4. Problème lecture de nombre dans un fichier en c++
    Par knecmotet dans le forum C++
    Réponses: 1
    Dernier message: 28/10/2004, 15h48
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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