tester l'existence d'un fichier et plus

tester l'existence d'un fichier et plus - C++ - Programmation

Marsh Posté le 28-05-2010 à 10:20:12    

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
Reply

Marsh Posté le 28-05-2010 à 10:20:12   

Reply

Marsh Posté le 28-05-2010 à 15:12:46    

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

Reply

Marsh Posté le 28-05-2010 à 15:18:26    

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.

Reply

Marsh Posté le 28-05-2010 à 15:47:17    

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" )

Reply

Marsh Posté le 28-05-2010 à 17:48:57    

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

Reply

Marsh Posté le 01-06-2010 à 10:40:30    

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
Reply

Marsh Posté le 01-06-2010 à 11:10:32    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed