Problem mit dem ifstream::open()
-
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.