Erreur d'exécution

Fermé
Sigmastorm - 19 avril 2013 à 13:40
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 27 avril 2013 à 16:10
Salut, j'ai convertis ce programme de fichiers binaires au fichiers textes mais le problème , au niveau d'exécution il n'affiche pas les nombres que j'ai entrés SVP quelqu'un peut m'aider.
Voila le programme:
//***la ligne ou se trouve l'adresse du fichier courant vous pouvez remplacer par un autre fichier créer par vous**///
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
void creer(char *nom)
{
FILE *index = fopen(nom,"w"); int n;
for(int i=0;i<3;i++)
{
cout<<"Saisir le nombre"<<i+1<<":"; cin >> n ;
fprintf(index,"%d",n);
}
fclose(index);
}
void lire (char *nom)
{
FILE *index = fopen(nom,"r"); int n, u=0 ;
cout<<"Voici le contenu du fichier:\n";
while(u==0)
{
fscanf(index,"%d",&n); u = feof(index);
if(u==0)cout<< n <<" ";
}
cout<<"\n\n"; fclose(index);
}
void ajout (char *nom, int n)
{
FILE *index = fopen(nom,"a+");
fprintf(index,"%d",n); fclose(index);
}
int cherche(char *nom, int n)
{
FILE *index = fopen(nom,"r"); int place=0, u=0, n_lu, trouve=0;
while(u==0)
{
fscanf(index,"%d",&n_lu); place++;
if(n== n_lu) trouve = place; // trouve le dernier
u=feof(index);
}
fclose(index);
return trouve;
}
main()
{
char mon_fichier[50] = "c:\\users\\sony\\documents\\tp8\\saad.txt";
int plus, combien, numero;
creer(mon_fichier); lire(mon_fichier);
cout<<"Saisir le nombre à ajouter : "; cin>>plus;
ajout(mon_fichier,plus); lire(mon_fichier);
cout<<"Saisir le nombre a rechercher : "; cin>>combien;
numero = cherche(mon_fichier, combien);
if(numero==0)cout<<"Ce nombre n'existe pas\n";
else cout<<"Ce nombre se trouve a la place numero "<<numero<<"\n";
cout<<"\nPOUR SORTIR FRAPPER UNE TOUCHE "; getch();
}

1 réponse

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
Modifié par mamiemando le 27/04/2013 à 16:10
Il y a plusieurs choses qui ne vont pas.

1) Pour commencer aucune raison d'inclure conio.h qui dans ce programme ne sert à rien et n'est pas un header standard.

2) Ensuite en C++ moderne, il faut inclure <iostream> et non <iostream.h>. On peut au besoin dans un fichier ".cpp" ajouter l'instruction "using namespace std;" pour taper "cout" ou "endl" au lieu de "std::cout" ou "std::endl".

3) En C++ on n'inclue pas <stdio.h> qui est un header C, mais <cstdio> qui est le header C++ correspondant.

4) Ta fonction main est sensée avoir l'un des prototypes suivant

int main() 
int main(int argc, char **argv)


... et elle est sensée retourner 0 si tout s'est bien passé (une valeur non nulle sinon, appelée code d'exécution).

5) Pour être dans l'esprit C++, normalement tu n'as pas vraiment de raison d'utiliser de FILE * (plutôt des std::ofstream ou std::ifstream), ni les fonctions associées (fopen, close) qui serait plus la manière de faire en C. De plus tu es sensé vérifier que fopen n'échoue pas (il retourne dans ce cas un pointeur non NULL), car le fichier peut ne pas exister ou tu peux ne pas avoir les droits nécessaire pour l'ouvrir. Ainsi pour ouvrir et fermer proprement un fichier on écrirait :

En C :

#include <stdio.h> 

int manipuler_fichier(const char * filename) { 
  FILE * fp; 
  if (!(fp = fopen(filename, "r")) { 
    fprintf(stderr, "Can't read %s\n", filename); 
    return -1; 
  } 
  //... lire le fichier ... 
  fclose(fp); 
  return 0; 
}


En C++ :

#include <iostream> 
#include <fstream> 

bool manipuler_fichier(const char * filename) { 
  std::ifstream ifs(filename); 
  if (!ifs) { 
    std::cerr << "Can't read " << filename << std::endl; 
    return -1; 
  } 
  //... lire le fichier ... 
  ifs.close(); 
  return 0; 
}


6) De la même façon, pour lire des valeurs saisies au clavier, je te conseille d'utiliser std::cin et l'opérateur >> car il y a beaucoup de pièges avec scanf.

int x, y; 
std::cout << "x ?" << std::endl; 
std::cin >> x; 
std::cout << "y ?" << std::endl; 
std::cin >> y;


7) Aucune raison de déclarer un char[50] ici, un const char * est bien plus indiqué :

const char * mon_fichier = "c:\\users\\sony\\documents\\tp8\\saad.txt"; 


8) Pour écrire dans un fichier, encore une fois il ne faut pas hésiter à utiliser std::ofstream et l'opérateur <<, qui s'utilise de la même manière que pour std::cout et std::cerr.

bool ecrire_fichier(const char * filename) { 
  std::ofstream ofs(filename); 
  if (!ofs) { 
    std::cerr << "Can't write " << filename << std::endl; 
    return -1; 
  } 
  ofs << "Coucou" << std::endl; 
  ofs.close(); 
  return 0; 
}


Bonne chance
0