Votre question

C++ : Probleme redeclaration ofstream[RESOLU]

Tags :
  • Programmation
Dernière réponse : dans Programmation
9 Mars 2006 22:55:16

Bonjours,
Je suis entrain d'apprendre le C++ et un problem me resiste au niveau des flux d' E/S.

voici le code me posant probleme :
  1. ofstream f(sFichierNom);
  2. if (!f.is_open())
  3. {
  4. cout << "une erreur est survenue durant l'ouverture du fichier \"" << sFichierNom << "\"" << endl;
  5. system("PAUSE");
  6. exit(1);
  7. }
  8. f << "Prenom : " << Etudient[nNombre2Compte].sPrenom << endl <<
  9. "Nom : " << Etudient[nNombre2Compte].sNom << endl <<
  10. "Nombre de Note : " << Etudient[nNombre2Compte].nNombre2Note;
  11. f.close();
  12. //augmentation du nombre de compte
  13. nNombre2Compte++;
  14. ofstream f("parametre.txt");
  15. if (!f.is_open())
  16. {
  17. cout << "une erreur est survenue durant l'ouverture du fichier \"parametre.txt\"" << endl;
  18. system("PAUSE");
  19. exit(1);
  20. }
  21. f << "Nombre de compte : " << nNombre2Compte;
  22. f.close();

Je pense que le problème vien d'une redeclaration du a un probleme de destructeur avec ofstream.

voici les erreurs à la compilation ( Dev-C++) :
In function `int main(int, char**)':
122 redeclaration of `std::o fstream f'
109 `std::o fstream f' previously declared here
135 jump to case label
109 crosses initialization of `std::o fstream f'.

Merci de votre aide.

Autres pages sur : probleme redeclaration ofstream resolu

10 Mars 2006 00:07:09

Bonsoir,

tu as deux fois la déclararion de "f":
ofstream f(sFichierNom);
ofstream f("parametre.txt");

Soit tu supprimes le deuxième, et tu ouvres simplement le deuxième fichier avec :
f.open( ...)

soit tu changes de nom de variables pour la deuxième déclaration :
ofstream f2("parametre.txt");
Contenus similaires
10 Mars 2006 17:43:36

Merci ataofeal, mais même après correction de cette erreur j'ai toujours un erreur :

In function `int main(int, char**)':
135 jump to case label
122 crosses initialization of `std::o fstream f4'
109 crosses initialization of `std::o fstream f3'

150 jump to case label
122 crosses initialization of `std::o fstream f4'
109 crosses initialization of `std::o fstream f3'

168 jump to case label
122 crosses initialization of `std::o fstream f4'
109 crosses initialization of `std::o fstream f3'

135 [Warning] destructor needed for `f4'
135 [Warning] where case label appears here
135 [Warning] (enclose actions of previous case statements requiring destructors in their own scope.)

puis après ca se repete.

