Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2312 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  tester l'existence d'un fichier et plus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tester l'existence d'un fichier et plus

n°1996690
pamputt
Posté le 28-05-2010 à 10:20:12  profilanswer
 

Bonjour,
je suis en train d'apprendre à utiliser les strings et les flux en c++ et tout ne fonctionne pas comme je voudrais. Voici mon code

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. char text[100];
  6. bool is_readable(const string &file) //indique si un fichier est lisible (et donc si il existe)
  7. {
  8.   ifstream fichier(file.c_str());
  9.   return !fichier.fail();
  10. }
  11. void main()
  12. {
  13.   string answer;
  14.   string output_file("fichier.dat" );
  15.   ofstream output(output_file.c_str());
  16. if(is_readable(output_file.c_str()))
  17. {
  18. cout << output_file << " exists. Do you want to erase this file (type \"erase\" ) or to create a new one (type \"create\" )?" << endl;
  19. cin >> answer;
  20. while (strcmp(answer.c_str(),"erase" )==1 || strcmp(answer.c_str(),"create" )==1) //strcmp renvoie 1 quand les chaines sont différentes
  21. {
  22.    cout << "Choice is incorrect, type \"erase\" or \"create\"." << endl;
  23.    cout << answer << endl;
  24.    cin >> answer;
  25. }
  26. if(strcmp(answer.c_str(),"erase" )==0)
  27. {
  28.     ofstream output(output_file.c_str());
  29. }
  30. if(strcmp(answer.c_str(),"create" )==0)
  31. {
  32.   cout << "Type the new file name" << endl;
  33.   cin >> output_file;
  34.   output.close();
  35.   ofstream output(output_file.c_str());
  36. }
  37. }
  38. }//fin de main


 
En gros, je voudrais tester si le fichier "fichier.dat" existe déjà et si c'est le cas permettre à l'utilisateur de l'écraser ou de proposer un nouveau nom. Qu'est ce que je fais mal ?


Message édité par pamputt le 28-05-2010 à 15:02:52
mood
Publicité
Posté le 28-05-2010 à 10:20:12  profilanswer
 

n°1996814
malka1986
Posté le 28-05-2010 à 15:12:46  profilanswer
 

Tu fais un horrible mélangee de C / CPP.
Et ton proto de main est faux.
Et tu devrais lire le man de strcmp.

n°1996821
pamputt
Posté le 28-05-2010 à 15:18:26  profilanswer
 

Pour l'horrible mélange de C/C++, c'est bien possible mais comme je l'ai dit au début je suis en train d'apprendre donc tous les conseils sont les bienvenus pour que j'améliore cela.
Le proto de main est peut-être faux, en effet car j'ai créé un truc vite fait. Tu peux me dire ce qui ne va pas.
Enfin, je viens de lire le man de strcmp, il dit

Citation :

SYNOPSIS
       #include <string.h>
 
       int strcmp(const char *s1, const char *s2);
 
       int strncmp(const char *s1, const char *s2, size_t n);
 
DESCRIPTION
       La  fonction  strcmp()  compare  les deux chaînes s1 et s2.  Elle renvoie un
       entier négatif, nul, ou positif, si s1 est respectivement inférieure,  égale
       ou supérieure à s2.
 
       La  fonction  strncmp()  est identique sauf qu'elle ne compare que les n (au
       plus) premiers caractères de s1 et s2.
 
VALEUR RENVOYÉE
       Les fonctions strcmp() et strncmp() renvoient un entier inférieur,  égal  ou
       supérieur  à  zéro  si  s1  (ou  ses  n  premiers octets) est respectivement
       inférieure, égale ou supérieure à s2.


Je ne vois pas ce qui cloche.

n°1996861
malka1986
Posté le 28-05-2010 à 15:47:17  profilanswer
 

Code :
  1. while (strcmp(answer.c_str(),"erase" )==1 || strcmp(answer.c_str(),"create" )==1) //strcmp renvoie 1 quand les chaines sont différentes


 
Mais en CPP tu peux faire beaucoup plus simplement un test

