Petit programme basique sur les fichiers mais je ne suis pas doué^^ [c++]

Messages postés
3
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
29 mars 2004
- - Dernière réponse : Hylvenir
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
- 29 mars 2004 à 22:07
Coucou :)

Je débute juste en C++ et je ne suis pas doué pour le coup^^ J'ai un exercice sur les fichiers qui me demande de faire ça:

Pour toutes les questions suivantes, utiliser une structure.

1/ Ecrire une fonction permettant de créer séquentiellement un fichier "mesures" comportant pour chaque mesure:
-nom (20 caractères maximum), nom de la mesure
-reference (15 caractères maximum), référence de la mesure
-resultat (réel), résultat de la mesure
Les informations relatives aux différentes mesures seront saisies au clavier.

2/Ecrire une fonction permettant, à partir du fichier créé précédemment, de retrouver les informations correspondant à une mesure de nom donné.

3/Ecrire une fonction permettant, à partir du fichier créé précédemment, de retrouver les informations relatives à une mesure de "rang" donné (par accès direct).

4/Ecrire un programme de test regroupant toutes ces fonctions avec possibilité de menu de choix pour l'utilisateur comme ci-dessous:
1 Créer et remplir le fichier mesures
2 Consulter mesure par son nom
3 Consulter mesure par son rang dans le fichier mesures


Pour le 1/ j'ai fait cela :

#include
#include <conio.h>
#include <stdio.h>

struct mesure
{
char nom[20];
char reference[15];
float resultat;
FILE * fp;
void saisie();
};

void mesure::saisie()
{
fp=fopen ("mesures.txt", "at");
cout<<"Donnez le nom de la mesure : ";
cin>>nom;
fprintf (fp,"%s",nom);
cout<<"Donnez la reference : ";
cin>>reference;
fprintf (fp," %s",reference);
cout<<"Donnez le resultat de la mesure : ";
cin>>resultat;
fprintf (fp," %f\n",resultat);
fclose (fp);
}
void main()
{ int x;
mesure nouvelle;

x=1;
while (x!=0)
{
nouvelle.saisie();
cout<<"Donner 0 si la saisie est finie ou 1 si elle continue : ";
cin>>x;
};
getch();
}

Bon ça marche mais pour que ça puisse fonctionner avec la suite il doit faloir changer des trucs peut-être
Après le 2/ je ne sais pas trop comment faire et le 3/ vu le cours il faut se servir de fseek et fread (et fwrite peut-être du coup).

Si quelqu'un a une idée, je l'épouse sur le champ ! Enfin juste si c'est une demoiselle ;)

Merci beaucoup en tout cas :)
Afficher la suite 

5 réponses

Messages postés
351
Date d'inscription
samedi 2 février 2002
Statut
Membre
Dernière intervention
6 mai 2004
2
0
Merci
oui il faut ce servir de fwrite et fread au lieu de fprintf