voici le code en entier :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <stdio.h>
  5.  
  6. using namespace std;
  7.  
  8. #define NOMBRE_MAX_ELEVE 50
  9. #define NOMBRE_MAX_NOTE 50 //par eleve
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13. //creation de la classe eleve
  14. class eleve
  15. {
  16. public:
  17. string sNom;
  18. string sPrenom;
  19. string sClasse;
  20. float fMoyenne;
  21. int nNombre2Note;
  22. int nNotes[50];
  23. //constructeur
  24. eleve()
  25. {
  26. sNom = "";
  27. sPrenom = "";
  28. sClasse = "";
  29. fMoyenne = 0.0;
  30. nNombre2Note = 0;
  31. nNotes[NOMBRE_MAX_NOTE] = (0);
  32. };
  33. //fonction qui ajoute une note
  34. void AjoutNote(int nNouvelleNote, eleve* moi)
  35. {
  36. int nSommeNote = 0;
  37. moi->nNotes[moi->nNombre2Note] = nNouvelleNote;
  38. nNombre2Note++;
  39. //calcule moyenne
  40. for(int i = 0; i < moi->nNombre2Note; i++)
  41. {
  42. nSommeNote += nNotes[i];
  43. }
  44. moi->fMoyenne = nSommeNote / moi->nNombre2Note;
  45. }
  46. };
  47. // declaration des variables
  48. int nNouvelleNote = 0, nChoix = 0, i = 0, nNombre2Compte;
  49. char sFichierNom[10] = "";
  50. FILE* fFichier = NULL;
  51. eleve* Etudient;
  52. //recuperation du Nombre de compte
  53. ifstream f1("parametre.txt");
  54. if (!f1.is_open())
  55. {
  56. cout << "une erreur est survenue durant l'ouverture du fichier \"parametre.txt\"" << endl;
  57. system("PAUSE");
  58. exit(1);
  59. }
  60. f1.seekg(19);
  61. f1 >> nNombre2Compte;
  62. f1.close();
  63. //recuperation des informations
  64. Etudient = new eleve[NOMBRE_MAX_ELEVE];
  65. for (i = 0; i < NOMBRE_MAX_ELEVE; i++)
  66. {
  67. if (i < nNombre2Compte)
  68. {
  69. sprintf(sFichierNom, "Compte\\%Ld.txt", i);
  70. ifstream f2(sFichierNom);
  71. if (!f2.is_open())
  72. {
  73. cout << "une erreur est survenue durant l'ouverture du fichier \"" << sFichierNom << "\"" << endl;
  74. system("PAUSE");
  75. exit(1);
  76. }
  77. f2.seekg(9);
  78. f2 >> Etudient[i].sPrenom;
  79. f2.seekg(18+sizeof(Etudient[i].sPrenom));
  80. f2 >> Etudient[i].sNom;
  81. f2.seekg(42+sizeof(Etudient[i].sPrenom)+sizeof(Etudient[i].sNom));
  82. f2 >> Etudient[i].nNombre2Note;
  83. f2.close();
  84. }
  85. }
  86. while (1)
  87. {
  88. //affichage du menu principale
  89. cout << "=== Gestionnaire d'eleve ===" << endl
  90. << "1.Creer un nouveau compte" << endl
  91. << "2.Lire les informations d'un eleve" << endl
  92. << "3.Ajouter une note a un eleve" << endl
  93. << "4.Quitter" << endl << endl;
  94. cin >> nChoix;
  95. if (nChoix == 4)
  96. break;
  97. switch(nChoix)
  98. {
  99. // creation d'un nouveau eleve
  100. case 1 :
  101. //aquisition des données
  102. cout << "=== Nouvelle eleve ===" << endl
  103. << "Entrez votre prenom : ";
  104. cin >> Etudient[nNombre2Compte].sPrenom;
  105. cout << "Entrez votre nom : ";
  106. cin >> Etudient[nNombre2Compte].sNom;
  107. //sauvegarde des données
  108. sprintf(sFichierNom, "Compte\\%Ld.txt", nNombre2Compte);
  109. ofstream f3(sFichierNom);
  110. if (!f3.is_open())
  111. {
  112. cout << "une erreur est survenue durant l'ouverture du fichier \"" << sFichierNom << "\"" << endl;
  113. system("PAUSE");
  114. exit(1);
  115. }
  116. f3 << "Prenom : " << Etudient[nNombre2Compte].sPrenom << endl <<
  117. "Nom : " << Etudient[nNombre2Compte].sNom << endl <<
  118. "Nombre de Note : " << Etudient[nNombre2Compte].nNombre2Note;
  119. f3.close();
  120. //augmentation du nombre de compte
  121. nNombre2Compte++;
  122. ofstream f4("parametre.txt");
  123. if (!f4.is_open())
  124. {
  125. cout << "une erreur est survenue durant l'ouverture du fichier \"parametre.txt\"" << endl;
  126. system("PAUSE");
  127. exit(1);
  128. }
  129. f4 << "Nombre de compte : " << nNombre2Compte;
  130. f4.close();
  131. cout << "le compte a ete cree" << endl;
  132. system("PAUSE");
  133. break;
  134. //Lire informations
  135. case 2 :
  136. cout << "Entrez le numero de l'eleve : ";
  137. cin >> nChoix;
  138. if (nChoix >= nNombre2Compte)
  139. {
  140. cout << "Le numero est incorrect" << endl;
  141. system("PAUSE");
  142. break;
  143. }
  144. cout << "Prenom : " << Etudient[nChoix].sPrenom << endl
  145. << "Nom : " << Etudient[nChoix].sNom << endl
  146. << "Nombre de Note : " << Etudient[nChoix].nNombre2Note << endl;
  147. system("PAUSE");
  148. break;
  149. // Ajout d'une note
  150. case 3 :
  151. nNouvelleNote = 0;
  152. nChoix = 0;
  153. cout << endl
  154. << "Entrez votre note : ";
  155. cin >> nNouvelleNote;
  156. Etudient[nChoix].AjoutNote(nNouvelleNote, &Etudient[nChoix]);
  157. cout << "Vous avez " << Etudient[nChoix].nNombre2Note << " Note";
  158. if (Etudient[nChoix].nNombre2Note > 1)
  159. cout << "s";
  160. cout << endl
  161. << "votre moyenne est de " << Etudient[nChoix].fMoyenne << endl
  162. << endl
  163. << "1. Entrer une nouvelle note" << endl
  164. << "2. Quitter." << endl;
  165. cin >> nChoix;
  166. system("PAUSE");
  167. break;
  168. default :
  169. cout << "Entree incorrect" << endl;
  170. system("PAUSE");
  171. break;
  172. }
  173. nChoix = 0;
  174. cout << endl << endl;
  175. }
  176.  
  177.  
  178. return EXIT_SUCCESS;
  179. }

ou pour qu'il soit plus si lisible il est disponible a cette adresse : "http://perso.wanadoo.fr/foxnounours/main.cpp"

merci de m aider.
10 Mars 2006 18:21:14

Le problème n'est plus le même, il vient de la déclaration de tes variables f3 et f4 à l'intérieur des switch.
C++ ne tolère pas ce genre de déclaration.
Pour tricher, tu peux faire ça :

  1. switch(nChoix){
  2. case 1:{//accolade ouvrante
  3. ...
  4. ofstream f3(sFichierNom);
  5. ...
  6. break;
  7. }//accolade fermante
  8. case 2: ...
  9. }
10 Mars 2006 18:27:10

Merci =) ça marche maintenant

sinon completement hors sujet mes c'est quoi les balises pour le code ?
a b L Programmation
10 Mars 2006 19:24:15

Tu as un bouton code qui met les tags [ c o d e ][ / c o d e ]
10 Mars 2006 19:29:21

les bouton de code marche pas chez moi comme les lien vers les adress exterieur au site d'ailleur.

Merci

sinon pourraige savoir la fonction qui permet d aller a la fin du fichier svp a la place de cette boucle :

  1. while(1)
  2. {
  3. cTampon = f.getchar();
  4. if(cTampon == EOF)
  5. break;
  6. }


voila
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS