Problème à l'exécution sous VC++ [Résolu]

Problème à l'exécution sous VC++ [Résolu] - C++ - Programmation

Marsh Posté le 23-04-2003 à 21:41:54    

Hello
 
J'ai un truc tout bizarre qui m'arrive avec VC++ 6.0, c'est juste chiant, ca m'empeche pas de bosser mais c'est chiant :
Le code suivant compile parfaitement mais, quand je le lance à partir de Vc++ (le zoli point d'exclamation rouge), le code suivant me lance un runtime error. Si je lance l'appli compilé à partir de windows, ca marche nickel.....La je comprend plus :crazy:
 
Bon j'arrive à bosser mais c'est pas très pratique et puis je suis d'un naturel assez curieux alors j'aimerais bien savoir pourquoi et comment y remédier....
 
Merci
 
 
Voila le code incriminé :

Code :
  1. CString line;
  2. int i=0,j=0,eof=0;
  3. long pos=0;
  4. char cmp[2]="";
  5. char buffer[20]="";
  6. CFile fic("data\\genres.txt", CFile::modeRead );
  7. fic.SeekToBegin();
  8. pos=fic.GetPosition();
  9. //Lecture du nb d'enregistrements
  10. fic.Read(cmp,1);
  11. while(cmp[0]!='\n')  //Parcours une ligne
  12. {
  13.  pos=fic.Seek(pos+1,CFile::begin );
  14.  line+=cmp;
  15.  fic.Read(cmp,1);
  16. }
  17. eof=char2int(line.GetBuffer(0));
  18. //Lecture des enregistrements : nb genre\n
  19. pos=fic.Seek(pos+1,CFile::begin );
  20. fic.Read(cmp,1);
  21. while(j<eof)  //Parcours tout le fichier
  22. {
  23.  line="";
  24.  fic.Read(cmp,1);
  25.  while(cmp[0]!='\n')  //Parcours une ligne
  26.  {
  27.   pos=fic.Seek(pos+1,CFile::begin );
  28.   line+=cmp;
  29.   fic.Read(cmp,1);
  30.  }
  31.  i=0;
  32.  while(line[i]!=' ')i++;
  33.  line=line.Right(line.GetLength()-i-1);
  34.  line=line.Left(line.GetLength()-1);
  35.  m_Genres[j] = line;
  36.  j++;
  37.  pos=fic.Seek(pos+1,CFile::begin );
  38. }
  39. fic.Close();


Message édité par gooopil le 24-04-2003 à 13:49:29
Reply

Marsh Posté le 23-04-2003 à 21:41:54   

Reply

Marsh Posté le 23-04-2003 à 21:57:40    

je sais pas trop ce qui peut provoquer ca, mais dans un premier temps essaie de simplifier un peu la routine de lecture de ton fichier.
Tu veux juste lire ton fichier ligne par ligne ?
si oui utilise CArchive :
 

Code :
  1. CFile f;
  2.  // ouvrir le fichier
  3.  if(f.Open("monBeauFichier.txt", CFile::modeRead, NULL))
  4.  {
  5.   CArchive ar(&f, CArchive::load);
  6.   CString data;
  7.   while(ar.ReadString(data))
  8.   {
  9.    // traiter la ligne


Message édité par SquiZZ le 23-04-2003 à 22:01:30
Reply

Marsh Posté le 23-04-2003 à 22:04:29    

Pff et tu sais même pas pourquoi ca marche pas ;)
 
Nan je déconne, Merci :) comme je vais pas mettre un post à chaque fois que j'ai une couille, j'avais laissé mon truc un peu foireux mais qui marche. Du coup, je vais pouvoir faire ca proprement :D
 
Ca m'interresse toujours de savoir pourquoi ca marche qu'a moitié.....
 
 
Tiens, Barthez vient de s'en prendre un troisième par Ronaldo :D:D


Message édité par gooopil le 23-04-2003 à 22:04:50
Reply

Marsh Posté le 23-04-2003 à 22:12:25    

Code :
  1. i=0;
  2.       // ici je testerais bien la fin de chaine histoire de pas  
  3.       // partir en live si j'ai pas d'espace dans la ligne
  4.       while(line[i]!=' ')i++;
  5.      
  6.       // c'est censé faire quoi ?
  7.       // tu peux donner un exemple d'une ligne de ton fichier
  8.       line=line.Right(line.GetLength()-i-1);
  9.       line=line.Left(line.GetLength()-1);
  10.       // c'est quoi m_genres ?   surement un CString[46] ?
  11.       m_Genres[j] = line;
  12.    
  13.       // on testerais pas si j est supérieur à 45 ?
  14.       j++;


Message édité par SquiZZ le 23-04-2003 à 22:16:34
Reply

Marsh Posté le 23-04-2003 à 22:25:06    

- Chaque enregistrement est de la forme  
0 Texte Machin à récupérer
1 Blabla
....
 
- le .right et .left servent à enlever un espace et le \n en trop dans la chaine. Au départ, j'avais prévu de récup juste ce que j'avais besoin mais je sais plus pourquoi j'arrivais pas à me débarrasser de l'espace et du \n
 
-m_Genres est effectivement un tableau, la taille est supérieure aux nombres d'enregistrements du fichier, qui de toutes façons ne grandira pas énormément (c'est la liste des genres ID3 pour les Mp3)
 

