[C++] fstream vs ofstream

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
In een applicatie edit ik de hosts file. Als ik deze open zoals in line 1 dan werkt het, maar als ik het probeer met line 2 dan werkt het niet (meer), de file kan niet eens worden geopend.
Ik heb de file daarvoor ingelezen via een memory map, maar de handles naar de file en de map zouden gesloten moeten zijn (anders zou fstream toch niet werken)?
C++:
1
2
fstream f("d:/windows/system32/drivers/etc/hosts");
ofstream f("d:/windows/system32/drivers/etc/hosts");

Welk verschil tussen de twee streams zorgt er nou voor dat de tweede variant niet werkt?

[ Voor 10% gewijzigd door Olaf van der Spek op 26-11-2002 14:08 ]


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

ofstream is toch voor output? dus niet voor het inlezen. Of heb ik het nou helemaal mis?

Yep:
ofstream: File class for writing operations (derived from ostream)
ifstream: File class for reading operations (derived from istream)
fstream: File class for both reading and writing operations (derived from iostream)

[ Voor 59% gewijzigd door Darkvater op 26-11-2002 13:57 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Klopt. Ik hoef ook alleen maar te schrijven via die (o)fstream. Het lezen is al gebeurd via een memory map zonder gebruik te maken van (i)fstream.

[ Voor 54% gewijzigd door Olaf van der Spek op 26-11-2002 14:14 ]


Verwijderd

...Ik heb de file daarvoor ingelezen via een memory map...
En je hoeft alleen maar te schrijven :?

[ Voor 35% gewijzigd door Verwijderd op 26-11-2002 14:10 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb gemerkt dat DeleteFile ook faalt. Ik zal eens proberen de volledige code te geven waar het probleem optreed.

Verwijderd

een file die je ge-memory-mapped hebt is exclusively locked. Dus mag je daar niet naar schrijven (duh). Hoe groot is die hosts file? Gewoon cachen zou ik zeggen, dan hoef je em niet steeds open te hebben... Anders moet je iedere keer je memory map sluiten als je naar het bestand wilt schrijven.
Als je het voor de performance doet : kijk dan eens naar sector-aligned unbuffered reads, dat is i.c.m. een slim caching/indexing algorithme nog sneller dan memory mapped files.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 30 November 2002 @ 02:05:
een file die je ge-memory-mapped hebt is exclusively locked. Dus mag je daar niet naar schrijven (duh).
Alleen als je hem zelf locked, anders niet (IIRC). Dat doe ik wel, maar ik sluit hem ook weer voordat ik hem probeer te verwijderen. Misschien dat dit probleem samenhangt met het Windows XP probleem dat een bestand niet te verwijderen is?
Hoe groot is die hosts file? Gewoon cachen zou ik zeggen, dan hoef je em niet steeds open te hebben... Anders moet je iedere keer je memory map sluiten als je naar het bestand wilt schrijven.
Als je het voor de performance doet : kijk dan eens naar sector-aligned unbuffered reads, dat is i.c.m. een slim caching/indexing algorithme nog sneller dan memory mapped files.
De hosts file is erg klein, daar gaat het niet om. Ik gebruik een class voor bijna alle file access en die class heb ik pas veranderd zodat memory maps worden gebruikt (omdat er ook wel eens bestanden van > 500 mb worden geopend.
Maar ik wil natuurlijk wel dat die class goed werkt en als ik die class 'sluit' dat ik dan gewoon de file kan verwijderen.

Verwijderd

Kan je de file wel verwijderen/overschrijven als je programma afgesloten is? Dat duidt namelijk op een probleempje met je resource locking. Weet je heel zeker dat je filehandle geclosed is? En heb je de filemapping ook weggegooid? Die zal wel een duplicate handle creeeren onder water, dus zolang die open is, is je file exclusively locked...

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik was vergeten UnmapViewOfFile aan te roepen.
Toch meen ik ergens gelezen te hebben dat onder Windows NT/2000/XP de filehandle nodig was voor locking.
Pagina: 1