Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Darkrel

Treue Seele

  • »Darkrel« ist der Autor dieses Themas

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

1

01.02.2011, 01:53

GCC & MSVC: std::ios "swappen"?

Hallo Leute.

Ich bin au ein weiteres Problemchen gestossen, was iostreams betrifft.
Gibt es eine Möglichkeit für den GCC, zwei streams zu swappen?

Wer nicht genau weiss was ich meine:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using std::ofstream;
using std::endl;

int main() 
{
    ofstream s1("Stream1.txt");

    {
        ofstream s2("Stream2.txt");
        s1.swap(s2);
    } //s2 wird zerstört, existiert also nicht mehr.

    s1 << "Bla bla..." << endl; //Steht jetzt in Stream2.txt (Müsste zumindest ;) )
};


Dieses Beispiel funktioniert nur mit Visual Studio (2010).

Meine Frage ist nun:
Wie stelle ich das mit dem GCC an? Ist so etwas überhaupt möglich?

Ich habe schon x varianten ausprobiert:

C-/C++-Quelltext

1
2
3
    streambuf *temp = s1.rdbuf();
    s1.rdbuf(s2.rdbuf());
    s2.rdbuf(temp);


Edit: Ich dumm. Da wird logischerweise keine Kopie vom Streambuffer erstellt. Kann also nicht funktionieren ;) Aber ändert nichts an meiner Frage oben.

Haben wir einen erfahrenen Linux programmierer zur hand, der sich damit auskennt?

Edit2: Das problem lässt sich wohl auf den streambuffer reduzieren. Wenn ich den kopieren könnte, wäre mein problem gelöst.
:cursing:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Darkrel« (01.02.2011, 03:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

01.02.2011, 10:19

Für welches Ziel konkret benötigst Du das? Vielleicht lässt es sich anders lösen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

01.02.2011, 10:30

Also s2 willst du auf jedenfall zerstören? Dann wirds glaub ich nicht gehen. Wenns weiter existieren darf is es wie de richtig gesagt hast eigtl. kein Problem über rdbuf.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Darkrel

Treue Seele

  • »Darkrel« ist der Autor dieses Themas

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

4

01.02.2011, 12:26

Alles klar, danke ;)

Dann muss es wohl anders gehen :)
:cursing:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

01.02.2011, 12:36

Mit Pointern kann das schon gehen. Die Frage ist halt, was genau er damit machen will.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

01.02.2011, 13:17

A ehm hab hier grade keine gute Referenz rumliegen die mir jetzt genau sagt was im Destruktor wo zerstört wird, aber wie du es oben stehe hast:

C-/C++-Quelltext

1
2
3
4
5
6
#include <ios>
namespace io 
{
    void swap(std::ios& left, std::ios& right)   
    { right.rdbuf(left.rdbuf(right.rdbuf()))); }
}; // io


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <fstream>
#include "io.hpp" // s.o.

int main()
{
    std::ofstream file_stream("file001.hpp");
    file_stream << "Tested!" << std::endl;
    {
        std::ofstream new_file("file002.hpp");
        io::swap(file_stream, new_file);
    }
    file_stream << "Tested!" << std::endl;
}

Nja wenn der Destruktor jetzt den streambuf freigibt, sollte es eigtl. der mit file001 sein. Kommt halt drauf an wie das im Std. genau festgelegt ist.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Darkrel

Treue Seele

  • »Darkrel« ist der Autor dieses Themas

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

7

01.02.2011, 14:22

@ BlueCobold: Ich suche simpel und einfach eine Möglichkeit msvc ofstream::swap mit der gcc hinzubekommen. :)

Soll heissen: Stream 1 schreibt in S1.txt, Stream 2 schreibt in S2.txt. Rufe Stream 1. swap(Stream 2) auf -> Stream 1 schreibt ab nun in S2.txt, Stream 2 schreibt ab nun in S1.txt.
Beide in das selbe file schreiben zu lassen ist ja kein Problem :)

@ Deviloper: Danke für den Vorschlag, scheint aber nicht zu funktionieren :(
:cursing:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

01.02.2011, 14:40

Warum willst du zwei streams swappen? Überlegt mal was die semantische Bedeutung davon sein sollte zwei streams zu swappen? Es hat durchaus Gründe warum das nicht überall einfach so geht...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

01.02.2011, 15:01

@ BlueCobold: Ich suche simpel und einfach eine Möglichkeit msvc ofstream::swap mit der gcc hinzubekommen. :)

Soll heissen: Stream 1 schreibt in S1.txt, Stream 2 schreibt in S2.txt. Rufe Stream 1. swap(Stream 2) auf -> Stream 1 schreibt ab nun in S2.txt, Stream 2 schreibt ab nun in S1.txt.
Beide in das selbe file schreiben zu lassen ist ja kein Problem :(

Für welchen Zweck? Wie ich schon sagte ließe sich das über Pointer prima regeln, die Frage ist nur für welchen Zweck und in welchem Kontext Du das brauchst. Und den willst Du scheinbar nicht verraten...
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Darkrel

Treue Seele

  • »Darkrel« ist der Autor dieses Themas

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

10

01.02.2011, 15:10

Hier stand mal ein langer Text.

Dann wurde mir klar, dass das was ich machen will nicht wirklich Sinn macht ;) Danke für die Hilfe!
:cursing:

Werbeanzeige