Toon posts:

[C++] STL iostream, 2GB doorbreken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is het mogelijk om mbv de STL iostream classes bestanden te schrijven/lezen die groter zijn dan 2GB? Ik zit nu met het probleem namelijk dat de functie tellp() (geeft de write position terug) een long teruggeeft. Ik gebruik windows (XP) en visual studio studio 6. tellg() geeft ook een long terug. Longs zijn in windows 32 bit signed, dus 2GB is de limiet. Zijn hier trucks voor, of moet ik alles omcoden naar win32 calls?

Groet,

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Vziw moet je inderdaad aan de API-calls ja :)

Professionele website nodig?


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ja, 64bit is nog een drama, maar het begint beter te worden met deopkomst van de 64 bit platforms en 64bit windows. En large files zijn weer niet platform onafhankelijk...ik heb er toendertijd voor gekozen om m'n files op te splitsen in blocks <2GB. Je kan het nl. ook niet memory mappen op een 32bit machine (ongeacht os of taal)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
VC7, vziw.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

std::streamoff is nog altijd een long onder VC7(.1)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 06:45
Vanaf VC++ 8.0 niet meer (daarin is het een of andere structure van 24 bytes, waarmee je ongetwijfeld grote bestanden kunt openen). Maar ja, zelfs als je daar naar zou willen upgraden, is het nog even wachten op de officiële release.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Heb je niet naar std::streampos gekeken ipv streamoff? Da's idd een structure, van het type std::fpos<int>. Std::streamoff is het type dat door fpos gebruikt wordt om file offsets bij te houden, dat is dus het type waar je naar moet kijken.

.edit: crappy html rechten :/

[ Voor 10% gewijzigd door .oisyn op 09-02-2005 21:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
fgetpos/fsetpos is niet win32-specifiek, maar onder win32 wel 64-bits. Lijkt me een bruikbaar compromis.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 06:45
.oisyn schreef op woensdag 09 februari 2005 @ 21:15:
[nohtml]Heb je niet naar std::streampos gekeken ipv streamoff? Da's idd een structure, van het type std::fpos<int>. Std::streamoff is het type dat door fpos gebruikt wordt om file offsets bij te houden, dat is dus het type waar je naar moet kijken.
Bedoelde je mij, of de TS?

Ik heb gekeken naar wat tellp en tellg voor ding returnen; dat is een std::iostream::pos_type en dat is een structure met een 64-bits _Fpos member. seekp en seekg kunnen die gebruiken om exact te positioneren (en daarnaast kunnen ze relatief positioneren met een std::iostream::off_type, wat wel een 32-bits waarde is).

Ik heb het verder niet getest (bij gebrek aan bestanden groter dan 2 GB :P) maar ik neem aan dat als de TS zoals 'ie zegt wil seeken naar posities die 'ie met tell gevonden heeft, dat onder Visual Studio 8 (en misschien 7 dus?) goed moet werken voor grote bestanden.

[ Voor 25% gewijzigd door Soultaker op 10-02-2005 11:05 ]


Verwijderd

Topicstarter
Mensen, allemaal bedankt voor jullie bijdrage. Ik heb even nagedacht en ben tot de conclusie gekomen dat ik niet boven de 4GB uit hoef te komen. Echter is dit nog steeds een probleem, aangezien de tellp() functie een long teruggeeft. Ik zie dat jullie met allerlei oplossingen komen voor 64bits bestandgroottes, maar 32 bit is ook OK.

Verwijderd

Topicstarter
Waarom hebben ze trouwens gekozen bij de STL om een long terug te geven ipv een dword (unsigned 32 bits)?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik denk omdat een offset ook negatief kan zijn, ten opzichte van het eind van een file. Dan zou je twee verschillende index types krijgen, een signed voor offset en een unsigned voor absolute positionering. Daar toendertijd 2GB ruim voldoende was voor wat dan ook, ligt het voor de hand om een type te gebruiken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Omdat een dword geen C++ type is? Omdat een long 64 bits hoort te zijn op 64-bits platformen/

Sowieso is het return type van tellp implementation-defined, en is iostream nooit een onderdeel geweest van de STL.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

MSalters schreef op vrijdag 11 februari 2005 @ 16:45:
Omdat een long 64 bits hoort te zijn op 64-bits platformen/
Volgens mij hoeft dat niet perse, en is het implementation defined? Een long zou ook prima 128 bits kunnen zijn, als je het opvat als een grotere int, of twee keer je adres grootte.

Verwijderd

Topicstarter
Maar goed, om een lang verhaal kort te maken: ik moet directe calls doen naar de WIN32 API om mijn probleem op te lossen? Dan doe ik dat. Bedankt voor jullie hulp!
Pagina: 1