Classe fstream

romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010 - 14 mai 2005 à 17:32
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010 - 16 mai 2005 à 22:31
SalutJ à tous, j'ai un petit souci sur un corrigé de cours qui ne fonctionne pas. Le but était de rentrer des nombres entiers dans un fichier binaire puis en choisissant la position du nombre à l'aide de seekg() de retrouver ce nombre; tout ceci en utilisant la classe fstream. Mais voilà des que je rentre le nom du fichier j'ai une erreur; Le programme fonctionne en retirant l'argument "ios::binary" dans la declaration de "fichierInOut" mais voila il faut que ce soit un fichier binaire. Comment rectifier le corrigé pour que cela fonctionne? (Je travaille sous visual C++)
Merci, le prog:

#include
#include<conio.h>
#include<stdio.h>
#include<fstream>
#include<stdlib.h>//pour la fonction exit


using namespace std;


int main(int argc,char*argv[])
{
try
{
char nomfichier[21];
int n,i=0;
long numero=0;
printf("Donner le nom du fichier a creer: ");
cin>>nomfichier;
fstream fichierInOut(nomfichier,ios::in|ios::out|ios::binary);
if(fichierInOut.fail()) throw "Erreur d'ouverture fichier";

do
{
cout<<"Entrer un entier en position "<>n;
if(n!=0) fichierInOut.write((char*)&n,sizeof(int));


}while(n);



while(numero>=0)
{
cout<<"\nnumero de l'entier recherche: ";
cin>>numero;

fichierInOut.seekg(sizeof(int)*numero,ios_base::beg);

if (fichierInOut.read((char*)&n,sizeof(int)))
cout<<"La valeur lue est: "<<n<<endl;
else throw "Erreur de lecture";
}
fichierInOut.close();
}


catch(char *erreur)
{
cout<<erreur<<endl;
getch();
exit (1);
}


getch();
return 0;

}

13 réponses

mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
14 mai 2005 à 20:44
si tu veut écrit avec dans un fichier binaire la surchage d'opérateur
<< et >> ne marche pas, car il supprimera tout caractère
n'étant pas du texte. pour écrire en binaire utilise les fonctions
read() et write() de la classe fstream.

Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
14 mai 2005 à 20:58
Merci "mezaya",
Ok mais alors comment fait on dans le prog pour rentré le nom du programme dans "nomfichier"? je dois enlevé "cin>>nomfichier" et utiliser a la place write()? Car des que je rentre le nom en caractere (j'ai même essaye de mettre un chiffre à la place), il me met quand meme une erreur d'ouverture de fichier?
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
14 mai 2005 à 21:36
t'as mis "ios::in" alors qu'il faut mettre "ios::out".



in est pour la lecture

out pour l'écriture



c'est pour ça que tu peut pas créer ton fichier

Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
15 mai 2005 à 10:56
Je vais te paraître embêtant mais même si je retire ios::in et que je laisse "ios::out|ios::binary" il me crée quand même une erreur d'ouverture de fichier.
En retirant par la suite "ios::binary" j'arrive a ouvrir le fichier, a rentrer des "entiers" mais lorsque je passe en lecture il me cré une erreur de lecture: Normal je pense car "fichierInOut" n'a été déclaré qu'en écriture.
Mais je pense que je suis obligé de mettre "ios::in" car dans la classe fsrtream, les fichiers sont en lecture et ecriture (d'apres mon cours).
...?
0

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

Posez votre question
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
15 mai 2005 à 11:28
Je crois qu'il manque un ios::trunc, s'il faut vraiment créer le fichier.


mayonaise tournera, bientôt, très bientôt...
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
15 mai 2005 à 11:30
j'ai tester ton programme il faut ajouter l'option ios::trunc en plus.

cette fonction permet de vider le fichier si il existe. les fonctions
ios::in|ios::out|ios::binary marchait bien quand le fichier existait
mais planter quand le fichier n'existe pas je sais pas trop pourquoi
mais avec le flag trunc ça marche dans tous les cas.



donc : fstream fichierInOut(nomfichier, ios::in|ios::out|ios::trunc| ios::binary);


Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
16 mai 2005 à 19:11
Ok merci; j'ai essayé comme tu m'as dis avec "trunc" mais je comprend rien chez moi ça ne fonctionne pas?? est ce que ça vient de mon environnement (Visual C++)??? désolé de t'embeter encore une fois ...
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
16 mai 2005 à 19:22
ça vient pas de visual car je l'ai testé sous visual ( .net ). est ce que tu as bien tout les droits ?

il te met la même erreur ?

Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
16 mai 2005 à 19:52
Oui il me met la même erreur. Qu'est ce que tu entends par tous les droits?
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
16 mai 2005 à 20:19
"les droits" --> si tu est sous XP, est tu administrateur.

Au pire essaye avec 2 fstream. un pour l'écriture et un pour la
lecture. pense a bien fermer le fichier entre l'écriture et la lecture
avec un fichier.close();

Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
16 mai 2005 à 20:59
Ok, oui je suis bien en admin sous XP.
Je comprend ce que tu me conseil de faire avec les 2 fstream mais c'est un corrigé de cours. Ce serait bien que ça fonctionne avec la classe fstream au lieu de ifstream et ofstream car j'ai déjà un exemple avec ces 2 classes.
Tu me diras je peux demander au prof mais c'est des cours du CNED(par correspondance) et il va se passer du temps avant qu'il me réponde.....
Mais si on trouve pas tant pis, j'enverrais quand même un mail...

Si tu peux encore m'aider...?
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
16 mai 2005 à 21:47
je sais pas pourquoi ça ne marche pas chez toi alors que ça fonctionne
parfaitement chez moi. Je vois vraiment pas d'où sa peut venir. Désolé

Voili,Voilou
0
romca Messages postés 48 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 19 avril 2010
16 mai 2005 à 22:31
Ok merci quand même pour ta patience et ta gentillesse.

Salut.
0
Rejoignez-nous