Probleme de passage en référence de fstream [Résolu]

Signaler
Messages postés
6
Date d'inscription
samedi 12 mars 2011
Statut
Membre
Dernière intervention
14 avril 2012
-
Messages postés
6
Date d'inscription
samedi 12 mars 2011
Statut
Membre
Dernière intervention
14 avril 2012
-
Bonjour,

Dans mon programme j'ai un fichier ouvert en lecture et en écriture sur lequel je veux faire un traitement particulier via une fonction. Pour ce faire, je fais un passage en référence "fstream& fichier". Mon programme compile sans erreur mais à l'exécution, c'est comme s'il lisait un fichier vide (ficher.tellg()=-1).
Si je modifie mon programme pour qu'il ferme le fichier et le rouvre seulement en lecture en ayant modifié le passage en référence "ifstream& fichier", ça fonctionne. Ça ne m'arrange pas vu que je voulais modifier le fichier dans cette fonction...
Est-ce que je dois en déduire que le passage par référence avec fstream n'est pas possible?

Merci d'avance

5 réponses

Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
107
Quelques conseils avant tout:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pas besoin de déclarer une fonction, si celle-ci est au-dessus de la fonction appelante.
- On utilise soit std::ofstream, soit std::ifstream. C'est étrange d'utiliser un std::fstream. Peut être devrais-tu te poser la question de savoir si tu utilises la bonne approche pour ton problème ?

Pour répondre à ta question, c'est tout simplement que std::ifstream est un std::fstream avec les bonnes options (tout comme std::ofstream).
Si tu ne mets pas d'options à std::fstream, il ne fait ni lecture, ni écriture... En revanche, si tu lui mets les options de lecture et d'écriture, ça ira tout de suite mieux :)

Exemple:
#include 
#include <string>
#include <fstream>

char caractere(std::fstream& f, int pos)
{
  char c;
  f.seekg(pos, std::ios::beg); // Pas très utile dans l'exemple suivant...
  f.get(c);
  std::cout << c << std::endl;
  return c;
}

int main()
{
  std::fstream fichier("test.txt", std::ios::app | std::ios::out | std::ios::in);
  fichier << "1234567890" << std::endl;
  std::cout << caractere(fichier, 4) << std::endl;
  fichier.close();
  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
107
Bonjour.

Est-ce que je dois en déduire que le passage par référence avec fstream n'est pas possible?

Absolument pas. C'est tout à fait possible. Ton erreur doit forcément être ailleurs.
Je t'invite à poster un exemple minimaliste qui compile afin d'exposer ton souci. Je pourrais alors y jeter un coup d'oeil.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
6
Date d'inscription
samedi 12 mars 2011
Statut
Membre
Dernière intervention
14 avril 2012

Bonjour,

Tout d'abord merci pour ton aide et désolé de répondre si tard.
Comme tu me l'as conseillé, j'ai fait un programme minimaliste (cf. ci-dessous) qui reproduit le même problème.
#include "stdafx.h"
#include 
#include <string>
#include <fstream>

using namespace std;

int PosFichier(fstream& f, int pos);

char Caractere(fstream& f, int pos){
char c;
f.seekg(pos, ios::beg);
f.get(c);
cout << c <<endl;
return c;
}

int main()
{
fstream fichier("test.txt", ios::app);
fichier << "1234567890" << endl;
cout << Caractere(fichier, 4) << endl;
fichier.close();
return 0;
}


Si tu peux m'aider à résoudre ce problème, je t'en serais très reconnaissant.
Messages postés
6
Date d'inscription
samedi 12 mars 2011
Statut
Membre
Dernière intervention
14 avril 2012

J'ai fait une "petite" erreur dans le programme du message précédent...
Correction:

#include "stdafx.h"
#include 
#include <string>
#include <fstream>

using namespace std;

char Caractere(fstream& f, int pos);

char Caractere(fstream& f, int pos){
char c;
f.seekg(pos, ios::beg);
f.get(c);
cout << c <<endl;
return c;
}

int main()
{
fstream fichier("test.txt", ios::app);
fichier << "1234567890" << endl;
cout << Caractere(fichier, 4) << endl;
fichier.close();
return 0;
}
Messages postés
6
Date d'inscription
samedi 12 mars 2011
Statut
Membre
Dernière intervention
14 avril 2012

Comme tu l'as remarqué, je suis encore débutant donc tout conseil est le bienvenu

Merci pour ton aide et bonne journée