Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
28.05.2002, 16:35
Sccar



moin

ich versuche eine kleine configdatei mit zwei zeile mit fopen zu öffnen. wenn ich das programm ganz normal ausführe stürzt es bei fopen(file, "rt") ab. wenn ich es mit msvc++ im debugmodus ausführe, liefert mit der funktionsaufruf einen NULL-pointer zurück. woran könnte das liegen?

[code]
bool LoadCfgFile(CONFIG *cfg, const char *file)
{
FILE *filein;
char oneline[255];

filein = fopen(file, "rt");

if(filein == NULL)
return false;

readstr(filein, oneline);
sscanf(oneline, "SCREEN_WIDTH: %s\n", cfg->screen_width);

readstr(filein, oneline);
sscanf(oneline, "SCREEN_HEIGHT: %s\n", cfg->screen_height);

fclose(filein);
return true;
}
[/code]

thx
sccar

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche
001
28.05.2002, 16:49
[RMen]OneStone



vielleicht noch ein if(file == 0) return false; an den Anfang.

[edit]Woher weisst du so genau, das der Absturz beim fopen passiert?[/edit]

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/


Dieser Beitrag wurde am 28.05.2002 um 16:59 von [RMen]OneStone bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
28.05.2002, 16:54
Sccar



jo ok, daran kann aber der konkrete programmabsturz net liegen.

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche
003
28.05.2002, 18:37
dp
Administrator


für was steht denn das 't' in "rt" ?

--

zum Seitenanfang zum Seitenende Profil || Suche
004
28.05.2002, 18:52
TheTinySteini



t steht für Textmode. Praktisch das Pendant zu "b" für binary Mode. Welcher Modus Standart ist, steht laut MSDN in der Variable _fmode.

Zum Problem: hast du überprüft, ob der Dateiname korrekt übergeben wird? Probier auch mal ohne das "t" - und wie schon OneStone meinte, woher weißt du, dass es genau bei fopen crasht?

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
005
28.05.2002, 19:57
Leviathan



wie äußert sich denn der absturz?
in der form:
programm verursachte eine schutzverletzung im modul programm.exe [...] ?

gibt es denn die datei, die du öffnen willst überhaupt? wenn nein ist fopen("datei_die_nicht_existiert","r")==NULL (ist so definiert)

weitere typische fehler bei diesem problem:
- dateinamen müssen mit doppelbackslash geschrieben werden, wenn sie als konstanten im programm vorliegen (\ sagt das er zusammen mit folgendem zeichen ein steuerzeichen ist, z.b. \n)
- mit dem char * 'gemurkst', z.b. den zeiger nicht initialisiert?

kleine anmerkung: für
Quellcode:
filein = fopen(file, "rt");

if(filein == NULL)
return false;
findest du auch oft
Quellcode:
if((filein=fopen(file,"rt"))==NULL) return false;

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
006
28.05.2002, 20:02
Archangel



readstr(filein, oneline);
sscanf(oneline, "SCREEN_WIDTH: %s\n", cfg->screen_width);

readstr(filein, oneline);
sscanf(oneline, "SCREEN_HEIGHT: %s\n", cfg->screen_height);

ganz sicher dass das nich:

...
sscanf(oneline, "SCREEN_WIDTH: %s\n", &cfg->screen_width);
...
sscanf(oneline, "SCREEN_HEIGHT: %s\n", &cfg->screen_height);

heißen muss ? :D

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
007
28.05.2002, 20:39
Leviathan



achja, hab ich eben vergessen:
was genau bedeutet das dick gedruckte in folgendem code?:
Quellcode:
sscanf(oneline, "[b]SCREEN_WIDTH: [/b]%s[b]\n[/b]", cfg->screen_width);

ich weiss, dass sscanf ein scanf aus strings ist und dass man mit scanf("%s",string) einen string von stdin in die char * string -variable einliest (für die natürlich vorher speicehrplatz reserviert wurde), aber was soll der rest da?

und @ archangel: das ist richtig so wie ich es kopiert habe, bei strings im char * -format (also strings wie sie in c waren) brauchst du keinen addressoperator, da die sowieso schon pointer sind. würde er einen int oder einen double einlesen hättest du recht.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
008
28.05.2002, 21:51
dp
Administrator


ah, text, wusste garnicht dass es das gibt. dachte das ist automatisch text wenn man nicht explizit b angibt..

--

zum Seitenanfang zum Seitenende Profil || Suche
009
28.05.2002, 21:57
Mazze



ich geb da immer "a" (ascii) ein...

Übrigens hat Leviathan schon recht mit den char* s

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
010
29.05.2002, 13:41
Archangel



ack, stimmt ja, sind ja char-pointers... wieso eigtl ? is doch unsinnig...

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
011
29.05.2002, 14:13
Sccar



also, der dateinmae wird richtig übergeben, die datei ist ebenfalls in dem entsprechenden ordner (in dem gleichen wie das proggie) enthalten. ich weiß, das es bei fopen crasht, da ich das mit nem debug geprüft habe. das interessante ist wie gesagt, dass der nur beim normalen programmablauf ohne debug abstürzt, beim debug hingegen liefert fopen an dieser stelle nur ein NULL (also fehler).
beim absturz meldet windows: "Dieses Programm wird auf Grund eines ungültigen Vorgangs geschlossen. Wenn das Problem weiterhin besteht wenden sie sich bitte an Microsoft."

@Leviathan

ich schreibe in die cfg dann z.B:

