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

1

25.04.2004, 22:18

ein übler streamklassen fehler

ich brauch ma dringend hilfe:help:

also, ich habe einen manager für selbst geschriebene datenarchive geschrieben, seine hauptaufgabe ist es, ein archiv zu durchsuchen, und die gesuchte datei in den speicher zu mappen.
der header des archivs enthält bisher nur die länge des namens und den namen der datei, danach folgt der dateiname, und der datei inhalt.
soweit sogut, ich hab mir alles gecodet, und zum test mit folgendem code eine Datei erstellt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
ofstream datei("testdatei.txt",ios::binary); 
int size=3; 
int namelength=8; 
char* name="name.txt"; 
char* inhalt="sie"; 
datei<<size; 
datei<<namelength; 
datei<<name; 
datei<<inhalt; 
datei.close(); 
//in der datei steht: "38name.txtsie" ist also korrekt


so, nun wollte ich da mit meinem manager ran, der ctor erledigt alle aufgaben, und folgender code war schnell geschrieben:

Quellcode

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
Virtualfile::Virtualfile(char* Name,char* archiv){ 
    ifstream datei(archiv,ios::binary); 
    if(datei){ 
        Header header; 
        bool datafound=false; 
        while(datafound==false&&!datei.eof()){//endlosschleife 
            datei>>header.size; 
            datei>>header.namelength; 
            char* Dateiname=new char[header.namelength];//kann man 
            datei.read(Dateiname,header.namelength);    //das 
            if(string(Dateiname)==Name){                //besser machen? 
                datafound=true; 
                datapointer=malloc(header.size); 
                readpointer=(char*)(datapointer); 
                position=0; 
                if(datapointer){ 
                    name=Name; 
                    datei.read(readpointer,header.size); 
                } 
            } 
            else 
            { 
                datei.seekg(header.size,ios::cur); 
                if(datei.eof()){ 
                    cout<<"datei nicht im archiv enthalten"; 
                } 
            } 
            delete Dateiname; 
        } 
        datei.close(); 
    } 
}

die ladefunktion ist ansich das, was der meister dieses boards auch als tutorial gemacht hat, nur mit der stl.
als ich die funktion dann getestet hab, kam der große schock: kein wert wird richtig ausgelesen, wenn ich die werte überprüfe ändern sie sich sogar je nachdem an welcher stelle ich sie überprüfe,und manchmal gibts sogar ne access violation je nachdem wo ich prüfe, die sache ist wie verhext.
desweiteren ist das programm in einer endlosschleife gefangen.
ich dachte zuerst, ichs chreib in nicht allokierten speicher, aber das kann ich ausschließen.
mit andren worten: ich hab keinen peil was da los ist.

2

26.04.2004, 21:59

*hust* fehler gefunden.
der >> bzw << operator schreibt nich binär-.-

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

3

27.04.2004, 07:11

außerdem muss es delete[] Dateiname heissen! Sonst entsteht ein Speicherleck, da Dateiname ein Array ist

4

27.04.2004, 07:59

gefixt
jetzt stört mich nurnoch, dass ich den char überhaupt brauche, gibts für strings in dem fall keine überladung oder so?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

27.04.2004, 16:10

Stings, wenn du die von der Standartbibliothek meinst, müssten Speicherplatz automatisch alloziieren. Soweit ich weiss

In Deinem Beitrag befinden sich noch Fehler.
Bitte bearbeite die rot markierten Stellen und lösche diesen Text.

6

28.04.2004, 00:18

Eben nicht. Was auch Logisch ist. Wenn man einen String aus einer Datei laden will und dafür den Left-Shift-Operator nutzt, weis ifstream ja nicht wieviel es auslesen soll.

Man muss es also vorher angeben. Es ist außerdem Möglich bei einem String speicher zu reservieren. Leider scheint das nicht recht zu klappen und führte bei mir immer zu einem Programmabsturz.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

28.04.2004, 07:10

ahso, na dann doch lieber eine eigene Stringklasse ;D

Werbeanzeige