Problem mit gets
-
Eigentlich dachte ich nicht an Dateien einlesen.Der benutzer macht eine eingabe.Diese wird mit punkten in eine Datei geschrieben.Früher hats geklappt.Jetzt hab ich denn Code mit Dlls eingebaut.Und nun will es nicht.Es Zeigt es an macht aber sofort weiter im Programm.Man kann also nicht seinen namen eingeben.
-
Stefan311 schrieb:
Diese wird mit punkten in eine Datei geschrieben.Früher hats geklappt.
wie soll's auch in die datei kommen? da ist nirgends ein 'fwrite' o.ä. zu sehen.
-
das ist erst am ende.Weil die Punkte doch erst gezählt werden müssen.Alerdings mach ich das mit fprintf
printf("\nDas wars Fragen beendet."); getch(); printf("\nIhr name %s wird eingetragen\n", string); getch(); fprintf (datei, "Name: %s Punkte:%d\n", string, d); < Hier das schreiben in die Datei fclose(datei); }
fwrite kenne ich nicht und vor so ner woch hats auch geklappt.Jetzt hab ich es in eine Dll kepackt und prommt klappt es nicht mehr.Es stürzt ja auch nicht ab.Es zeigtan und macht sofor weiter.
mfg.
Stefan
-
howdy!
mann fgets lest nicht von ner datei waenn du den stream stdin verwaendest!!!
-
@--linuxuser-- Dein Beitrag ist nicht besonders hilfreich.
Da er den Buffer auf 100 Zeichen gestzt hat, und ich nicht davon ausgehe das er mehr als 100 Zeichen eingibt bringt fgets nichts.
den gets ist im Endeffekt nichts anderes als ein fgets(stdin,....). Warum soll eine funktionierende Routine gegen eine andere austauschen.
Seine Aussage ist ja auch als er es nicht in eine dll gepackt hatte, funktionierte es, erst als er es in eine dll pckt funktionierts nicht mehr.
Dieses Problem hat wahrscheinlich etwas mit der Code-Generierung bei DLL`s zu tun.
Ich weis an der Stelle auch nicht weiter. Das es etwas mit OS-zu tun hat, vielleicht besser ins Winapi Forum verschieben
-
PAD schrieb:
Da er den Buffer auf 100 Zeichen gestzt hat, und ich nicht davon ausgehe das er mehr als 100 Zeichen eingibt bringt fgets nichts.
Und wenn doch jemand mehr als 99 Zeichen eingibt? Dann crasht evtl. das Programm. Toll. Naja, wenigstens hat man beim Programmieren 11 Zeichen weniger tippen müssen
-
Grundsatzdiskussionen machen Spaß, helfen aber nciht weiter. Anstelle einem Anfänger Antworten zu geben die nicht zum Problem passen und verwirren wäre echte Hilfe gut.
Leider muß ich bei dem Problem im Moment auch passen.
Ich habe einen ähnlichen Fall:
Ich habe eine Funktion der ich einen korrekten Filepointer (File fp) eines
existierenden und im Programm geöffneten Files übergebe. Befindet sich diese Funktion
- in einem obj-File und wird mitgelinkt oder
- als Source im Projekt und wird mitkompiliert oder
- in einer statischen Bibliothek (.liB)
funktioniert es einwandfrei.Lagere ich exact diese Funktion in eine DLL aus so bekommen ich ein Fehler 5
access violation.
Lagere ich das öffnen des Files ebenfalls in eine Funktion in der dll aus
funktionierts.Bisher konnte mir noch niemand helfen. Ich muß diese Toolfunktion in einer
statischen library zu den Projekten binden
-
Also ist das ein "allgemeiner" Fehler?Dann liegt es an was anderem?Dan bin ich wenigsten froh das es ausnamstweise nicht an mir lag.
Ich werde es jetzt fgets einbauen.
mfg.
Stefan
-
Ich glaube nicht, das es mit fgets besser wird, aber viel Glück
-
PAD schrieb:
Ich habe einen ähnlichen Fall:
Ich habe eine Funktion der ich einen korrekten Filepointer (File fp) eines
existierenden und im Programm geöffneten Files übergebe. Befindet sich diese Funktion
- in einem obj-File und wird mitgelinkt oder
- als Source im Projekt und wird mitkompiliert oder
- in einer statischen Bibliothek (.liB)
funktioniert es einwandfrei.Lagere ich exact diese Funktion in eine DLL aus so bekommen ich ein Fehler 5
access violation.
Lagere ich das öffnen des Files ebenfalls in eine Funktion in der dll aus
funktionierts.das liegt daran, dass die dll eine eigene kopie der runtime-lib verwendet (msvcrtXXX.lib oder wie die heisst). mit einem 'FILE *x = fopen(...' in dem programm kann die dll nix anfangen weil ihre rtl das file nicht geöffnet hat. abhilfe: dynamische (dll-version) der rtl in beiden modulen verwenden, dann gibbets die nur einmal und alle sind zufrieden.
PAD schrieb:
Bisher konnte mir noch niemand helfen.
dann frag das nächste mal hier im board. wie heisst doch das motto? 'irgendwer weiss immer eine antwort'
-
@net Guter Witz
Schau mal hier, das war der zweite Versuch06 Apr 2005 21:17 Titel: Probleme mit pointer und Datenübergabe an dll´s
http://www.c-plusplus.net/forum/viewtopic-var-p-is-761441-and-highlight-is-.html#761441Der erste mit exact dem selben Ergebnis war ungefähr 3 Monate vorher,
dank der derzeitigen schlechten Suche im Board, er kann "WriteFileHeader" im Board "MFC (Visual C++)" nicht finden, bleibe ich die zweite Quellenangabe schuldig
Das zum "Frag das nächste mal hier"
Aber sowas kann immer passieren, auch in einem so guten Forum wie hier
,
um so mehr freut es mich, das eine Randerwähnung des Themas neu Ideen bringtIch arbeite mit MS VC 6.0 Service Pack 4 unter Windows 2000 / NT / XP und compiliere auch C Code mit der Einstellung C++ (Er bringt dann mehr Fehlermeldungen, Ja ich bin ein Masochist)?
das liegt daran, dass die dll eine eigene kopie der runtime-lib verwendet (msvcrtXXX.lib oder wie die heisst). mit einem 'FILE *x = fopen(...' in dem programm kann die dll nix anfangen weil ihre rtl das file nicht geöffnet hat. abhilfe: dynamische (dll-version) der rtl in beiden modulen verwenden, dann gibbets die nur einmal und alle sind zufrieden.
Hast du eine Ahnung auf welche Weise ich den Compiler überreden kann auf die dynamische Bindung umzustellen?
Schon mal Danke
-
weiss ich jetzt auch nicht, aber vielleicht könnte das gehen:
// funktion in dll
void use_external_filepointer (FILE p)
{
#ifdef WIN32
// mach einen neuen FILE vom file handle in *p
p = _dup(_fileno(p));
#endif
// hier normale ansi-c fileoperationen
// ...
}ich denke mal ein fclose() entweder in der dll oder der exe sollte das file schliessen. trotzdem brauchste wohl in beiden ein fclose, um beide FILE* zu freen. einfach mal rumprobieren.
guckst du auch: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__dup.2c_._dup2.asp
-
Ich hab mir jetzt was überlegt.
Ich bau gets in die exe ein.Dann schreib ich mit dem anderem(die DLL)denn rest ein.
Fgets hat leider auch nicht funktioniert.
Aber danke für die Hilfe.mfg.
Stefan
-
Ich hab die lösung gefunden.
#Sie ist aber leicht komisch:
exe datei:int spiel(void) { char string[100]; fgets(string,100,stdin);//fragt er nicht ab DllGame(); anfang(); }
In der DLL:
DLLIMPORT void DllGame() { int a, b=0, c=1, d=0; char string[100]; FILE*datei; datei=fopen("Higscore.txt","a"); printf("Bitte Namen eingeben: "); fgets(string,100,stdin); // hier kann mann komischerweise eingeben aber nur wenn in der exe datei das fgets steht.(fgets(string,100,stdin);//fragt er nicht ab)
Aber so klappt es.Komisch.
mfg.
Stefan
-
Es könnte sein das es nicht funktioniert, da der Linker "vergisst" die library mit den io Routinen hinzuzubinden.
Im MSVC 6.0 mußten wir in der Initialisierung eine dummi float Operation einfügen, damit er für die Funktionen die aus der ..printf.. ..scanf.. Gruppe sind die Float formate mit einbindet. Fehlt diese Funktion so kann keine Funktion aus der Library Floatzahlen formatieren, wenn sie aus der Library oder aus dem Hauptprogramm gerufen wird. alle anderen Formate funktionieren. Im Hauptprogramm funktioniert die Floatformatierung. Wir haben sonst keine Funktion in der dll die floatzahlen formatiert. Allerdings haben wir eine grüßere Anzahl von toolfunktionen die mit der variablen Argumentelist und vsprintf arbeiten.
Eine andere Lösung ist uns nicht eingefallen, es gibt scheinbar keinen Linkerswitch der das einbinden der Floatformate forciert.
Bei embbeded Compilern kenne ich das, die schreiben das auch dazu, das man für die floatformatierung eine andere / zusätzliche library einbinden muß, aber bei einem Compiler für Windows ????///////////// private Funktion um sprintf mit floatformaten zu bekommen static void dummifloatforvsprintf(void) { char typ[6]; sprintf(typ,"%5.5f",3.001); return; } ///////////// Ende private Funktion um sprintf mit floatformaten zu bekommen