SCREEN_WIDTH: 640

dadurch ist die cfg einfacher zu verstehen. sscanf "ignoriert" durch diese code sozusagen das SCREEN_WIDTH: und liest nur das 640 ein. d.h ich muss das net umständlich selber rauspuhlen =).

was meinst du mit

- dateinamen müssen mit doppelbackslash geschrieben werden, wenn sie als konstanten im programm vorliegen (\ sagt das er zusammen mit folgendem zeichen ein steuerzeichen ist, z.b. \n)

gib bitte mal ein beispiel.
oder meinst du, wenn ich z.B. C:/windows/test.txt haben will muss ich C://windows//test.txt schreiben?

thx alle

sccar

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche
012
29.05.2002, 14:24
TheTinySteini



Nope, wenn du c:\windows\test.txt haben willst, musst du c:\\windows\\test.txt schreiben - gilt also nur für backslashes. forward slashes sollten aber auch funktionieren.

Mazze: "a" is append, nicht ascii!
Archangel: Weil er dann nicht zwischen verschiedenen Strings hin- und herkopieren muss?!
Sccar: klingt vielleicht blöde, aber hast du schon dran gedacht, dass VC++ ja die .exe erstmal in den Unterordnern Release bzw. Debug ablegt? Vielleicht solltest du deine Datei dort mal hinkopieren. Allerdings, wenn du ne Pfadangabe hast, muss das ja egal sein.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
013
29.05.2002, 14:29
Sccar



@ttt: die cfg liegt in dem debug unterordner, wo sie auch liegen muss (bei anderen sachen hats geklappt).

tut es vielleicht was zur sache, das ich in dem projekt sdl benutze?

sccar

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche
014
29.05.2002, 15:53
[RMen]OneStone



Du kannst nicht wissen, ob es ausserhalb des Debug's auch bei fopen hakt, es sei denn, du machst ein __asm int 3 rein!

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
015
29.05.2002, 17:22
Sccar



hast recht. ich hab deswegen mal debug ausgaben hinzugefügt. aber es liegt definitiv an dem fopen.

hmm :((

sccar

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche
016
30.05.2002, 01:02
dp
Administrator


wenns wider erwarten doch nicht am fopen liegt guck doch mal ob cfg->screen_width nen null pointer ist oder sonstwelchen kram enthält ausser das was er sollte ..

--

zum Seitenanfang zum Seitenende Profil || Suche
017
30.05.2002, 02:19
Leviathan



@archangel: char * sind strings weil strings ein array mit char-elementen sind, und arrays sind in c / c++ nunmal zeiger auf das 0. element des strings, dadurch ist auch zugriff über pointeraritmetik möglich.
das gilt nicht für strings im c++ - sinne, also mit der klasse aus der stl.

@scarr: die datei liegt im debug-unterordner? wenn du das programm aber über ausführen aus der entwicklungsumgebung startest ist der aktuelle ordner der projektordner, nicht der debugordner.gib dir doch einfach mal den dateinamen aus bevor du öffnest, das könnte einiges klären.

wenn es gar nicht mit fopen funktioniert probier es mal mit der ifstream-klasse aus der stl, damit solle man alles machen können was mit fopen und den "f-funktionen" auch geht.

und was ist eigentlich sdl? meinst du vielleicht stl, standart template library

noch eine kleine anmerkung: du solltest dir angewöhnen, zeiger bei der definition direkt mit NULL zu belegen, das hilft fehler zu vermeiden.

und das mit dem fopen kann man leicht überprüfen, kommentiere es einfach aus und führe das programm einmal aus, gibt es dann den gleichen fehler wie vorher lag es wahrscheinlich nicht an dem fopen.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
018
30.05.2002, 12:44
Mazze



er meint wohl eher Simple Directmedia Layer
http://www.libsdl.org/

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
019
30.05.2002, 15:38
Archangel



@archangel: char * sind strings weil strings ein array mit char-elementen sind, und arrays sind in c / c++ nunmal zeiger auf das 0. element des strings, dadurch ist auch zugriff über pointeraritmetik möglich.
das gilt nicht für strings im c++ - sinne, also mit der klasse aus der stl.

hab ich danach gefragt ? ich weiß, was char-pointer sind..
ich meinte eher, sachen wie screen_width etc speichert man doch normalerweise in integers..

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005


Dieser Beitrag wurde am 30.05.2002 um 15:39 von Archangel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
30.05.2002, 16:01
Leviathan



@archangel: eigentilich dachte ich schon, dass du danach gefragt hast, ist jetzt aber auch egal.

wenn er als int speiechrn möchte, müsste er
Quellcode:
sscanf(oneline, "SCREEN_WIDTH: %d\n", &(cfg->screen_width));

schreiben, zumindest wenn die angabe dezimal vorliegt und cfg->screen_width ein int oder long ist.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
021
30.05.2002, 18:00
Sccar



hmm, okay, danke für die vielen tips. ich habs jetzt mit ifstream gemacht, und siehe da, es funktioniert. kein plan warums es vorher nicht getan hat. den fehler mit dem %s hab ich auch (schon =) behoben.
sdl = simple directmedia layer *kekszumazzewerf*

naja, das war eins dieser probs, die man wahrscheinlich nie lösen wird (windows ?!??). trotzdem danke für die hilfe.

sccar

--

...das is zwar der uebelst gehackteste kleine bastard, den ich je gesehen habe, aber dafuer sauschnell. {Tron}

zum Seitenanfang zum Seitenende Profil || Suche