wiedermal ein problem mit ner streamklasse
-
sorry, dass ich euch wieder mit einer kleinigkeit stören muss...
also, ich hab eine datei, sie wurde mit folgendem code erstellt(ich weis, is etwas umständlich):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
diese datei sollte als test für meinen code herhalten, der eine datei aus einem von mir erstellten archiv direkt in den speicher schreibt.
dies ist der code zum auslesen der datei(ich hoffe diesmal in anständigem c++ und nicht in c
):
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(); } }
das programm geht also den dateiheader durch, sucht sich den namen raus, und vergleicht ihn mit dem gewünschten dateinamen. wenn die namen gleich sind,wird sie in den speicher gemaped, und die schleife soll verlassen werden.
wenn der name nicht übereinstimmt überspringt er einfach dei daten der datei bis zum nächsten header.
das ganze endet, wenn das ende der datei erreicht ist.
leider schein ich im programm ne endlosschleife zu haben, und kann nicht erkennen, woran das liegt,eof wird nicht erreicht. Das 2. problem ist die stelle, an der ich mittels read den dateinamen raussuche,ich musste da erstmal den umweg über char wählen, weil ich mit entsetzen feststellen musste, dass read nicht für string überladen ist, was sehr sehr schade ist, und da such ich nen bessren weg...
-
ich hab mir mal die werte von dateiname und Name ausgeben lassen:
Name: name.txt
Dateiname: <Yh2<Yh2so bin dem fehler auf der spur:
ich hab wiedermal testweise einfach alle werte ausgegeben, und kam zu dem ergebnis, dass ich je nachdem wo ich die werte ausgelesen hab, andere Werte rausbekommen hab(was nicht sein dürfte, da ich die Werte nie veränder).
das deuted meiner erfahrung nach auf unallokierten aber trotzdem beschriebenen speicher hin(das weis ich, da ich das problem schonmal hatte), aber ich versteh das nicht, ich hab diesmal wirklich drauf geachtet, dass ich den speicher auf dem heap/stack reserviert habe,also was zum Henker mach ich falsch?
wenn ich datei>>header.size; benutze werden doch auch nur 4 Byte speicher ausgelesen, und das is ja der platz den ich reserviert hab...
-
oh bitte, ratet wenigstens,ich weis echt nich mehr weiter, alles noch so banale kann mir jetzt helfen
-
Ich kann dir nicht helfen, höchstens nen Tipp geben:
Du könntest alle char * entfernen und dafür strings verwenden, und dann testen
ob die Werte immernoch falsch sind.
-
hab alle chars die möglich waren entfernt, der ctor von ofstream akzeptiert nur char arrays,genauso wie die read funktion.
-
Benutze deinen Debugger. Und schreibe den Code Schritt für Schritt neu.
-
der bcb debugger is net so dolle, und da ich den code heute schonmal neugeschrieben hab(nämlich von c auf c++),und mir bis dahin kein weiterer fehler aufgefallen ist,weis ich net, was mir das bringen soll-.-
-
fehler gefunden, der << bzw >> operator schreibt nicht binär in eine datei, nachdem ich diese zeilen durch read ersetzt habe,funktionierte es wieder.
-
der bcb debugger is net so dolle
Bisher wird nirgends ein leistungfähigerer Debugger angeboten ...
-
einen fehler beim datenschreiben kann er nicht finden, mehr als werte abfragen und pointer fehler suchen kann ich da auch nich machen, also bringt mir der debugger relativ wenig bei einem funktionsfehler(wer kann schon ahnen, dass der << operator im binärmodus NICHT binär schreibt)
-
sorry, dass ich den thread nochmal aufleben lasse...
die sache mit den operatoren ist im nachhinein doch ziemlich komisch.
ich habe eine struktur mit 2 int werten.
schreib ich die struktur mit write in die datei, und lese sie danach mit read klappt alles wunderbar.
schreib ich sie aber mittels << in die datei, also datei<<header.size und datei<<header.namelength und lese sie danach mit datei>>header.size datei>>header.namelength kommt ein datenwust raus.
aber wieso? ich meine, alle welt benutzt doch erfolgreich die >>/<< operatoren...