Frage zu fstream
-
Ist der folgende Code legal?
fstream FileOut(mFileName.c_str(), ios::out | ios::app); if(FileOut) //Mach was
gcc schluckt es ohne Probleme, MSVC meckert wie folgt:
MSVC schrieb:
error C2451: conditional expression of type 'class _STL::basic_fstream<char,class _STL::char_traits<char> >' is illegal
Ambiguous user-defined-conversion
-
Also bei mir Funzt der code unter .NET und GCC fehlerfrei!
Sieht für mich aber auch sehr legal aus.
-
Probier es mal statt mit fstream mit ofstream, wenn er es dann immer noch nicht schluckt, ka.
Code-Hacker
-
das visual studio 6 schluck folgendes bei mir ohne probleme:
fstream tb ("phone.txt", ios::in | ios::out | ios::app);
binde mal die
#include <fstream> using namespace std;
ein
-
if(FileOut)
Das ist AFAIK dasselbe wie:
if(!FileOut.fail())
-
std::fstream muss laut Standard einen operator bool() haben. Aber die MSVC STL Implementierung soll wohl nicht perfekt sein.
aber du kannst std::fstream::good, std::fstream::fail, std::fstream::is_open etc. nutzen
-
doch, an der stelle funktioniert es wunderbar in allen oben genannten varianten..
ob mit einfachif (FileOut)
oder
if (!FileOut.fail())
der fehler muss irgendwo anders zu suchen sein.
keine fstream.h benutzen...
<edit> getestet mit dem visual studio 6 </edit>
-
kingruedi:
die streams haben operator! und operator void* überladen. operator! liefert das gleiche wie fail und void* liefert 0 bei fail und irgendetwas anderes bei erfolg.
operator bool hab ich nicht gefunden
-
Hast Du diesen "STL - Fix" installiert den es für die STL des VC6 gibt ?
-
davie schrieb:
operator bool hab ich nicht gefunden
Logisch, den gibts auch nicht.
Hat irgendeinen Grund von wegen impliziter Typenumwandlung.Ich finde es sowieso bedenklich... ein
if(stream.good())
oder
if(stream.is_open())tut es doch auch - und ist klarer.
-
Erst mal danke für die vielen Antworten, also das ganze klappt wenn ich ofstream benutze wie CodeHacker vorgeschlagen hat. Ich hab MSVC 6.0 mit STLPort 5.3(?) und bekomme eben die Fehlermeldung falls ich versuche den Zustand im if-statement abzufragen und fstream verwende.
Ist mir nur aufgefallen, als ich ein Programm von Linux nach Windows portieren wollte (was da alles für Probleme auftauchen...). Zum Glück kann man das Problem ja einfach mit is_open() oder good() umgehen.