Problem mit dem ifstream::open()
-
Nullterminierung ist bei dem String korrekt. Hab die terminierung eben manuell durchgeführt und es gab keine änderung. Hab auchmal versucht den dateinamen direkt anzugeben also "test.txt" das funktionierte bei Variante 1 einwandfrei bei variante 2 ging es nicht auhc nicht mit (char*)"test.txt", ich finde das wirklich sehr merkwürdig.
-
Schmirgelt Dein Programm beim open ab, oder irgendwann später beim Schreiben?
Probier außerdem mal den Dateinamen direkt beim open als Literal zu übergeben.
Ich kann es mir eigentlich nicht vorstellen, dass bei einem Aufruf mitchar*diewchar_t*-Variante aufgerufen wird.
-
Es schmiert direkt beim open ab.
ifstream file("test.txt");//funktioniert ------------------ ifstream file; file.open("test.txt");//funktioniert nicht ----------------- ifstream file; file.open((char*)"test.txt");//funktioniert ebenfalls nichtWenn ich Debugge sagt der Debugegr leider auch nciht viel nur bad ptr, wa smich sehr darauf schließen läst das er aus dem char* ein wchar_t* gemacht hat und der damit total veränderte dateiname ja nicht existiert.
-
Kann es sein, dass vorher irgendwas kaputt geht, weil Du z.B. über Puffergrenzen hinausschreibst?
Benutzt Du evtl. einen Stream, der vorher schonmal benutzt wurde mehrmals? Also z.B. erst den Stream mit close schließen und dann wieder mit open öffnen?
Wenn vor dem close irgendwas schiefgegangen ist, werden die Fehlerflags durch das close nicht wieder gelöscht. Also ggf. stream.clear() vor dem open aufrufen.Hast Du vielleicht einen exotischen oder komischen Compiler am Werkeln?
-
Der puffer des dateinamens hat noch mehr als genug Platz er ist sehr viel größer als der Inhalt.
Nein das Programm benutzt den stream nur einmal. Habe eben ein Profilaktisches clear() vor das open gepackt, das brachte nichts.
Ich nutze VC++2008 Express SP1.
-
Ich meine nicht den Puffer des Filenamens selbst, sondern irgendwelche anderen Sachen, die Du vorher machst. Oder vielleicht auch Dinge, die irgendwelche externen libs vielleicht machen.
Anders ist das eigentlich nicht zu erklären. Visual Studio 2008 SP1 verhält sich bei Übergabe eines char-Literals an fstream::open auf jeden Fall korrekt.
-
Es funktioniert jetzt, der ifstream war Member einer Klasse, die hat in ihrem Konstruktor zeroMemory() auf sich selbst gemacht hab den ifstream zur globalen Variable gemacht und nun geht open plötzlich.
-
Xebov schrieb:
der ifstream war Member einer Klasse, die hat in ihrem Konstruktor zeroMemory() auf sich selbst gemacht
So was macht man ja auch nicht.
-
Oh man...

-
MFK schrieb:
Xebov schrieb:
der ifstream war Member einer Klasse, die hat in ihrem Konstruktor zeroMemory() auf sich selbst gemacht
So was macht man ja auch nicht.
Ich verstehe den Grund wieso ehrlich gesagt nicht, die Klasse soll alle ihre variablen mit dem Befehl leeren um Datenmüll vorzubeugen. ist aber gut zu wissen das der ifstream so empfindlich reagiert.
Aber danke für die Hilfe.
-
Xebov schrieb:
Ich verstehe den Grund wieso ehrlich gesagt nicht, die Klasse soll alle ihre variablen mit dem Befehl leeren um Datenmüll vorzubeugen. ist aber gut zu wissen das der ifstream so empfindlich reagiert.
Es geht nicht um ifstream. Das ist grundsätzlich eine Schnapsidee.
Du kannst nicht davon ausgehen, dass eine Klasse ordentlich initialisiert ist, wenn du ihre binäre Speicherrepräsentation komplett mit Nullen überbügelst. Mit hoher Wahrscheinlichkeit geht dabei eher etwas kaputt.
Damit zerlegst du dir übrigens auch den VTable-Zeiger bei polymorphen Klassen.
-
Xebov schrieb:
MFK schrieb:
Xebov schrieb:
der ifstream war Member einer Klasse, die hat in ihrem Konstruktor zeroMemory() auf sich selbst gemacht
So was macht man ja auch nicht.
Ich verstehe den Grund wieso ehrlich gesagt nicht, die Klasse soll alle ihre variablen mit dem Befehl leeren um Datenmüll vorzubeugen. ist aber gut zu wissen das der ifstream so empfindlich reagiert.
Aber danke für die Hilfe.
Alle Klassen, die interne Zustände halten, z.B. Pointer auf Heap-Objekte oder irgendwelche Stati reagieren "empfindlich" auf sowas.
Instanzen von Standard-Libarary-Klassen dürftest Du damit sicher ins Nirvana der undefinierten Zustände bomben.
Zum setzen von Klassen auf definierte Zustände gibt es Initialisiererlisten und ggf. den Rumpf der Konstruktoren. Aber ZeroMemory auf die Klasse anzuwenden ist mit Sicherheit eine schlchte Idee. Das kann man nur machen, wenn die Klasse ausschließlich POD-Typen enthält.
-
Also kurz gesagt lieber ein paar Zeilen mehr tippen und die Variablen einzelln Nullen?
-
zeroMemory()
Damit machst du alles kaputt, was der Konstruktor anlegt, also auch die virtuelle Methodentabelle, interne Informationen, Metainformation. Keine gute Idee, nimm lieber Initialisierungslisten.
-
Xebov schrieb:
Also kurz gesagt lieber ein paar Zeilen mehr tippen und die Variablen einzelln Nullen?
Nicht nullen, sondern mit einem gültigen Wert initialisieren! Die Arbeitsweise mit
ZeroMemory()odermemset()ist eher C und für die dortigen PODs angebracht. In C++ hat das meistens nichts zu suchen!Irgendwelche undefinierten Laufzeitauswirkungen wegen Schreibfaulheit in Kauf zu nehmen hat sich zumindest selten bewährt. Nimm wie gesagt Initialisierungslisten.