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

26.03.2008, 13:57

Fehler mit fopen und der main Funktion

Hallo erstmal,

momentan schreibe ich einen kleinen Datei Browser. Jetzt habe ich ein Problem mit meinem noch sehr kleinen Quelltext:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <windows.h>
#include <cstdio>

using namespace std;

int main(void)
{
    FILE *Datei;
    int Zahl = 0;

    cout << "Name der Datei : ";
    cin >> Zahl;

    // Jetzt kommt der Open - Part


    Datei = fopen("c:\\musical.txt","r");

        if(NULL == Datei)
        {
            // Wenn ein Fehler auftritt 

            return;
        }


        return 0;
}   
        


Microsoft Visual Studio 2008 Express mekert jetzt rum, dass fopen anders deklariert werden muss und das die Main Funktion einen Wert zurück geben muss. Leider sind meine Kentnisse noch nicht die aller Besten, deshalb poste ich hier.
Ich hoffe ihr könnt mir helfen.
Euer Hamster->

2

26.03.2008, 14:09

fopen ist etwas veraltet. Schau Dir in der MSDN mal die Alternativen an (Mit dem Mauszeiger über das fopen und F1 drücken). Allerdings ist das nur eine Warnung, funktionieren sollte das trotzdem.

Der Fehler von wegen main kommt daher, das Dein return in der if-Abfrage keinen Wert zurück gibt.

Und denk dran, hinterher den File-Stream wieder zu schliessen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

26.03.2008, 14:31

Es sollte

C-/C++-Quelltext

1
 int main () {}

heissen. Geht zwar auch mit dem void, ist aber nicht Standard.

Dann würde ich das hier:

C-/C++-Quelltext

1
2
3
4
5
        if(NULL == Datei)
        {
            // Wenn ein Fehler auftritt

            return;
        } 


anders schreiben:

C-/C++-Quelltext

1
2
3
4
5
        if(Datei == NULL ) // Umkehren gäbe auch noch die Variante if (!Datei)..

        {
            // Wenn ein Fehler auftritt

            return -1; //Hier einen Fehler Code zurückgeben.

        } 


Dann schliesst du den Stream nicht.

Und im übrigen solltest du die C++ Streams benutzen und nicht das C-Zeugs. (siehe std::ifstream..)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

26.03.2008, 14:32

Re: Fehler mit fopen und der main Funktion

Zitat von »"Hamster->"«

[...] Microsoft Visual Studio 2008 Express mekert jetzt rum, dass fopen anders deklariert werden muss [...]


was genau sagt es denn? ich tippe mal drauf, dass es dich warnt dass du statt fopen die sicherere variante fopen_s nehmen sollst. diese warnung kannst du getrost ignorieren und auch abstellen indem du das makro _CRT_SECURE_NO_DEPRECATE definierst.

Zitat von »"Hamster->"«

[...] und das die Main Funktion einen Wert zurück geben muss.


naja, diese fehlermeldung sagt ja auch eigentlich schon alles.

main muss einen int zurückgeben.

C-/C++-Quelltext

1
2
3
4
5
        if(NULL == Datei)
        {
            // Wenn ein Fehler auftritt

            return;        //*** da gibst du aber keinen int zurück

        }


mach da z.b. mal ein return 0; oder return -1; draus und gut ist ;)

btw: es wär sauberer wenn du deine datei vor dem beenden des programmes auch wieder schließen würdest (das geht mit fclose)...

5

26.03.2008, 14:41

Mein neuer Code :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <windows.h>
#include <cstdio>

using namespace std;

int main(void)
{
    FILE *Datei;
    int Zahl = 0;

    cout << "Name der Datei: ";
    cin >> Zahl;

    // Jetzt kommt der Open - Part


    Datei = fopen("c:\\musical.txt","r");

        
if(Datei == NULL ) // Umkehren gäbe auch noch die Variante if (!Datei).. 

        { 
            // Wenn ein Fehler auftritt 

            return -1; //Hier einen Fehler Code zurückgeben. 

        } 

        return 0;
}   
        


Fehlermeldungen:

Quellcode

1
2
3
4
5
6
7
8
c:\dokumente und einstellungen\nudel\eigene dateien\visual studio 2008\projects\Browser\Browser\Explorer.cpp(17) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
        c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(237): Siehe Deklaration von 'fopen'
