Salut à tous.
Voila, je dois faire des lectures binaires sur un flux de la stl. Pour cela, je commence par l'ouvrir en binaire puis j'utilise une fonction pour lire les données au fur et à mesure. J'ai mis au point deux versions de cette fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int yaread(struct SDL_RWops *context, void *ptr, int size, int maxnum) { std::istream* s = (std::istream*)context->hidden.unknown.data1; int taille=0; while(!s->eof() && taille<size*maxnum) { ((char*)ptr)[taille] = s->get(); taille++; } return taille/size; }Ne vous préoccupez pas trop des deux premières lignes ni de la valeur de retour, cette fonction est appellée par une bibliothèque qui n'est pas de moi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int yaread(struct SDL_RWops *context, void *ptr, int size, int maxnum) { std::istream* s = (std::istream*)context->hidden.unknown.data1; int beg = s->tellg(); s->seekg(0,ios::end); int end = s->tellg(); s->seekg(beg,ios::beg); int taille = size*maxnum<=end-beg?size*maxnum:end-beg; s->read((char*)ptr,taille); return taille/size; }
Il faut savoir que ces deux versions fonctionnent, j'arrive à charger correctement mon image (parceque c'est une image) et à l'afficher. Ensuite, l'objet contenant cette fonction est détruit, le flux est fermé et mon programme continue son exécution (c'est un jeu de société, ca peut prendre longtemps).
Le problème est que si j'utilise la version numéro 2 de cette fonction, le destructeur du flux provoque un plantage en accédant à une portion de mémoire invalide (je rapelle que ce destructeur est appelé longtemps après l'exécution de ma fonction.
Je pourrais bien sur n'utiliser que la première version de cette fonction, mais elle est incroyablement lente (forcément, si on lit les octets un à un...).
Quelqu'un verrait-il ou est l'erreur? J'utilise visual studio 2005.
Partager