[C++] classe Vector pas puissante ?

classe Vector pas puissante ? [C++] - C++ - Programmation

Marsh Posté le 23-01-2005 à 21:00:03    

salut tous le monde,
 
voilà je voudrais charger un fichier en mémoire. ce fichier est constitué d'une suite de caractères séparés par des virgules, comme dans l'exemple suivant: 775,763,760,770,775,806,784,776,792,779,782,767,818,767,788,789,778,
pour ça j'utilise la classe Vector.
 
Le problème est que le chargement se passe bien sur des petits fichiers de quelques centaines de caractères, mais dès que je veux charger les fichiers avec lesquels je dois travailler qui font 1.39Mo, soit 1 466 408 caractères et bien ça plante !!!
 
Je ne sais pas d'où vient exactement le problème, mais je soupçonne la classe Vector d'être limité en taille, bien que la reservation de la mémoire se passe sans pb à la compilation. Mais si c'est ça le problème, je ne vois pas dans quel type de container je pourrais alors charger ce fichier !!! :??:  
 
Donc si qqn pouvait m'aider sur ce point ça serait bien sympa.
 
voici le source de la fonction qui permet le chargement:
 

Code :
  1. bool ImageLoader::loadImage( const string& filename, vector<unsigned short>& imgarray )
  2. {
  3. ifstream ifstr(filename.c_str());
  4. if (!ifstr.good())
  5. {
  6.  cerr << "Failed to open the file "
  7.    << filename
  8.    << endl;
  9.  printError( ifstr.rdstate() );
  10.  return false;
  11. }
  12. imgarray.clear();
  13. imgarray.reserve(IMAGE_SIZE);
  14. // get length (number of characters) of file
  15. ifstr.seekg (0, ios::end);
  16. long length = ifstr.tellg();
  17. ifstr.seekg (0, ios::beg);
  18. // loading image into an array
  19. char *buffer = (char *) malloc(5 * sizeof(char));
  20. char *tokstr;
  21. ifstr.get(buffer, length+1, ifstr.eof());
  22. tokstr = strtok(buffer, "," );
  23. // fill the imgarray with the values extracted from the input image file
  24. while (tokstr != NULL)
  25. {
  26.  imgarray.push_back(atoi(tokstr));
  27.  tokstr = strtok (NULL, "," );
  28. }
  29. ifstr.close();
  30. return true;
  31. } // loadImage()

Reply

Marsh Posté le 23-01-2005 à 21:00:03   

Reply

Marsh Posté le 23-01-2005 à 22:07:49    

c'est connu, quand un programme merde, ca vient du code utilisé par des millions de personnes, pas de son propre code.
 
question à 100 balles :
combien tu alloues de mémoire avec ton malloc ?
combien tu mets de données dedans avec ton ifstr.get ?
 

Reply

Marsh Posté le 23-01-2005 à 22:46:53    

1) malloc() sans free()
2) malloc() pour 5 chars ?
 

Reply

Marsh Posté le 23-01-2005 à 22:49:45    

Je +1 avec les 2 questions de SquiZZ. Fourrer tout un fichier dans une chaîne de 5 octets, c'est pas tous les jours la joie...

Reply

Marsh Posté le 23-01-2005 à 22:50:05    

:whistle:  :whistle:  :whistle:  
 
malloc, malloc, maloque, ma loque...effectivement !!!
 
merci pour cette aide, sur un ton un peu condescendant, mais c'est un coup de main quand même !!!  :jap:

Reply

Marsh Posté le 23-01-2005 à 22:52:56    

Bof, c'est dimanche soir. On se prépare pour le Lundi matin et les mecs en IUT qui auront pas fini leur TPs à rendre et qui vont nous pourrir le forum toute la journée :D

Reply

Marsh Posté le 23-01-2005 à 22:55:35    

n'empêche compilo à la c** !!! et la tu vas pas me contredire Squizz, il aurait pu le voir ça !!!
 
Bon en tout cas, je donne la version corrigée, au cas il y aurait des étourdis comme moi, qui un jour tomberaient sur le même os.
 

Code :
  1. bool ImageLoader::loadImage( const string& filename, vector<unsigned short>& imgarray )
  2. {
  3. ifstream ifstr(filename.c_str());
  4. if (!ifstr.good())
  5. {
  6.  cerr << "Failed to open the file "
  7.    << filename
  8.    << endl;
  9.  printError( ifstr.rdstate() );
  10.  return false;
  11. }
  12. imgarray.clear();
  13. imgarray.reserve(IMAGE_SIZE);
  14. // get length (number of characters) of file
  15. ifstr.seekg (0, ios::end);
  16. long length = ifstr.tellg();
  17. ifstr.seekg (0, ios::beg);
  18. // loading image into an array
  19. char *buffer = (char *) malloc(length+1 * sizeof(char));
  20. char *tokstr;
  21. ifstr.get(buffer, length+1, ifstr.eof());
  22. tokstr = strtok(buffer, "," );
  23. // fill the imgarray with the values extracted from the input image file
  24. while (tokstr != NULL)
  25. {
  26.  imgarray.push_back(atoi(tokstr));
  27.  tokstr = strtok (NULL, "," );
  28. }
  29. ifstr.close();
  30. return true;
  31. } // loadImage()


Message édité par klaastyl le 23-01-2005 à 22:58:33
Reply

Marsh Posté le 23-01-2005 à 22:56:53    

Pourquoi tu n'utilises pas tout simplement une string et un getline ?

Reply

Marsh Posté le 23-01-2005 à 22:57:21    

klaastyl a écrit :

n'empêche compilo à la c** !!! et la tu vas pas me contredire Squizz, il aurait pu le voir ça !!!


 
j'aurais plutôt dis "codeur à la con", quoi que codeur n'est peut être pas le terme approprié  :sarcastic:

Reply

Marsh Posté le 23-01-2005 à 22:59:07    

:kaola:  :kaola:  :kaola:

Reply

Sujets relatifs:

Leave a Replay

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