Code :
  1. while (answer != "erase" || answer != "create" )

n°1996918
Joel F
Real men use unique_ptr
Posté le 28-05-2010 à 17:48:57  profilanswer
 

et reagrde du coté de boost::filesystem pour ce genre de truc

n°1997837
pamputt
Posté le 01-06-2010 à 10:40:30  profilanswer
 

Bon, j'ai modifié mon code pour corriger quelques problèmes. Maintenant j'ai ceci

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. bool is_readable(const string &file) //indique si un fichier est lisible (et donc si il existe)
  6. {
  7.   ifstream fichier(file.c_str());
  8.   return !fichier.fail();
  9. }
  10. void main()
  11. {
  12.   string answer;
  13.   string output_file("fichier.dat" );
  14.   ofstream output;
  15. if(is_readable(output_file.c_str()))
  16. {
  17. cout << output_file << " exists. Do you want to erase this file (type \"erase\" ) or to create a new one (type \"create\" )?" << endl;
  18. cin >> answer;
  19. while (answer!="erase" && answer!="create" )
  20. {
  21.    cout << "Choice is incorrect, type \"erase\" or \"create\"." << endl;
  22.    cout << answer << endl;
  23.    cin >> answer;
  24. }
  25. if(answer=="erase" )
  26. {
  27.     ofstream output(output_file.c_str());
  28. }
  29. if(answer=="create" )
  30. {
  31.   cout << "Type the new file name" << endl;
  32.   cin >> output_file;
  33.   ofstream output(output_file.c_str());
  34. }
  35. }
  36. output << "Hello" << endl;
  37. }//fin de main


 
Mon problème c'est que le flux de sortie output ne fonctionne pas. Je m'explique. Si je lui dit d'écraser le fichier fichier.dat alors il va bien l'écraser mais il ne va pas écrire Hello dans ce fichier. fichier.dat sera vide. Idem si je dis de créer un nouveau fichier, alors le fichier sera bien créé mais rien ne sera écrit dedans. Est ce que vous avez une idée sur la manière de corriger cela ?


Message édité par pamputt le 01-06-2010 à 10:43:20
n°1997849
pamputt
Posté le 01-06-2010 à 11:10:32  profilanswer
 

Bon en fait c'est bon, j'ai réussi à faire ce que je voulais. Tout fonctionne bien maintenant. Voici mon code final si ça en intéresse d'autre

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. bool is_readable(const string &file) //indique si un fichier est lisible (et donc si il existe)
  6. {
  7.   ifstream fichier(file.c_str());
  8.   return !fichier.fail();
  9. }
  10. void main()
  11. {
  12.   string answer;
  13.   string output_file("fichier.dat" );
  14.   ofstream output;
  15. if(is_readable(output_file.c_str()))
  16. {
  17. cout << output_file << " exists. Do you want to erase this file (type \"erase\" ) or to create a new one (type \"create\" )?" << endl;
  18. cin >> answer;
  19. while (answer!="erase" && answer!="create" )
  20. {
  21.    cout << "Choice is incorrect, type \"erase\" or \"create\"." << endl;
  22.    cout << answer << endl;
  23.    cin >> answer;
  24. }
  25. if(answer=="erase" )
  26. {
  27.     output.open(output_file.c_str());
  28. }
  29. if(answer=="create" )
  30. {
  31.   cout << "Type the new file name" << endl;
  32.   cin >> output_file;
  33.   output.open(output_file.c_str());
  34. }
  35. }
  36. output << "Hello" << endl;
  37. }//fin de main


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  tester l'existence d'un fichier et plus

 

Sujets relatifs
je n'arrive pas à tester l'existence d'un fichierautorun -> fichier html
fichier batchSupprimer un élément XML en ayant son ID
[C#][WOrd 2003] Modifier fichier Word[Résolu] Création de dossier et fichier impossible
[HS] lignetester l'existence d'un fichier sur le serveur [résolu]
[javascript] tester l'existence d'un fichier (photos)tester l existence d un fichier en c++
Plus de sujets relatifs à : tester l'existence d'un fichier et plus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR