fscanf will nichts auslesen
-
Hallo ihr Profis. Leider bin ich im moment stark am vezweifeln wegen folgendem Problem:
beliebiges verzeichniss:
yatba.exe
unterverzeichniss: save
char.chr (enthaelt 1 wort(mencius als beispiel) und ist eine normale ascii textdatei)FILE *savefile_char; CString charname; file_to_load enthaelt save\char.chr als uebergabe int character::load(CString file_to_load) { if((savefile_char = fopen(file_to_load,"r")) == NULL)//öffnen fehlgeschlagen { character_loaded = FALSE; return 1; } else//datei geöffnet { fscanf(savefile_char, "%s",charname); AfxMessageBox(charname);//nur zum testen damit ich sehe ob was drin steht character_loaded = TRUE; fclose(savefile_char); return 0; } }
... und ich finde einfach das Problem nicht was dafuer sorgt das charname immer leer bleibt.
[ Dieser Beitrag wurde am 21.04.2003 um 01:56 Uhr von Shakareh editiert. ]
-
Ohne Garantie:
Wenn du mit fscanf und %s arbeiten willst, sollte in der Datei ein 0-terminierter String stehen. Allerdings kommt in einer Text-Datei kein 0-Zeichen am Ende eines Worts sondern entweder ein Leerzeichen oder ein \n.
Entweder änderst du das Programm so, dass binär ein string abgespeichert wird, wo dann das 0-Zeichen auch in der Datei steht oder du benutzt eine andere Funktion zum Auslesen (bei Config-Einstellungen kannst du z.B. die Registry benutzen, wenn es wirklich eine Text-Datei sein soll, habe ich mir bisher immer eigene Funktionen geschrieben, wobei es da wohl auch irgendwelche Funktionen in der Win-API gibt).Nicht lynchen, wenn das Schwachsinn hier oben ist, aber bin recht neu in Windows- und MFC-Programmierung.
-
Naja, ich muss aus einer 2ten Datei im Moment knapp 10.000 Werte auslesen (klappt genau so wenig aber ist im prinzip das gleiche daher habe ich das kurze name-auslese-stück als beispiel genommen), können aber wenn sich das als zu wenig herausstellen sollte gut und gerne 100.000 werden - und damit müll ich die registry dann doch zu sehr zu...
Aber deine Variante werde ich mal versuchen - hab die txtx date bisher per hand erstellt..dann lass ich sie halt mal vom programmm schreiben.
Wenns nich klappt schrei ich wieder
-
*kopfschüttel*
CString ist ein zu fscanf inkompatibles Objekt. Das müsstest Du schon daran erkennen, dass fscanf als Parameter zu '%s' ein char* erwartet und keinen CString!
-
Hi!
CString hat einen Umwandlungsoperator der dem Compiler erlaubt CString nach char * zu casten. (Damits bequemer ist bei den API Funktionen).
Deswegen "schluckt" das Dein Compiler. Selbst wenn es mal gehen sollte, das verhalten ist falsch da es undefiniert ist.
Schau Dir fstream an. Damit kannst Du Deine Wort sehr bequem in einen std::string einlesen.
Um den std::string in CString zu bekommen:
CString cTemp;
std::string strTemp
cTemp = strTemp.c_str();Um einen CString in strTemp zu bekommen:
strTemp = static_cast<LPCSTR>(cTemp);Wenn die Sache jedoch Zeitkritisch ist müsste mal einer der MFC Jungs rann
(CFile z.B. oder irgendwie sowas)
[edit]ma wieder die smilies...[/edit]
[ Dieser Beitrag wurde am 22.04.2003 um 10:20 Uhr von Knuddlbaer editiert. ]
-
Original erstellt von Knuddlbaer:
CString hat einen Umwandlungsoperator der dem Compiler erlaubt CString nach char * zu casten. (Damits bequemer ist bei den API Funktionen).Nicht ganz. CString hat einen Cast-Operator für const TCHAR*. Der hätte also hier sowieso nicht weitergeholfen.
Deswegen "schluckt" das Dein Compiler.
Auch nicht ganz. Der Compiler "schluckt" das, weil keine Typprüfung für die optionalen Argumente durchgeführt wird. Der oben erwähnte Cast-Operator wird also noch nicht mal aufgerufen.
[ Dieser Beitrag wurde am 22.04.2003 um 11:33 Uhr von MFK editiert. ]
-
Original erstellt von Knuddlbaer:
**
...
Deswegen "schluckt" das Dein Compiler. Selbst wenn es mal gehen sollte, das verhalten ist falsch da es undefiniert ist.
...
**Puh - bisher hat's immer geklappt - dachte mal irgenwo gelesen zu haben das man CString und char* beliebig eintauschen kann, bei den kleinen sachen die ich brauchte hat es wie gesagt - bisher - auch immer geklappt, war halt sehr bequem so
schade eigendlich. bei fopen klappts ja... erfolgreich geöffnet wird ja.... nun ja nächstes mal schau ich nach ob ich mich richtig erinnere - hab ne gaaanze weile pause gemacht so zu sagen
Nun gut dann werde ich mich mal ans umschreiben machen.edit: hab edit vermisst - wollte sie unbedingt noch mal sehen
:p
[ Dieser Beitrag wurde am 22.04.2003 um 15:17 Uhr von Shakareh editiert. ]
-
Nicht ganz. CString hat einen Cast-Operator für const TCHAR*. Der hätte also hier sowieso nicht weitergeholfen
Aus der MSDN:
The TCHAR data type is a Win32 character string that can be used to describe ANSI, DBCS, or Unicode strings. For ANSI and DBCS platforms, TCHAR is defined as follows:
typedef char TCHAR;
So ganz durchsichtig find ich das mit dem casten bei dem CStrign aber ohnehin nicht. (Gibt ja noch nen op auf PCXSTR etc.)
Puh - bisher hat's immer geklappt - dachte mal irgenwo gelesen zu haben das man CString und char* beliebig eintauschen kann, bei den kleinen sachen die ich brauchte hat es wie gesagt - bisher - auch immer geklappt, war halt sehr bequem so schade eigendlich. bei fopen klappts ja... erfolgreich geöffnet wird ja.... nun ja nächstes mal schau ich nach ob ich mich richtig erinnere - hab ne gaaanze weile pause gemacht so zu sagen
Nun gut dann werde ich mich mal ans umschreiben machen.Na bei fopen wird ja nur "gelesen" und da hast Du keinerlei Probleme dabei.
Aufpassen musst Du nur bei Funktionen die etwas "schreiben" wollen.