Verknüpfen...
MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
C:\Dokumente und Einstellungen\Nudel\Eigene Dateien\Visual Studio 2008\Projects\Browser\Debug\Explorer.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Nudel\Eigene Dateien\Visual Studio 2008\Projects\Explorer\Explorer\Debug\BuildLog.htm" gespeichert.
Explorer - 2 Fehler, 1 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

26.03.2008, 14:43

du hast beim erstellen des projektes eine win32 anwendung gemacht und keine win32 konsolenanwendung ;)

entweder du machst das projekt neu, oder du stellst in den projekteinstellungen unter Linker > System > SubSystem auf CONSOLE um...

7

26.03.2008, 14:45

Du hast bestimmt auf Win32 Anwendung geklickt beim erstellen anstelle auf Konsolenprojekt.

Geh mal in die Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> System

Rechts oben bei Subsystem muss was mit Console stehen. Kann man ändern wenn man in die Zeile reinklickt.
(Hoffe das ist in dem VS 6.0 auch so, benutzte 2005)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

26.03.2008, 14:52

Zitat von »"Hamster->"«


C-/C++-Quelltext

1
if(Datei == NULL ) // Umkehren gäbe auch noch die Variante if (!Datei)..



ob du das umkehrst oder nicht ist geschmackssache. der grund warum viele leute if (NULL == Datei) schreiben ist der, dass man damit folgenden schlampigkeitsfehler sofort findet:

C-/C++-Quelltext

1
if (Datei = NULL)


das kompilliert nämlich, tut aber etwas komplett anderes und ist deshalb schwer zu finden, z.b. weil das programm dann ganz woanders abstürzt.

wenn mans umgekehrt schreibt dann sähe der fehler so aus:

C-/C++-Quelltext

1
if (NULL = Datei)


das lässt sich jedoch nicht kompillieren, da NULL eine konstante ist der man nichts zuweisen kann. der fehler fällt so also beim kompillieren auf...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

26.03.2008, 14:55

Zitat von »"drakon"«

Es sollte

C-/C++-Quelltext

1
 int main () {}

heissen. Geht zwar auch mit dem void, ist aber nicht Standard.


Falsch!

Ist nämlich exakt das Gleiche und total Standardkonform.

C-/C++-Quelltext

1
2
int main();
int main(void);


Zitat von »"drakon"«


Dann würde ich das hier:

C-/C++-Quelltext

1
2
3
4
5
        if(NULL == Datei)
        {
            // Wenn ein Fehler auftritt

            return;
        } 


anders schreiben:

C-/C++-Quelltext

1
2
3
4
5
        if(Datei == NULL ) // Umkehren gäbe auch noch die Variante if (!Datei)..

        {
            // Wenn ein Fehler auftritt

            return -1; //Hier einen Fehler Code zurückgeben.

        } 


Wieso? Seine Version funktioniert doch und es gibt sogar einige die diese Version bevorzugen. Aber wenn du das anders schreiben würdest... :) Edit: Siehe auch dot's Post.

Zitat von »"drakon"«


Und im übrigen solltest du die C++ Streams benutzen und nicht das C-Zeugs. (siehe std::ifstream..)


Wieso sollte man? Gibt es irgendwelche Richtlinien nach denen man sich in der Hinsicht wenden sollte? Und wenn ja, wieso?
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

26.03.2008, 15:14

Ich habe mich auf 3.6.1, 2 bezogen. Möglich, dass ich es falsch verstanden habe. ;)

Ok, das andere ist vielleicht schlechte Angewohnheit. (Ist zum lesen logischer), wobei ich sowieso auf NULL nicht prüfen würde, sondern meist auf andere Variabeln und dann kommt es nicht mehr drauf an..(ausser wen die linke dann wieder const usw.)

Zitat

drakon hat Folgendes geschrieben:

Und im übrigen solltest du die C++ Streams benutzen und nicht das C-Zeugs. (siehe std::ifstream..)


Wieso sollte man? Gibt es irgendwelche Richtlinien nach denen man sich in der Hinsicht wenden sollte? Und wenn ja, wieso?


Naja, ich bin der Meinung, wenn man C++ benutzt, dann sollte man auch die Möglichkeiten nutzen, die es da gibt. (Sind ja bestimmt nicht da, wenn das alte "besser" wäre..)
Und warum man das so macht: Ich finde auch, dass es eleganter ist, wenn man da ein Objekt hat und nicht mit irgendwelchen Zeigern rumhantieren muss..

Werbeanzeige