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

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

06.02.2006, 16:15

Länge eines wifstreams mit Zeilenumbruch bestimmen

Folgender Code:

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
bool fgmenu::ConstStrings::AddFile(const wchar_t* FileName)
{
    std::wifstream* Stream = new std::wifstream(FileName);
    //Stream konnte nicht geöffnet werden

    if (Stream->fail())
    {
        //fehler

    }
    
    //Länge des Streams bestimmen

    unsigned long FileLength = 0;
    Stream->seekg(0, std::ios_base::end); //std::ios_base::beg

    /*while(!Stream->eof())
    {
        Stream->seekg(sizeof(wchar_t), std::ios_base::cur);
        ++FileLength;
    }*/
    FileLength = Stream->tellg();
    //Stream zum Anfang setzen

    Stream->seekg(0, std::ios_base::beg);
    
    //.....

}


Es funktioniert alles super, allerdings nur, wenn keine Zeilenumbrüche in der Datei vorhanden sind. Ist das aber der Fall, ist FileLength um 1 länger für jedes \n in der Datei, obwohl das ja egtl nur 1 Zeichen ist.
Wenn ich die Länge mit der while-Schleife bestimmen will, ist stream->eof() niemals true, egal wie weit er über das Ende hinaus geht, also es ist ne Endlosschleife. Das ist ziemlich ärgerlich, da ich genau wissen muss wie lang die Datei ist, um sie letzten Endes exakt einzulesen.. So wies jetzt läuft liest er nämlich für jeden Zeilenumbruch ein Chaoszeichen mehr ein. Entwicklungsumgebung ist VC++ 8.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

06.02.2006, 16:48

In wiefern willst du denn mit der Eingabe arbeiten, viell. findet sich ja auch ein work around, weil ich ehrlich gesagt mit der Fehlerbeschreibung nichts anfangen kann :angel:
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

06.02.2006, 16:56

ok hier ist das was danach kommt:

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
29
30
31
32
33
34
35
36
37
38
        wchar_t* OldStrings = NULL;
    unsigned long NewLength = 0;
    if (Strings != NULL) 
    {
        //Die alten Strings erstmal zwischenlagern

        OldStrings = new wchar_t[static_cast<const unsigned long>(wcslen(Strings))+1];
        wcscpy_s(OldStrings,static_cast<unsigned long>(wcslen(Strings))+1, Strings);
        delete[] Strings;
        Strings = NULL;
        //neue Gesamtlänge ist Länge der neuen Datei plus Länge der alten Strings

        NewLength = static_cast<unsigned long>(FileLength + static_cast<unsigned                 long>(wcslen(OldStrings)));
    }
    else
        //neue Gesamtlänge ist nur Länge der neuen Datei, da vorher keine Strings vorhanden

        NewLength = FileLength;

    //Strings neu erstellen mit neuen Gesamtlänge

    Strings = new wchar_t[NewLength+1];
    //Die neu erstellten Strings laden

        //(1)

    Stream->read(Strings, static_cast<std::streamsize>(FileLength));
    //String terminieren

    Strings[FileLength] = L'\0';

    //Stream schließen

    Stream->close();
    delete Stream;
    Stream = NULL;

    //Die neuen Strings mit den Alten zusammenfügen

    _snwprintf_s(Strings, static_cast<size_t>(NewLength)+1, static_cast<size_t>(NewLength), 
        L"%s%s", Strings, (OldStrings!=NULL)?OldStrings:L"");

    if (OldStrings != NULL)
        //Alte Strings ggf freigeben

        delete[] OldStrings;
    
    return true;


sprich der Inhalt der Datei wird geladen, und dann mit den bereits vorhandenen Dateiinhalten ergänzt.
Die Zeile unterhalb von (1) ist die, an der der Text der Datei ausgelesen wird. Er liest aber halt zuviel wenn FileLength länger ist als die Anzahl der Zeichen in der Datei.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

06.02.2006, 17:27

Wie wäres es mit peek? Ist zwar sehr hässlich, aber was solls ;) . Wenn es das nciht sein sollte, muss ich mir das mal genauer anschauen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige