Fichiers

cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004 - 29 mars 2004 à 08:29
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 - 30 mars 2004 à 11:45
Bonjour tous!
je suis en train de faire un programme avec des fichiers, c'est la premiere fois, et mon code plante, je ne sais pas si ce que j'ais fais est correct(apparement non vu que ça plante)
voilà mon code:
/* Option 6:Enregistrements */
void enregistrement()
{
int i;
familles=fopen("a:familles.dat","w");
for(i=1;i<=max;i=i+1)
{
fprintf(familles,"%s %d %d ",Tfamilles[i].nom,Tfamilles[i].nbpers,Tfamilles[i].appro);
cout<<"rentre dans la boucle familles";
}
cout<<"\n enregistrement terminé";
}

j'ai mis les prototype en debut de programme.
j'ai declare mon fichier aussi au debut:

/* Nom des fichiers */

FILE *familles;

et voilà, les variables gloables a tout le programme:
/* Variables */

typedef struct
{
int no;
char nom[20];
int nbpers;
int appro;
}Tenrfamilles;

Tenrfamilles Tfamilles[20];
j'espere que vous pourrez m'eclaircir et m'aider a me corriger
merci
Oceane

13 réponses

lpikachu58 Messages postés 351 Date d'inscription samedi 2 février 2002 Statut Membre Dernière intervention 6 mai 2004 2
29 mars 2004 à 09:57
faut faire un fwrite pour écrire

be linux
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
29 mars 2004 à 10:04
si je met fwrite apres tout le code est faux car c'est pas la meme façon de declarer apparement ( vu les erreurs qu'on me met)

je suis etudiante et dans mes cours c'est fprintf et ça marche pour d'autre, donc les deux doivent exister non?
0
cs_pheno Messages postés 141 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 23 mars 2005 1
29 mars 2004 à 13:19
test ce que te retournes la fonction fopen
if( ( familles=fopen("a:familles.dat","w))==NULL)
perror("bah voila");

et a la fin de ta fonction ferme ton fichier
fclose(familles);

@++

Chevalier Pheno Starboard, membre de la Freeman-Corp
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
29 mars 2004 à 13:52
en effet , le fichier il ne le trouve pas.

mais j'ai peur de me tromper, mes fichiers existent, c'est ce qu'il fallait faire n'est ce pas? ce n'est pas un probleme de chemin, j'ai verifie. a quoi celà peut il etre du?

merci en tout cas
0

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

Posez votre question
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
29 mars 2004 à 14:30
j'ai trouve pourquoi, enfait fallait pas que je mette le chemin en entier
par contre ça n'insere toujours pas les données,grrrr
0
cs_pheno Messages postés 141 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 23 mars 2005 1
29 mars 2004 à 15:20
ca devrait ecrire
verifie que tu fermes bien ton fichier
et regarde sinon
apres
mais un fflush(familles);
avant ton cout << " enregistrement termine"

@++
Chevalier Pheno Starboard, membre de la Freeman-Corp
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
29 mars 2004 à 16:02
j'avais dejà mis fclose, j'ai mis fflush mais ça ne marche pas, j'ai essayer de faire une boucle des données pour voir elles etaient bien dansle tableau, elle s'affiche bien a l'ecran, mais rien dans le fichier; je comprend pas.
a quoi sert la fonction ffleush()?
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
29 mars 2004 à 20:57
Ta boucle for devrait commencer à 0.

QUelle valeur vaut max ? (tu dois t'arrêter à 19 exactement vu
la taille de ton tableau )

Pourquoi n'utilises tu pas les flux C++ ofstream
qui s'utilise comme cout ?

En C++, tu n'as pas besoins de "typdéfé" tes structures
c'est automatique.
Tu ferais mieux de fournir un constructeur par défaut
pour intialiser ta struct, ça évitera des surprises.

struct Tenrfamilles {
int no;
char nom[20];
int nbpers;
int appro;
};
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
30 mars 2004 à 08:10
Pour ma boucle en effet, j'ai modifier, j'avais mis a un1 et la valeur max a 20 mais ça ne va rien changer vu que la boucle s'execute autant de fois.

Je n'utilise pas ofstream car je ne connais pas , ça marche comme cout, mais c'est quoi la difference? et ça s'ecrit comme ça:
ofstream<<"\n bonjour";??

J'ai initialise ma strucuture mais ça me marque toujours rien dans le fichier, là je desespere totalement.
Le programme s'execute comme si l'enregistrement fonctionnait. mais le fichier est vide %-6
merci
oceane
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
30 mars 2004 à 10:04
Voici un exemple complet qui écrit quelque chose sur disque..

#include
#include <cstdio>
using namespace std;

const int MAX = 20;

struct Tenrfamilles
{
Tenrfamilles() : no( 0 ), nbpers( 0 ), appro( 0 )
{ nom[0] = '\0'; }

int no;
char nom[20];
int nbpers;
int appro;
};

Tenrfamilles familles[MAX];

void enregistrement( const char* nomFichier )
{
FILE* fichier = fopen( nomFichier, "w" );
for( int i = 0; i < MAX; ++i )
{
fprintf( fichier, "%s %d %d\n",
familles[i].nom,
familles[i].nbpers,
familles[i].appro );
}
fclose( fichier );
}

int main()
{
familles[0].no = 1;
strcpy( familles[0].nom, "Premiere" );
familles[0].nbpers = 3;
familles[0].appro = 18;

familles[1].no = 2;
strcpy( familles[1].nom, "Deuxieme" );
familles[1].nbpers = 2;
familles[1].appro = 27;

enregistrement( "familles.dat" );
}

Pour ofstream :
{ ofstream file( "familles.dat" );
file << "bonjour" << endl;
}
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
30 mars 2004 à 10:20
j'ai essaye ton code et chez moi ça ne marche pas, je travaille sur turbo c++.
using namespace std; il n'est pas reconnu, ça sert a quoi?
strcpy pareil, donc j'ai change et mis cout, mais ça n'enregistre pas.
je sais pas si je vais m'en sortir, en tout cas merci de m'aider.
oceane
0
cs_oceane67 Messages postés 50 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 21 juin 2004
30 mars 2004 à 10:27
je suis en train de me demander, si le probleme ne vient pas d'ailleurs, je vous envoie tout mon code( c'est normal si certains cas ne marchent pas, mais ils sont pas necessaires pour l'enregistrement)

#include<conio.h>
#include<stdio.h>
#include
#include<string.h>
#define max 19
#define max2 51

/* Prototypes */

void nouvellesfamilles();
void approvisionnement();
void chequesemis();
void solde();
void releve();
void chargement();
void enregistrement();
void depart();
void initialiser();

/* Nom des fichiers */

FILE * familles;
FILE * cheques;

/* Variables */

typedef struct
{
int no;
char nom[20];
int nbpers;
int appro;
}Tenrfamilles;

Tenrfamilles Tfamilles[19];
int Tcheques[max2][max];
int bungalow[20];

int i,enr ;
char res;

void main()
{
// chargement();
initialiser();
int choix;
do
{
cout<<"\n Gestion des comptes cheques club.";
cout<<"\n 1- saisir la liste des nouvelles familles.";
cout<<"\n 2- saisir un approvisionnement de compte." ;
cout<<"\n 3- Saisir les cheques emis de la journee.";
cout<<"\n 4- lister les familles dont le solde est negatif." ;
cout<<"\n 5- lister le releve de compte d'une famille" ;
cout<<"\n 6- sauvegarder les donnees sur le disque.";
cout<<"\n 7- enregistrer les departs";
cout<<"\n 0 quitter le programme." ;
cout<<"\n votre choix ?";
cin>>choix;
switch(choix)
{case 1:nouvellesfamilles();
break;
case 2:approvisionnement();
break;
case 3:chequesemis();
break;
case 4:solde();
break;
case 5:releve();
break;
case 6:enregistrement();
break;
case 7: depart();
break;
}
} while(choix!=0);
if (enr==0)
{
cout<<"\n vous n'avez pas enregistre vos modifications,souhaitez vous le faire?(O/N)";
cin>>res;
if(res==0)
{
enregistrement();
}
cout<<"\n au revoir";
}
getch();
}

/* option 1*/
void nouvellesfamilles()
{
int nb;
char rep;
rep='o';
nb=1;
// i=0;
while( rep=='o')
{
/** on verifie que le bungalow est vide **/

// while(i!=1 || nb>=max)
// { cout<<" rentre dans la boucle";
// nb++;
// if(Tfamilles[nb].nom == " ")
// {
// i=1;
// }
// }


if(nb>=max)
{
cout<<"\n le village vacances est complet, vous ne pouvez plus rajouter de famille.";
cout<<"\n ";
rep='n';
}
else
{
cout<< "\n bungalow no "<< nb;
cout<<"\n entrer le nom:";
cin>>Tfamilles[nb].nom;
cout<<"\n entrer le nombre de personnes:";
cin>>Tfamilles[nb].nbpers;
nb=nb++;
cout<<"\n voulez vous entrer une autre famille?(o/n)" ;
cin>> rep;
}
}
enr=0 ;
}
/* Option 2*/
void approvisionnement()
{int mont,i,r;
char rep[20];
char res,res2;
do
{
i=1;
do
{
cout<<"\n entrer le nom:";
cin>>rep;
do
{ if (strcmp(Tfamilles[i].nom, rep)==0)
{ cout<<"\n montant credite?";
cin>>mont;
cout<<"\n etes vous sur du montant?(O/N):";
cin>>res;
}
else
{ cout<< "\n ce nom ne correspond a aucun bungalow." ;
}
i=i+1;
}
while(strcmp(Tfamilles[i].nom, rep)==0 && i<=max);
}
while (strcmp(Tfamilles[i].nom, rep)==1);
Tfamilles[i].appro=Tfamilles[i].appro+ mont;
cout<<"voulez vous entrer un autre approvisionnement?(O/N):";
cin>> res2;
}while(res2=='o');
enr=0 ;
cout<< Tfamilles[i].appro ;
}

/* Option 3 */
void chequesemis()
{
i=0;
int j;
cout<<"\n lorsque la saisie est terminee ,taper 0 dans le no de bungalow";
do
{ i=0;
cout<<"\n entrer le no de bungalow:";
cin>>i;
if(i!=0)
{
cout<<"\n entrer le no d'ordre";
cin>>j;
cout<<"\n entrer le montant du cheque:";
cin>>Tcheques[i][j];
Tfamilles[i].appro= Tfamilles[i].appro -Tcheques[i][j];
cout<< Tfamilles[i].appro ;
}
}
while ( i!=0);
enr=0;

}

/* Option 4 */
void solde()
{
int i;
i=1;
do
{

if(Tfamilles[i].appro<0)
{
cout<<"\n bungalow no"<<Tfamilles[i].no;
cout<<"\n nom:"<<Tfamilles[i].nom;
cout<<"\n approvisionnement:"<<Tfamilles[i].appro;
}
i=i+1;
} while(i!=max);
enr=0;
}

/* Option 5 */
void releve()
{
i=0;
int i,j;
//char res;
//cout<<"\n voulez vous enregistrer vos donnees auparavant?(O/N)";
//cin>>res;
//if(res==0)
//{
// enregistrement();
// }
cout<<"\n entrer le no du bungalow";
cin>>i;
j=0;
while (j==max2)
{
if(Tcheques[i][j]!=0)
{
cout<<"\n no du cheque:"<> nb;
// Tfamilles[nb].nom="";
Tfamilles[nb].appro=0;
Tfamilles[nb].nbpers=0;
}

/* Chargement */
void chargement()
{
int i,j;
i=0;
familles=fopen("familles.dat","r");
while (!feof (familles))
{
fscanf(familles,"%d %s %d %d ",&Tfamilles[i].no,&Tfamilles[i].nom,&Tfamilles[i].nbpers,&Tfamilles[i].appro);
i=i+1;
}
fclose(familles);
cheques=fopen("cheques.dat","r");
while (!feof(cheques))
{
for(i=1;i<=max2;i=i+1)
{for (j=1;j<=max2;j=j+1)
{fscanf(cheques,"%d ",&Tcheques[i,j]);
}
}
}
fclose(cheques);
}

// initialiser//

void initialiser()
{ int i,j;
for(i=0;i<=max2;i=i+1)
{
for (j=0;j<=max2;j=j+1)
{
Tcheques[i,j]==0;
}
}
for(i=1;i<=max;i=i+1)
{
Tfamilles[i].no=i;
Tfamilles[i].nom=="";
Tfamilles[i].nbpers=0;
Tfamilles[i].appro=0;

}
}

oceane
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
30 mars 2004 à 11:45
Wahou... désolé trop long, j'ai pas le temps de tout lire.
mais plusieurs points :

1. le compilateur de Borland est disponible gratuitement.
2.Tenrfamilles Tfamilles[19];
les éléments valident de ce tableau sont compris
entre 0 et 18 inclus, or tu accèdes parfois au 19.

3. tu fais des Tcheques[i,j]
ça compile mais ne fais sûrement pas ce que tu crois
tu dois changer en Tcheques[i][j] sûrement (comme ailleurs)

4. les index sur les tableaux commencent à 0
tes boucles commencent trop souvent à 1... idem
pour la fin <= max alors que c'est < max

5.tu fais beaucoup trop de do{}while... la plupart
sont en fait des while ou des for.
0
Rejoignez-nous