Reply

Marsh Posté le 23-04-2003 à 22:34:34    

si tu utilises Carchive, ReadString ne met pas \n à la fin de la chaine.
 
pour le "while(line[i]!=' ';)i++; " utilises la méthode Find de la classe CString
 
Si ca plante encore après toutes ces modifs, c'est que ca vient pas de là.


Message édité par SquiZZ le 23-04-2003 à 22:35:04
Reply

Marsh Posté le 23-04-2003 à 22:37:46    

SquiZz a écrit :

si tu utilises Carchive, ReadString ne met pas \n à la fin de la chaine.
 
pour le "while(line[i]!=' ';)i++; " utilises la méthode Find de la classe CString
 
Si ca plante encore après toutes ces modifs, c'est que ca vient pas de là.


 
Je vais me mettre a CArchive dès la fin du match :)
 
Par contre, je vois pas l'avantage d'utiliser Find() ds ce cas. En interne, il doit bien faire qq chose ds le genre....
 
Merci du coup de main

Reply

Marsh Posté le 23-04-2003 à 22:43:51    

Gooopil a écrit :


 
Par contre, je vois pas l'avantage d'utiliser Find() ds ce cas. En interne, il doit bien faire qq chose ds le genre....
 


 
ouep, mais si les gens de crosoft se sont amusés à faire un méthode c'est pour que tu n'aies pas à faire des while(i!=' ';)i++; à tout bout de champ. En plus c'est un peu plus sécurisé et ca te retourne -1 si le caractère a pas été trouvé. tout ca en une seule instruction, rendez vous compte  :sarcastic:

Reply

Marsh Posté le 23-04-2003 à 22:44:52    

SquiZz a écrit :


 
ouep, mais si les gens de crosoft se sont amusés à faire un méthode c'est pour que tu n'aies pas à faire des while(i!=' ';)i++; à tout bout de champ. En plus c'est un peu plus sécurisé et ca te retourne -1 si le caractère a pas été trouvé. tout ca en une seule instruction, rendez vous compte  :sarcastic:


 
:D

Reply

Marsh Posté le 24-04-2003 à 13:16:30    

C'est une histoire de working directory : quand tu le lances a la main, bah le working directory est celui ou se trouve l'éxé, mais sous visual quand tu le lances avec CTRL-F5 ou en debug, le working directory par défaut est celui ou se trouve les sources.
 
donc ton fichier "data\\genres.txt" aurait ptet du mal a s'ouvrir si j'ai pas tort. De toute facon t'aurais pu trouver tout seul en lancant une debug.
 
en vc6 me souviens plus, mais sous le 7 ca se change dans les propriétés de ton projet, debugging, Working Directory. Tu mets un $(OutDir) ki correspond a Release, Debug, ou autres et ca devrait marcher.

Reply

Marsh Posté le 24-04-2003 à 13:16:30   

Reply

Marsh Posté le 24-04-2003 à 13:38:59    

Konar a écrit :

C'est une histoire de working directory : quand tu le lances a la main, bah le working directory est celui ou se trouve l'éxé, mais sous visual quand tu le lances avec CTRL-F5 ou en debug, le working directory par défaut est celui ou se trouve les sources.
 
donc ton fichier "data\\genres.txt" aurait ptet du mal a s'ouvrir si j'ai pas tort. De toute facon t'aurais pu trouver tout seul en lancant une debug.
 
en vc6 me souviens plus, mais sous le 7 ca se change dans les propriétés de ton projet, debugging, Working Directory. Tu mets un $(OutDir) ki correspond a Release, Debug, ou autres et ca devrait marcher.


 
Nickel chrome ca marche parfaitement :D
 
Pour ce qu'il est de trouver tout seul, tu surestimes mes capacités à utiliser le debugger ;)
 
Merci

Reply

Sujets relatifs:

Leave a Replay

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