be linux
Commenter la réponse de lpikachu58
Messages postés
3
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
29 mars 2004
0
Merci
Oui et j'essaye mais je n'y arrive pas et là ça commence à m'énerver :(
ça fait qq jours que le soir je me penche là-dessus en rentrant du travail et ça n'avance pas... C'est ce qui m'a conduit à chercher de l'aide 8)
Autant le 4/ je pense y arriver sans mal, autant les 2/ et 3/ je cale :(
Commenter la réponse de cs_barbamaman
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
0
Merci
Bonjour,
plusieurs remarques/conseils comme tu veux :
1. utilise #include avec un using namespace std;
au pire demande à ton prof de t'expliquer.
Donc #include <cstdio> idem.

2. Pense à ta structure Mesure n'est pas censé contenir
un pointeur sur un fichier. Passe le plutôt
en paramètre de ta fonction Saisie.

3. utilise plutôt les flux C++ ifstream pour la lecture
et ofstream pour l'écriture.

4. Evite de mélanger des cin/cout C++ avec des fprintf/fscanf
plutôt C.

5. Evite le conio.h qui n'est pas standard et qui ne sert
qu'à arrêter ton programme pour que tu puisses voir quelque chose.

6. Fais déjà le 4, il te suffit de ne rien faire pour les
fonctions que tu n'auras pas encore implémenté.

Bon courage.

Indice : tu peux utiliser dans ton cas un constructeur de ta structure pour créer une mesure à partir d'un flux que tu auras
préalablement ouvert.
Commenter la réponse de Hylvenir
Messages postés
3
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
29 mars 2004
0
Merci
Voilà ce que j'ai fait en rentrant du boulot, ça compile mais ça ne marche pas. Et encore, la recherche par rang fait planter...
Sinon j'ai mis un fichier mesures.txt pour pouvoir l'ouvrir et voir ce qui a été écrit dedans, et ce n'est pas génial, le resultat (float) n'apparait pas ...

[citation]

#include <stdio.h>
#include
#include <conio.h>

typedef struct
{
char nom[20];
char reference[15];
float resultat;

} mesure;

int saisie()
{
mesure NouvelleMesure;
FILE* fp;

fp = fopen ("mesures.txt", "at";

if (!fp)
{
cout<<"Problème de fichier !";
return(1);
}

cout<<"nDonnez le nom de la mesure : ";
cin>>NouvelleMesure.nom;

cout<<"Donnez la reference : ";
cin>>NouvelleMesure.reference;

cout<<"Donnez le resultat de la mesure : ";
cin>>NouvelleMesure.resultat;

fwrite(&NouvelleMesure, sizeof(mesure), 1, fp);
fclose(fp);

return(0);
}

void rechercherang()
{
FILE*fp;
mesure MesureCherchee;
int x;

cout<<"nDonner le rang des informations cherchees : ";
cin>>x;
fseek (fp, sizeof(mesure)*x,SEEK_SET);
fread (&MesureCherchee, sizeof(mesure),1,fp);
cout<<"nLes informations lues sont : "<<MesureCherchee.nom<<MesureCherchee.reference<<MesureCherchee.resultat;
}

void main()
{
int x,nb;

cout<<"1 Creer et remplir le fichier mesures"<<"n2 Consulter mesure par son nom"<<"n3 Consulter mesure par son rang dans le fichier mesures"<<endl;
cin>>nb;
switch (nb)
{
case 1:
{
x=1;
while (x!=0)
{
saisie();
do
{
cout<<"nVoulez-vous une nouvelle mesure ? (1 pour oui, 0 pour non) : ";
cin>>x;
}while ((x!=0) && (x!=1));
}
}; break;
/* case 2: */
case 3: rechercherang(); break;
default: cout<<"Erreur de saisie"; break;
}
getch();
}

/citation

Je vais voir tes remarques mais j'essaye de faire avec le cours mais ce n'est pas génial %-6
Commenter la réponse de cs_barbamaman
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
0
Merci
#include <cstdio>
#include <fstream> // utilise des flux C++
#include
using namespace std; // Ajout du namespace

// typedef struct // pas besoin de typedef
struct Mesure
{
// Constructeur par défaut
Mesure() : resultat( 0.0 ) {
nom[0] = '\0'; reference[0] = '\0';
// j'ai un doute sur l'utilité de ça
}

// Construction à partir d'un flux
Mesure( istream& is )
{ // Permet de lire le nom, la référence et le résultat à partir
// d'un flux
// ici, au vu de ce que tu as fait, il faudrait formatter
// la sortie sur 20 puis 15 puis disons 18 chiffres
// pour la mesure vu que tu fais un accès direct ensuite
// par fseek (qui devient seek sur les fichiers)
// l'équivalent de "%20s %15s %18.6lf\n" du C
is >> nom >> reference >> resultat;
}

char nom[20];
char reference[15];
// float resultat;
double resultat; // toujours utiliser des doubles, c'est plus précis

// Méthode pou sauver une mesure
void sauver( ostream& os ) const
{
os << nom << " " << reference << " " << resultat
<< endl; // en général, je ne met pas de endl ici...
// mais ton cas est simple on va dire ;-)
}
}; //mesure;

// chargement d'une mesure
ifstream file( "mesures.txt" );
Mesure m( file );
// affichage d'une mesure
m.sauver( cout );
// enregistrement d'une mesure dans un fichier
ofstream fileOut( "mesures.txt", ios::app );
m.sauver( fileOut );

// la recherche par accès direct est plus délicate
// mais il ne faut pas utiliser sizeof
int position = 3; // 4 ieme élément
file.seekg( 3 * ( 20 + 15 + 18 ); ios::beg );
Mesure m( file );
m.sauver( cout );

J'espère t'avoir aidé un peu ( et pas trop embrouillé ;-) )

PS : Je n'ai rien compilé mais ce ne doit pas être trop loin
de ça.
Commenter la réponse de Hylvenir