Petit programme basique sur les fichiers mais je ne suis pas doué^^ [c++]
cs_barbamaman
Messages postés3Date d'inscriptionlundi 29 mars 2004StatutMembreDernière intervention29 mars 2004
-
29 mars 2004 à 10:42
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDerniè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
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 :)
A voir également:
Petit programme basique sur les fichiers mais je ne suis pas doué^^ [c++]
cs_barbamaman
Messages postés3Date d'inscriptionlundi 29 mars 2004StatutMembreDernière intervention29 mars 2004 29 mars 2004 à 12:05
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 :(
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 29 mars 2004 à 20:49
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.
cs_barbamaman
Messages postés3Date d'inscriptionlundi 29 mars 2004StatutMembreDernière intervention29 mars 2004 29 mars 2004 à 21:38
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 ...
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();
}
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 29 mars 2004 à 22:07
#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.