Probleme de passage en référence de fstream

Résolu
Hyspace Messages postés 6 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 14 avril 2012 - 12 avril 2012 à 23:16
Hyspace Messages postés 6 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 14 avril 2012 - 14 avril 2012 à 16:18
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 avril 2012 à 15:09
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 avril 2012 à 23:39
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
0
Hyspace Messages postés 6 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 14 avril 2012
14 avril 2012 à 14:11
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.
0
Hyspace Messages postés 6 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 14 avril 2012
14 avril 2012 à 14:19
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;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hyspace Messages postés 6 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 14 avril 2012
14 avril 2012 à 16:18
Comme tu l'as remarqué, je suis encore débutant donc tout conseil est le bienvenu

Merci pour ton aide et bonne journée
0
Rejoignez-nous