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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1457684
crygor
Posté le 15-10-2006 à 20:39:06  profilanswer
 

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  
 

mood
Publicité
Posté le 15-10-2006 à 20:39:06  profilanswer
 

n°1457714
Taz
bisounours-codeur
Posté le 15-10-2006 à 22:10:14  profilanswer
 

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

n°1457718
Taz
bisounours-codeur
Posté le 15-10-2006 à 22:12:19  profilanswer
 

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.

n°1457720
Taz
bisounours-codeur
Posté le 15-10-2006 à 22:16:51  profilanswer
 

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

n°1457942
crygor
Posté le 16-10-2006 à 12:33:02  profilanswer
 

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
n°1459056
crygor
Posté le 17-10-2006 à 18:50:45  profilanswer
 

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
n°1459293
bb138
La vie est belle ...
Posté le 18-10-2006 à 09:38:27  profilanswer
 

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...

n°1459378
crygor
Posté le 18-10-2006 à 11:19:04  profilanswer
 

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.
 
 

n°1459513
bb138
La vie est belle ...
Posté le 18-10-2006 à 13:30:43  profilanswer
 

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 ?

n°1459556
Taz
bisounours-codeur
Posté le 18-10-2006 à 14:20:51  profilanswer
 

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

mood
Publicité
Posté le 18-10-2006 à 14:20:51  profilanswer
 

n°1460059
crygor
Posté le 18-10-2006 à 21:07:18  profilanswer
 

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


 
 


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

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

 

Sujets relatifs
[RESOLU] tab multidimensionel en paramètre d'une fonction[Résolu] Api win 32, quelque question de débutant....
Mettre une page a code pour vrais debutant[Debutant][Mysql]copie de champs d'une table à une autre
[Débutant] logiciel pour programmer en vb6rassembler "long" et "char" pour débutant
batch pour débutant[VBS] Ping à partir d'une variable (débutant inside)
[Ajax de débutant] : problème avec l'attribut status ?![Resolu] Débutant swing : interface graphique dynamique
Plus de sujets relatifs à : [C++]{debutant}EOF après l'EOF? Oda?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)