- Mitglied seit
- 04.08.2002
- Beiträge
- 1.869
- Reaktionen
- 0
Moin.
Hiermit oute ich mich ganz offiziell als Anfänger in Sachen STL
Es geht darum, dass ich einen Dateizugriff, den ich bisher mit fread, fseek und ftell gemacht habe, gerne für ein C++ Programm mit io-streams realisieren möchte.
Die alten Funktionen sehen wie folgt aus:
size_t ov_read_func(void *ptr, size_t size, size_t nmemb, void *datasource)
{
return fread(ptr, size, nmemb, (FILE*)datasource);
}
int ov_seek_func(void *datasource, ogg_int64_t offset, int whence)
{
return fseek((FILE*)datasource, (long)offset, whence);
}
long ov_tell_func(void *datasource)
{
return ftell((FILE*)datasource);
}
Mein Ansatz, um das ganze mit einem istream zu machen, sieht folgendermaßen aus:
size_t readDataFromStream(void *ptr, size_t size, size_t nmemb, void *datasource)
{
return ((std::istream*) datasource)->readsome((char*)ptr, nmemb);
}
int seekStreamPosition(void *datasource, ogg_int64_t offset, int whence)
{
//move to the specified initial position
((std::istream*) datasource)->seekg(whence, std::ios::beg);
//move to the specified offset which is relative to the initial position
((std::istream*) datasource)->seekg(offset, std::ios::cur);
return 0;
}
long tellStreamPosition(void *datasource)
{
return ((std::istream*) datasource)->tellg();
}
Hierbei habe ich jetzt direkt mehrere Probleme:
(i) Zum einen klappt die tellStreamPosition() nicht, denn tellg gibt nicht einfach nur einen long-Wert als Positionsangabe zurück sondern ein streampos Objekt. Jetzt ist natürlich die Frage: Wie bekomme ich aus dem streampos Objekt die aktuelle Position (äquivalent zur Rückgabe von ftell)?
(ii) seekStreamPosition() scheint auch nicht korrekt zu funktionieren. Entweder mache ich da einen Denkfehler, oder irgendwas anderes läuft noch schief. Jedenfalls setzt er den Zeiger innerhalb des Streams nicht an die Position, an der er eigentlich sein müsste. Hier habe ich das gleiche Problem mit dem Rückgabewert wie unter (i).
(iii) readDataFromStream() - keine Ahnung ob die sauber arbeitet. Er liest auf jeden Fall Daten aus dem Stream ein und kann die nachher auch sauber verarbeiten, allerdings sind es die Daten von der falschen Position. Ich vermute daher den Fehler nicht in dieser Methode sondern in den beiden anderen.
Falls sich einer der hiesigen C++ Profis erbarmen würde, und mir ein paar Tipps geben könnte, wäre ich echt dankbar.
Thx
m.a.k.
P.S.: gehört zwar nur am Rande zum Thema, aber ich muss mir dringend ein gutes Buch über die STL kaufen. Hat da jemand eine Empfehlung?
Hiermit oute ich mich ganz offiziell als Anfänger in Sachen STL

Es geht darum, dass ich einen Dateizugriff, den ich bisher mit fread, fseek und ftell gemacht habe, gerne für ein C++ Programm mit io-streams realisieren möchte.
Die alten Funktionen sehen wie folgt aus:
size_t ov_read_func(void *ptr, size_t size, size_t nmemb, void *datasource)
{
return fread(ptr, size, nmemb, (FILE*)datasource);
}
int ov_seek_func(void *datasource, ogg_int64_t offset, int whence)
{
return fseek((FILE*)datasource, (long)offset, whence);
}
long ov_tell_func(void *datasource)
{
return ftell((FILE*)datasource);
}
Mein Ansatz, um das ganze mit einem istream zu machen, sieht folgendermaßen aus:
size_t readDataFromStream(void *ptr, size_t size, size_t nmemb, void *datasource)
{
return ((std::istream*) datasource)->readsome((char*)ptr, nmemb);
}
int seekStreamPosition(void *datasource, ogg_int64_t offset, int whence)
{
//move to the specified initial position
((std::istream*) datasource)->seekg(whence, std::ios::beg);
//move to the specified offset which is relative to the initial position
((std::istream*) datasource)->seekg(offset, std::ios::cur);
return 0;
}
long tellStreamPosition(void *datasource)
{
return ((std::istream*) datasource)->tellg();
}
Hierbei habe ich jetzt direkt mehrere Probleme:
(i) Zum einen klappt die tellStreamPosition() nicht, denn tellg gibt nicht einfach nur einen long-Wert als Positionsangabe zurück sondern ein streampos Objekt. Jetzt ist natürlich die Frage: Wie bekomme ich aus dem streampos Objekt die aktuelle Position (äquivalent zur Rückgabe von ftell)?
(ii) seekStreamPosition() scheint auch nicht korrekt zu funktionieren. Entweder mache ich da einen Denkfehler, oder irgendwas anderes läuft noch schief. Jedenfalls setzt er den Zeiger innerhalb des Streams nicht an die Position, an der er eigentlich sein müsste. Hier habe ich das gleiche Problem mit dem Rückgabewert wie unter (i).
(iii) readDataFromStream() - keine Ahnung ob die sauber arbeitet. Er liest auf jeden Fall Daten aus dem Stream ein und kann die nachher auch sauber verarbeiten, allerdings sind es die Daten von der falschen Position. Ich vermute daher den Fehler nicht in dieser Methode sondern in den beiden anderen.
Falls sich einer der hiesigen C++ Profis erbarmen würde, und mir ein paar Tipps geben könnte, wäre ich echt dankbar.
Thx
m.a.k.
P.S.: gehört zwar nur am Rande zum Thema, aber ich muss mir dringend ein gutes Buch über die STL kaufen. Hat da jemand eine Empfehlung?