[C++]{debutant}EOF après l'EOF? Oda?

{debutant}EOF après l'EOF? Oda? [C++] - C++ - Programmation

Marsh Posté le 15-10-2006 à 20:39:06    

Bonjour,
 
Je suis débutant en c++. Je cherche a lire un fichier sous la forme suivante :  

Citation :

1.2.3.4.5.6.7.8.9.10
10.8.7.6.5.4.3.2.1.0


Je veux le stocker dans une var map[x][y].
map[1][0] est égal à 2.
map[0][1] est égal à 1.
map[1][1] est égal à 0.
 
etc..
 
Donc, j'ai codé une petite fonction (et ça ma pris un temps fou) ReadMapFile() :

Code :
  1. void ReadMapFile(char *filename, unsigned int map[250][250]){ //lis et stock la map d'un fichier
  2. char * pMapChar[250];
  3. unsigned int * pMap[250];
  4. int x=0;
  5. int y=0;
  6. char MapChar[250][250];
  7. char *splitchar;
  8. ifstream MapFile(filename);
  9. if(!MapFile){
  10. cout<<"Erreur d'ouverture \n";
  11. exit(1);
  12. }
  13. else
  14. {
  15.  while(!MapFile.eof()){
  16.   cout<<endl<<"y : "<<y<<endl;
  17.   pMapChar[y]=&MapChar[0][y];
  18.   MapFile.getline(pMapChar[y], 30000);
  19.   cout<<pMapChar[y]<<endl;
  20.   splitchar=strtok(pMapChar[y], "." );
  21.   pMap[y]=&map[0][y];
  22.   *pMap[y]=atoi(splitchar);
  23.   cout<<*pMap[y];
  24.   while(splitchar!=NULL){
  25.   splitchar=strtok(NULL, "." );
  26.    if(splitchar!=NULL){
  27.     *pMap[y]=atoi(splitchar);
  28.     cout<<*pMap[y];
  29.    }
  30.   }
  31.   y++;
  32.  }
  33.  MapFile.close();
  34. }
  35. }


 
Le problème c'est que j'ai une segfault a la fin, parce que je getline dans la semoule.
 

Citation :

y : 0
1.2.3.4.5.6.7.8.9.10
12345678910
y : 1
10.9.8.7.6.5.4.3.2.1
10987654321
y : 2
 
Erreur de segmentation


 
Donc, pourquoi alors que j'ai un !MapFile.eof() comme condition du while, et que je crois jurer qu'il n'y a pas cette ligne numéro 3 (y=0, y=1 mais pas plus) et pourtant, la condition est quand même validée?  :fou:  
 
Ça doit surement être très simple, mais je vois vraiment pas.
 
merci d'avance  :jap:
 
crygor  
 

Reply

Marsh Posté le 15-10-2006 à 20:39:06   

Reply

Marsh Posté le 15-10-2006 à 22:10:14    

c'est du C pourri :o
 
utilise std::getline
 
while (std::getline(std::cout, line)) { travailler; }

Reply

Marsh Posté le 15-10-2006 à 22:12:19    

et au passage, eof() ne fait pas ce que tu crois ou ce qu'on ta enseigné. Ça ne détecte pas la fin de fichier, ça caractérise une erreur comme eof.

Reply

Marsh Posté le 15-10-2006 à 22:16:51    

char MapChar[250][250];
char * pMapChar[250];
...
pMapChar[y]=&MapChar[0][y];
MapFile.getline(pMapChar[y], 30000);
 
et on y croit très fort. Débarasse toi de tous ces char*, soit intelligent, utilise std::string

Reply

Marsh Posté le 16-10-2006 à 12:33:02    

je comprends pas bien.. comment je peux utiliser le type string si je veux utiliser chaque caractère séparement? string s[n][n2]?
 
edit : bon, j'ai capté a peu près.. ya l'équivalent de strtok pour un string?
bon jregarde ça : http://c.developpez.com/faq/cpp/?p [...] ING_tokens


Message édité par crygor le 17-10-2006 à 13:34:28
Reply

