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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

21

21.10.2007, 20:40

aha ok.. jetzt hab ich nochmal die deklaration versucht bei der die parameter als pointer übergeben werden.. und auf einmal geht..

he das ging vorher nicht ! :?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

21.10.2007, 20:42

Zitat von »"Deviloper"«

Naja ... bin mir nicht sicher ... std::fstream sollte aber doch von std::ostream und std::istream erben und damit sollte die Position beim lesen nicht identisch mit der beim schreiben sein, oder? kann ebenfalls falsch liegen ...


Hier der ultimative Test: ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <fstream>

int main()
{
    std::fstream stream( "test.txt", std::ios::in | std::ios::out );

    stream << "Dieser Text geht in die Datei" << std::endl;
    std::clog << "Position: " << stream.tellg() << std::endl;
    std::clog << "Ausgabe1: " << std::endl;

    std::string line;
    while ( std::getline( stream, line ) ) std::cout << line << std::endl;
    stream.clear();

    stream.seekg( 0, std::ios::beg );
    std::clog << "Position: " << stream.tellg() << std::endl;
    std::clog << "Ausgabe2: " << std::endl;

    while ( std::getline( stream, line ) ) std::cout << line << std::endl;

    std::cin.get();
}


Zitat von »"$nooc"«

aha ok.. jetzt hab ich nochmal die deklaration versucht bei der die parameter als pointer übergeben werden.. und auf einmal geht..

he das ging vorher nicht ! :?


Wie genau sieht die Deklaration aus? Referenzen sind Zeigern im Normalfall vor zu ziehen!
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

23

21.10.2007, 20:52

hmm.. ich stoße schon wieder auf ein problem..

also ich hab da jetzt eben die variablen als pointer übergeben..

jetzt würde ich gerne die position auf das letzte zeichen setzen um die größe zu berechnen.. jedoch liefert mir die funktion tellg() den wert (-1)

Zitat von »"msdn"«


If fail is false, the member function returns rdbuf -> pubseekoff(0, cur, in). Otherwise, it returns pos_type(-1).


noch zur info:
die dateien 'sind' geöffnet.. wird eh überprüft.. ich weiss aber nicht warum tellg() fehlschlägt..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void readf(std::fstream *src, std::fstream *dest)
{
    if(!src->is_open() || !dest->is_open())
    { return; }

    std::fstream::pos_type size = src->tellg();
                // da size (-1) ist schlägt folgendes nat. fehl..

    char* buf = new char[size];
}



*edit:

im debug modus hab ich gemerkt dass wenn ich die funktion good() abrufe die quelle 'src' fehschlägt, nachdem ich die datei einmal ausgelesen habe.. also so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    std::fstream::pos_type size = f.tellg();
    f.good(); // true

    char* buf = new char[size];
    f.good(); // true

    f.seekg(0, std::ios::beg);
    f.good(); //true 

    f.read(buf, size);
    f.good(); // false <---

    f2.write(buf, static_cast<int>(size)-1);

            // danach kommt der funktionsaufruf.. aber

            // irgendwas stimmt dann eben mit 'f' nicht..

        readf(&f, &f2);

        // ..

}

void readf(std::fstream *src, std::fstream *dest)
{
    if(!src->is_open() || !dest->is_open())
    { return; }

    if(!src->good() || !dest->good())
    { return; }

    std::fstream::pos_type size = dest->tellg();
    char* buf = new char[size];
}


wieso ist das so?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

21.10.2007, 21:09

Evtl ist irgendein badbit gesetzt. Versuch mal src->clear() vor dem Aufruf von tellg().

Wieso willst du eigentlich unbedingt an deinen Zeigern festhalten?
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

25

21.10.2007, 21:11

Zitat von »"David_pb"«


Wieso willst du eigentlich unbedingt an deinen Zeigern festhalten?


sind zeiger in dem fall nicht die bessere lösung?

bitte oben nochmal nachlesen, hab was editiert!

*edit:
löscht clear() eventuell den inhalt der datei? wenn ja wär das schlecht ^^
ich habe vor den inhalt einer datei in eine andere zu schreiben...

*edit2:
oh ich seh grade clear() löscht nur die flags.. mit welcher funktion kann ich neue flags setzen ohne die datei generell neu öffnen zu müssen?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

26

21.10.2007, 21:39

bei deiner readf ... mach einfach das draus: :P

C-/C++-Quelltext

1
2
3
4
5
void copy_file(std::ifstream& src, std::ofstream& dest) throw(std::invalid_argument)
{
    if (!src || !dest) throw std::invalid_argument("invalid file stream");
    dest << src.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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

27

21.10.2007, 23:22

ja gut um die fehlerabfrage hab ich mich noch nicht gekümmert..

es geht ja um die frage WARUM 'src' fehlerhaft ist..
das frag ich mich..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

28

21.10.2007, 23:40

Zitat von »"$nooc"«

Zitat von »"David_pb"«


Wieso willst du eigentlich unbedingt an deinen Zeigern festhalten?


sind zeiger in dem fall nicht die bessere lösung?

bitte oben nochmal nachlesen, hab was editiert!


Nein, Zeiger sind auch hier nicht die bessere Lösung. Wie kommst du darauf?

Zitat von »"$nooc"«

ja gut um die fehlerabfrage hab ich mich noch nicht gekümmert..

es geht ja um die frage WARUM 'src' fehlerhaft ist..
das frag ich mich..


Weil der Lesevorgang fehlerhaft war...

Zitat von »"$nooc"«


*edit:
löscht clear() eventuell den inhalt der datei? wenn ja wär das schlecht ^^
ich habe vor den inhalt einer datei in eine andere zu schreiben...

*edit2:
oh ich seh grade clear() löscht nur die flags.. mit welcher funktion kann ich neue flags setzen ohne die datei generell neu öffnen zu müssen?


Tu der Welt doch bitte einen gefallen... Informier dich bevor du 1000x postest...

Zur Info:
o Clear löscht NICHT den Inhalt der Datei. Nur die Flags über welche man feststellen kann ob ein Fehler bei Streamfunktionen auftrat.
o Du sollst die Flags überhaupt nicht manipulieren.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

29

22.10.2007, 12:11

nur noch zwei fragen:
warum sind hier pointer nicht die bessere lösung?

und wenn ich die datei mit std::ios::out geöffnet habe und auslesen will, muss ich die dann mit close() zu machen und neu mt std::ios::in öffnen, oder kann man das auch einfacher lösen?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

30

22.10.2007, 12:13

Zitat von »"$nooc"«

nur noch zwei fragen:
warum sind hier pointer nicht die bessere lösung?


Gegenfrage (zum 3. Mal und hoffentlich diesmal mit einer Antwort): Wieso denkst du das Zeiger die bessere Lösung sind?

Zitat von »"$nooc"«


und wenn ich die datei mit std::ios::out geöffnet habe und auslesen will, muss ich die dann mit close() zu machen und neu mt std::ios::in öffnen, oder kann man das auch einfacher lösen?


Du musst nichts zu machen wenn du fstream verwendest.
@D13_Dreinig

Werbeanzeige