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

29.11.2012, 13:09

Fehlerabfrage Datei Ein- und Ausgabe

Hallo zusammen,
gerade arbeite ich mich durch Kapitel 8.5.2 mit Listing 8.9

Allerdings bekomme ich die Prüfung, ob die Datei geöffnet werden konnte nicht hin!
Problem ist die Zeile if (Input == NULL)
xCode gibt mir jedes Mal den Fehler "Invalid operands to binary expression ('ifstream' (aka 'basic_ifstream<char>' and 'long') mit der Warnung "Comparison between NULL and non-pointer ('ifstream' (aka 'basic_ifstream<char>') and NULL)

Habe mittlerweile das Listing auch einfach abgetippt, aber bekomme die selbe Fehlermeldung.

Kann sich jemand erklären, woran das liegt?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

29.11.2012, 13:54

Zeig bitte etwas mehr Code.

3

29.11.2012, 14:12

#include <iostream>
#include <fstream>
using namespace std;

//Hauptprogramm
//
int main ()
{

//Variablen
//
int Highscore = 0;

//Datei zum Lesen öffnen und Highscore auslesen
ifstream Input ("Highscore.shc", ios::binary);

if (Input == NULL)
{
cout << "Datei konnte nicht geoeffnet werden." << endl;
}
else
{
Input.read ((char*) &Highscore, sizeof (Highscore));
//Highscore ausgeben
cout << "Highscore aus der Datei: " << Highscore;
cout << endl;
}
//Datei schließen
Input.close();
return 0;
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

29.11.2012, 14:15

Ok, eigentlich sollte das imo funktionieren, aber lass das == NULL einfach mal weg, das ist sowieso überflüssig. Das Input.close() kannst du dir übrigens auch sparen, das erledigt der ifstream in seinem Destruktor automatisch.

Btw: Sehr lobenswert, dass du dir sogar die Arbeit gemacht und manuelles Syntaxhighlighting betrieben hast. Aber für die Zukunft sei erwähnt, dass das Forum wie jedes gute Programmierforum entsprechende Funktionalität natürlich eingebaut hat, einfach deinen Code in Code Tags (für C++: [cpp]hier dein Code[/cpp]) packen... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (29.11.2012, 14:21)


5

29.11.2012, 14:56

Haha, die Syntaxhighlights kamen aus xCode per Copy & Paste mit. Ich muss das Lob also an meine Zwischenablage weitergeben:)
Aber danke für den Tipp!

Ich habe nun auch Input == NULL durch !Input ersetzt und es funktioniert. Vielen Dank! :thumbsup:

6

03.05.2014, 13:11

Guten Tag Gemeinde,

ich lasse diesen Thread mal wieder aufleben, da es sich nicht lohnen würde einen neuen Thread zu erstellen.
Das Problem mit dem Input == NULL hatte ich auch.
Und zwar sagt mein Visual Studio "Kein "=="-Operator stimmt mit diesen Operanden überein. Operandentypen sind: std::ifstream == int"
Der Quellcode ist exakt der gleiche wie vom Threadersteller.

Eigentlich ist der Fehler doch quatsch? Man legt das Input ja als Binary fest, also müsste er doch beim vergleich das "NULL" erkennen?
Das Problem lässt sich beheben indem man !Input statt Input schreibt. Jedoch ist mir nicht ganz klar warum das den Fehler behebt?? ?(

Grüße Tomahawk

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

03.05.2014, 13:27


8

03.05.2014, 13:41

Q: Warum funktioniert if(Input == NULL) nicht?
A: Input ist eine Instance einer Klasse, die keine implizite Konvertierung in ein Integer zulässt, bzw. den Vergleichsoperator mit einer Integerzahl nicht überschreibt.

Q: Warum funktioniert es mit if(!Input == NULL)?
A: Die klasse std::ifstream erbt von std::istream, welche von std::ios erbt, welche wiederum von std::ios_base erbt. std::ios_base überschreibt den !-operator, welcher ein boolsches Ergebnis liefert, welches sich dann mit einem Integer (NULL / 0) vergleichen lässt:

C-/C++-Quelltext

1
2
3
4
bool __CLR_OR_THIS_CALL operator!() const
{   // test if any stream operation has failed
    return (fail());
}
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

9

03.05.2014, 13:42

Das hilft mir leider nicht wirklich weiter :S @ DeKugelschieber

Also sagt das "!" dem Compiler einfach nur das er hier den BOOL wert beachten soll?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

03.05.2014, 13:45

C-/C++-Quelltext

1
2
3
4
5
6
7
8
std::ifstream file("bla");

if(!file.good()){
    // Fehler beim öffnen (oder Zugriff, auf jeden Fall nicht offen)
    // ...
}

// Datei lesbar


Der ! Operator ist einfach nur eine Negierung.

C-/C++-Quelltext

1
2
3
4
if(!boolean) // wahr wenn "boolean" == false
if(!integer) // wahr wenn "integer" == 0
if(a != b) // wahr wenn a nicht den gleichen Wert hat wie b
// ...

Werbeanzeige