Hilfe zu ofstream und seekp gesucht!

Hallo zusammen,

ich habe heute mal versucht in einem ofstream etwas zu schreiben, dann ein paar Positionen zurück zu springen und sozusagen mitten in dem stream was zu überschreiben… z.b. aus einem ‚a‘ ein ‚b‘ machen.

Laut der Dokumentation für seekp sollte das ohne Probleme Möglich sein. Ich programmiere unter W2k und benutzte Visual Studio C++.

Beim debuggen konnte ich wunderschön verfolgen wie die Zeichenketten nacheinander in den buffer geschrieben werden. Auch der _ptr zeigt immerschön auf die richtige stelle, nämlich an die nächste Position zum schreiben. Sobald ich aber seekp() aufrufe, egal in welcher kombination, sei es mit der Definierung von ios_base::beg oder ios_base::end (beides mit offset) oder eben nur die Position, springt _ptr auf die selbe addresse wie _base und damit an den wunderschönen Anfang des streams. Was mir nicht wirklich was bringt da ich ja eben gerne in die Mitte von bereits geschriebem Text springen möchte und da einen Wert ändern möchte.

Laut Internet bin ich nicht der einzige der so ein Problem hat. Kennt irgendjemand eine Lösung für dieses Problem?

Grüße,

Swen

PS: seltsamerweise funktioniert iftstream::seekg() ohne Probleme und so wie die Doku es erwarten lässt…

ich habe heute mal versucht in einem ofstream etwas zu
schreiben, dann ein paar Positionen zurück zu springen und
sozusagen mitten in dem stream was zu überschreiben… z.b.
aus einem ‚a‘ ein ‚b‘ machen.

Laut der Dokumentation für seekp sollte das ohne Probleme
Möglich sein. Ich programmiere unter W2k und benutzte Visual
Studio C++.

Je nach Version von VS kann es durchaus sein, dass Teile der Standardbibliotheken fehlerhaft implementiert sind. Besonders mies ist anscheinend Version 6, danach wurde es besser. Kannst du ein (minimales) Beispiel angeben, das den Fehler reproduziert?

Jupp, hier kommt ein link:

http://www.cplusplus.com/ref/iostream/ostream/seekp…

wenn ich das Beispiel am Ende der Seite starte, habe ich genau das obengeschilderte Problem… ich habe Microsoft Visual C++ .NET in der Version 7.1.3088 als Entwicklungsumgebung…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

http://www.cplusplus.com/ref/iostream/ostream/seekp…

wenn ich das Beispiel am Ende der Seite starte, habe ich genau
das obengeschilderte Problem… ich habe Microsoft Visual C++
.NET in der Version 7.1.3088 als Entwicklungsumgebung…

Dann habe ich schlechte Nachrichten… :wink:

seekp_test.cpp:

// position of put pointer
#include 
using namespace std;

int main () {
 long pos;

 ofstream outfile;
 outfile.open ("seekp\_test.txt");

 outfile.write ("This is an apple\n",17);
 pos=outfile.tellp();
 outfile.seekp (pos-8);
 outfile.write (" sam",4);

 outfile.close();

 return 0;
}

Probelauf:

nicos@elysium:~/Code/tests$ g++ -Wall -O3 -o seekp\_test seekp\_test.cpp
nicos@elysium:~/Code/tests$ ./seekp\_test
nicos@elysium:~/Code/tests$ cat seekp\_test.txt
This is a sample

Es sieht also tatsächlich so aus als wäre irgendwas in deiner Entwicklungsumgebung falsch.

wenn ich das richtig sehe, benutzt du nicht Visual Studio… hast du auf einem UNIX System kompiliert? Ist also nur Microsoft wieder mal scheisse? Gibt es die Möglichkeit eventuell zu schauen, welche stl dateien der Compiler verwendet und die dem Microsoft Compiler unterzujubeln? bzw die libs zu tauschen? Es muss doch irgendwie Möglich sein dem Compiler beizubringen das vernünftig zu machen… oder ist das vielleicht system abhängig? Sprich was unter Unix funktioniert funzt nicht unter Windows und man kann da auch nichts lib mäßig portieren?

Ich habe mal auf der SGI seite nachgeschaut und da sieht es aus, als ob das letzte mal 2001 was an der implementierung der stl gemacht wurde… zumindestens i/o wise…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

wenn ich das richtig sehe, benutzt du nicht Visual Studio…
hast du auf einem UNIX System kompiliert?

Fast… Linux.

Ist also nur
Microsoft wieder mal scheisse? Gibt es die Möglichkeit
eventuell zu schauen, welche stl dateien der Compiler
verwendet und die dem Microsoft Compiler unterzujubeln? bzw
die libs zu tauschen?

Das geht wohl theoretisch, allerdings hat der Kram mit dem du probleme hast nichts mit der STL zu tun, sondern mit der ganz normalen C+±Library. Ehrlich gesagt kann ich mir auch nicht wirklich vorstellen, dass Microsoft etwas zentrales wie Suchen auf Streams zersemmelt. Wenn du vorher eine andere Version von VS hattest, schau dir vielleicht mal die Einstellungen an ob da vielleicht irgendwo falsche (alte) Header oder Libs eingebunden werden.

Ich habe mal auf der SGI seite nachgeschaut und da sieht es
aus, als ob das letzte mal 2001 was an der implementierung der
stl gemacht wurde… zumindestens i/o wise…

Japp, die STL ist recht stabil was das angeht.

Hallo Swen,

wenn ich das richtig sehe, benutzt du nicht Visual Studio…

Ich habe es gerade mal unter Visual C 6.0 unter XP bei mir versucht … und es funktioniert so wie es soll.

MfG Peter(TOO)
P.S. bei mir sind alle ServicePacks für VisualStudio installiert.

Uff! du hast tatsächlich ein Service Pack für Vsiual Studio gefunden??? hm… aber ich sehe gerade, das du noch Visual C 6.0 benutzt… da habe ich ja nu doch eine aktuellere Version… würde mich aber trotzdem interessieren, wo du die Service Packs her hast… bzw wo Microsoft die versteckt hat, habe die nämlich noch nicht gefunden…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Swen,

… würde mich aber trotzdem interessieren, wo du die
Service Packs her hast… bzw wo Microsoft die versteckt hat,
habe die nämlich noch nicht gefunden…

Hier
http://msdn.microsoft.com/downloads/default.aspx
z.B. VC 6.

und dann nach dem Produkt suchen.
(Oben links zuerst „Code and Downlods“ auswählen)

http://search.microsoft.com/search/results.aspx?qu=v…

Wie ich gerade sehe, habe ich SP6 bei mir installiert.

MfG Peter(TOO)

Schlechte Nachrichten auch hier
Hallo Nicos!

Ich habe VS .net 7.1.3088 mit .net Framwork 1.1.4322 SP1 auf WinXP Prof SP2 hier - alles fein mit dem Beispiel…

Gruß
Martin

Hallo Martin,

wenn ich das richtig sehe, ist der einzige Unterschied zwischen deinem und meinem System, das ich Windows 2000 benutzte und nicht WinXP…

Gruß,
Swen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Swen,

habe den Code gerade mit .net 7.1 ohne SP und mit VC6.0 SP 5 kompilert und zwar im Release und Debug Modus, sowie auf Win2K SP4 und XP SP 2 (also insgesamt 8 Builds), es hat immer das richtige Ergebnis geliefert. Bist Du Dir sicher, dass Du nicht doch irgendwo falsche Einstellungen hast, o.ä.?

Gruss