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 :

Retour en début de fichier


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut [RESOLU] Retour en début de fichier
    Bonjour,

    Dans ces lignes de code, je voudrais simplement récupérer le nombre de lignes du fichier "Spectrum_User_Defined.txt", puis ensuite récupérer les données dans une matrice qui aura pour nombre de lignes égal au nombre de lignes du fichier.
    Dans le fichier, il y a deux colonnes de valeurs séparées par une tabulation

    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
     
     
            ifstream specfile;
    	string temp;
    	int lines=0;
    	int i;
     
    	specfile.open("Spectrum_User_Defined.txt");
     
    	//Comptage des lignes
    	while (specfile.ignore(std::numeric_limits<int>::max(), '\n'))
            ++lines; 
     
    	SpUser=Mat_DP(0.0,lines,2); //Mat_DP est une classe appartenant
        // a la librairie NRC++ (Numerical Recipes in C++)  permettant de
        // manipuler des matrices tres facilement
        // SpUser est defini en dehors de la classe en tant qu objet de classe Mat_DP
     
    	specfile.seekg(0); //Retour au debut du fichier
     
    	for (i=0;i<lines;++i)
    	{
    		specfile >> SpUser[i][0]; cout<<SpUser[i][0];
    		specfile >> SpUser[i][1];
    	}
    	specfile.close();
    Il s'avère que l'affichage des données montre que le code ne marche pas correctement.
    Si je ne compte pas les lignes et que je récupére directement les donnees du fichier, il n y a pas de probleme ca marche.
    Mais lorsque je fais les 2 operations de comptage de lignes et de recuperation de données, ca ne marche plus.

    J ai aussi essaye de fermer le fichier et de le rouvrir afin d acceder aux donnees, ca ne marche pas.

    Par contre, lorsque j'utilise un autre objet de la classe fstream pour ouvrir le meme fichier et recuperer les données, le code marche.
    Mais ca ferait 2 objets de classe fstream pour 1 seul fichier, et ca ne me plait pas.

    En essayant avec la methode seekg, je me suis dit que l'on retournerait au debut du fichier, et que ca marcherait, mais non.

    Je fais appel a vous pour m'aider, et je vous remercie d'avance

  2. #2
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Ta essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seek(0, STREAM_SEEK.STREAM_SEEK_SET, null)
    Si grande est la faiblesse d'une âme, dont la raison est partie!
    Ne jamais embrouiller ni abasourdir par une foule d'images le génie intérieur qui réside au fonde de sa poitrine,...
    L'ambition est le rfuge de l'échec. "Oscar Wild"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Je ne connais pas cette fonction, et si je la mets telle quelle, bien evidemment ca ne marche pas. Un peu plus d'explications peut etre ?

  4. #4
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    dsl je me suis tromper mais essaye ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    specfile.seekg(0, ios::beg);
    Allez je te met la doc:

    istream::seekg
    istream& seekg( streampos pos );

    istream& seekg( streamoff off, ios::seek_dir dir );

    Parameters

    pos

    The new position value; streampos is a typedef equivalent to long.

    off

    The new offset value; streamoff is a typedef equivalent to long.

    dir

    The seek direction. Must be one of the following enumerators:

    ios::beg Seek from the beginning of the stream.


    ios::cur Seek from the current position in the stream.


    ios::end Seek from the end of the stream.
    Remarks

    Changes the get pointer for the stream. Not all derived classes of istream need support positioning; it is most often used with file-based streams.
    Si grande est la faiblesse d'une âme, dont la raison est partie!
    Ne jamais embrouiller ni abasourdir par une foule d'images le génie intérieur qui réside au fonde de sa poitrine,...
    L'ambition est le rfuge de l'échec. "Oscar Wild"

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    oui bien sur j ai essaye ca au debut,
    car en fait ios::beg est la valeur par defaut du 2e argument. Donc finalement ca revient au meme.

    L'erreur est peut etre autre part ?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut Re: Retour en début de fichier
    Citation Envoyé par soda_o_rat
    Dans ces lignes de code, je voudrais simplement récupérer le nombre de lignes du fichier "Spectrum_User_Defined.txt", puis ensuite récupérer les données dans une matrice qui aura pour nombre de lignes égal au nombre de lignes du fichier.
    Il est aussi possible d'ajouter les lignes unes à unes dans une matrice de taile variable. Il y aura peut-être un surcoût dû à des réallocations (mais comparé au surcoût de lire 2 fois le fichier, lequel est le plus gros ?). Ce surcoût peut être grandement réduit en faisant une grossière devinette pour la taille globale de la matrice (par exemple à partir de la taille globale du fichier).
    Citation Envoyé par soda_o_rat

    Mais lorsque je fais les 2 operations de comptage de lignes et de recuperation de données, ca ne marche plus.
    Si tu as essayé de lire au delà de la fin du fichier (ce qui est le cas), il est en mode d'erreur, et toutes les opérations sont des no-op. clear permet de dévalider le mode d'erreur.
    Citation Envoyé par soda_o_rat
    J ai aussi essaye de fermer le fichier et de le rouvrir afin d acceder aux donnees, ca ne marche pas.
    Idem, je crois, le clear n'est pas appelé par un simple close/open (à valider).
    Citation Envoyé par soda_o_rat
    Par contre, lorsque j'utilise un autre objet de la classe fstream pour ouvrir le meme fichier et recuperer les données, le code marche.
    Ce qui semble conforter mon hypothèse.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Si tu as essayé de lire au delà de la fin du fichier (ce qui est le cas), il est en mode d'erreur, et toutes les opérations sont des no-op. clear permet de dévalider le mode d'erreur.
    Ca a l'air d'etre une piste interessante, mais je ne comprends pas tout.
    Quest ce que les no-op? et que veux tu dire exactement par mode d'erreur ?

    merci

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    no-op : Ca ne fait rien, les fonctions ultérieures retournent sans rien faire.

    mode d'erreur : Un flag (bit) d'erreur est positionné dans l'objet. Je crois par exemple que dans ce cas, specfile.good() retourne false.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup!

    Tu m'as appris quelque chose d'important concernant les flags d'erreurs. En effet, comme on a atteint la fin du fichier, le flag eofbit est activé, donc good() renvoie 0. En appelant la methode clear() pour le fichier, je mets donc tous les flags d'erreur a 0, et le tout reprend

    Une petite question, comment peux tu savoir si les fonctions ultérieures sont no-op ou pas?

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    En testant good() ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. chr(13) + chr(10) qui s'ajoute en début de fichier
    Par biquet dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 08/09/2006, 11h10
  2. [C#] XML - Insertion en début de fichier
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/07/2006, 15h05
  3. enregistrer au début du fichier ?
    Par steinfield dans le forum Langage
    Réponses: 3
    Dernier message: 11/04/2006, 15h00
  4. Mettre des retours chariot dans un fichier
    Par Isa31 dans le forum Langage
    Réponses: 8
    Dernier message: 02/03/2006, 16h13
  5. Problème retour chariot dans un fichier texte
    Par Redondo dans le forum Windows
    Réponses: 2
    Dernier message: 08/02/2006, 18h23

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