Marsh Posté le 17-10-2006 à 18:50:45    

bon, j'up, j'ai un peu avancé je crois.. m'enfin :
 

Code :
  1. string ligne;
  2. string elem;
  3. istringstream ligness;
  4. while(std::getline(MapFile, ligne)){
  5.   cout<<endl<<"y : "<<y<<endl;
  6.   cout<<ligne<<endl;
  7.   pMap[y]=&map[0][y];
  8.                         while(std::getline(ligness, elem, '.' )){
  9.     *pMap[y]=atoi(&elem[x]);
  10.     cout<<*pMap[y];
  11.     x++;
  12.   }
  13.   x=0;
  14.   y++;
  15. }


 
Comment je peux récupérer la valeur de ligne dans ligness? ou il y a t'il possibilité de récupérer direct les ligne du fichier dans ligness (istringstream)?
 
merci.


Message édité par crygor le 17-10-2006 à 21:44:11
Reply

Marsh Posté le 18-10-2006 à 09:38:27    

Je derais que tu peux toujours faire :

Code :
  1. ligness << ligne;


Mais je ne comprend toujours pas tout à fait ton histoire, ça reste assez flou pour moi...

Reply

Marsh Posté le 18-10-2006 à 11:19:04    

Citation :

main.cc:101: erreur: no match for «operator<<» in «ligness << ligne»


 
En fait, je cherche à :  
- Lire un fichier.
- Ligne par ligne. '\n'
- Élément par élément. '.'
- Convertir ces éléments en int et stocker.
 
Pour convertir donc un fichier du genre

Citation :

1.2.3.2.1.23.4.5.5
7.3.4.5.6.3.21.6.7.4


En map[x][y]
 
Sachant que x sont les éléments spéarés par des points. Donc, map[3][1] est égal à 4.
 
 

Reply

Marsh Posté le 18-10-2006 à 13:30:43    

Excuse-moi je n'avais pas fait attention que tu avais déclaré un istringstream et non un stringstream...
 
Par contre es-tu sûr de gérer correctement les dimensions du tableau map ? Ne risque-t-il pas d'y avoir de problème ?

Reply

Marsh Posté le 18-10-2006 à 14:20:51    

vyrre ton tableau, utilise un vector de vector. et lis la doc de getline, arrête de faire n'imp avec. même remarque pour istringstream. sors toi les doigts, on fait pas de la cuisine

Reply

Marsh Posté le 18-10-2006 à 14:20:51   

Reply

Marsh Posté le 18-10-2006 à 21:07:18    

j'ai lu la doc de getline, mais bon.. et pourquoi je devrais utiliser un vector? je sais pas ce que c'est, je débute et je suppose qu'on n'est pas obligé d'avoir tout un tas de notion pour faire la base?  
 

Code :
  1. while(std::getline(MapFile, ligne, '\n')){
  2.   cout<<endl<<"y : "<<y<<endl;
  3.   cout<<"s : "<<ligne<<endl;
  4.   ligness.str(ligne);
  5.   cout<<"iss : "<<ligness.str()<<endl;
  6.   pMap[y]=&map[0][y];
  7.   while(std::getline(ligness, elem, '.' )){
  8.     *pMap[y]=atoi(&elem[0]);
  9.     //cout<<"&elem[0] : "<<&elem[0]<<endl;
  10.     cout<<"*pMap[y] : "<<*pMap[y]<<endl;
  11.   }
  12.   y++;
  13. }


 

Citation :

y : 0
s : 1.2.3.4.5
iss : 1.2.3.4.5
*pMap[y] : 1
*pMap[y] : 2
*pMap[y] : 3
*pMap[y] : 4
*pMap[y] : 5
 
y : 1
s : 1.9.8.7.6
iss : 1.9.8.7.6
 
y : 2
s : 3.4.5.6.4.3.4.5.6.4.3.4.5
iss : 3.4.5.6.4.3.4.5.6.4.3.4.5


 
 

Reply

Sujets relatifs:

Leave a Replay

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