Datei öffnen Dialogfenster und fopen() passen irgendwie nicht zusammen?!?



  • [EDIT] dies hat sich schon geklärt meine neue Frage ist weiter unten [/EDIT]
    Hallo erstmal allen die in mein Thema gestollpert sind.

    Ich schreibe gerade für mein Studium eine kleine Simulation (ohne MFC).
    Da man in dieses Simulation verschiedene Senarien abspeichern können soll,
    ist es notwendig Einstellungen zu speichern.
    Leider ist mir gerade überhaupt nicht geläufig, wie ich am besten einen Senario speichern bzw laden Dialog realisiere.

    Gibt es diesen vorgefährtigt ähnlich wie die MessagBox oder muß man diese selber schreiben?
    Bzw. wenn ich ihn selbst erstellen muß, wie realiesiert man dann einen
    Dateibrowser am besten.

    Freue mich über jeden Tipps oder Tutorial zu diesem Thema,
    auf das jemand die Nägel aus dem Brett vor meinem Kopf zieht 😉

    Gruß wastman





  • Aua das tut jetzt aber weh... 🤡
    Notiz an mich selbst: nutze heufiger die online MSDN Datenbank
    und weniger das unvollständige veralltete Ding auf deinem Rechner 🙄

    Danke für das entfernen der Nägel hoffe mal das ich es mit diesem Tip hinbekommen werde 🙂

    Gruß wastman



  • Im Platform SDK ist ne Art Mini-MSDN drin, ideal zum auffinden von solchen Funktionen und wenn einem die online-msdn zu langsam lädt 😉



  • Hallo ich bin es nochmal...

    Der aufruf des öffnen / schließen dialogs klappt jetzt schon total super 👍

    Auszug aus Callback Funktion des Konfigurations dialogs

    .........
    if(wParam == IDC_LADEN)
    				{
    				// open dialog 
    				OPENFILENAME ofn;       // common dialog box structure
    				char szFile[260];       // buffer for file name
    				//HWND hwndDlg;         // owner window
    				HANDLE hf;              // file handle
    
    				// Initialize OPENFILENAME
    				ZeroMemory(&ofn, sizeof(ofn));
    				ofn.lStructSize = sizeof(ofn);
    				ofn.hwndOwner = hwndDlg;
    				ofn.lpstrFile = szFile;
    				//
    				// Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    				// use the contents of szFile to initialize itself.
    				//
    				ofn.lpstrFile[0] = '\0';
    				ofn.nMaxFile = sizeof(szFile);
    				ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    				ofn.nFilterIndex = 1;
    				ofn.lpstrFileTitle = NULL;
    				ofn.nMaxFileTitle = 0;
    				ofn.lpstrInitialDir = NULL;
    				ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    				// Display the Open dialog box. 
    
    				if (GetOpenFileName(&ofn)==TRUE) 
    					hf = CreateFile(ofn.lpstrFile, GENERIC_READ,0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
    
    				int test=Konfig.Senario_laden("szFile");				if (test == 0)
    					return FALSE;
    
    				// Daten in Konfig-Fenster Laden
    				for(i=0; i< Konfig.anz_Auswertung; i++) // Auswertungshäckchen
    					CheckDlgButton(hwndDlg,5000+i ,Konfig.get_Auswertung(i) ? BST_CHECKED: BST_UNCHECKED);
    				for(i=0; i< Konfig.anz_Allgemein; i++) // Allgemeine Einstellungen
    					{
    					sprintf(Text, "%f" , Konfig.get_Allgemein(i));			
    					SetDlgItemText(hwndDlg,5100+i, Text );
    					}
    				for(i=0; i< Konfig.anz_KIT; i++) // KIT Einstellungen
    					{
    					sprintf(Text, "%f" , Konfig.get_KIT(i));			
    					SetDlgItemText(hwndDlg,5200+i, Text );
    					}
    				for(i=0; i< Konfig.anz_F1; i++) // F1 Einstellungen
    					{
    					sprintf(Text, "%f" , Konfig.get_F1(i));			
    					if(i == 0)
    						CheckDlgButton(hwndDlg,5300 ,(int)Konfig.get_F1(0) ? BST_CHECKED: BST_UNCHECKED);
    					else
    						SetDlgItemText(hwndDlg,5300+i, Text );
    					}
    
    				return TRUE;
    

    Nur leider kann ich im Anschluß an den Ladendialog in meiner Funktion Senario_laden("szFile") nicht den Befehl fopen() aufrufen, dieser liefert dann immer 0 zurück. Dies muß mit dem erstellen des Ladendialogs zusammen hängen, da fopen() bis zu dem Zeitpunkt wo ich den Ladendialog create einbandfrei funktioniert.

    Senario laden Funktion

    bool Konfiguration::Senario_laden(char *Datei )
    {
    	FILE *pf;	
    	int i =0;
    
    	pf = fopen( "Datei", "r");  // Datei nur lesend öffnen
    	if( !pf)						// wenn Fehler abbruch
    		return 0;
    
    	for( i = 0; i < anz_Auswertung; i++)			// einlesen der werte aus config.dat
    		fscanf( pf, "%d,", &Auswertung[i]);
    	for( i = 0; i < anz_Allgemein; i++)			// einlesen der werte aus Datei.dat	
    		fscanf( pf, "%f,", &Allgemein[i]);
    	for( i = 0; i < anz_KIT; i++)			// einlesen der werte aus Datei.dat	
    		fscanf( pf, "%f,", &KIT[i]);	
    	for( i = 0; i < anz_F1; i++)			// einlesen der werte aus Datei.dat	
    		fscanf( pf, "%f,", &F1[i]);	
    	fclose( pf);				// Datei schließen
    	return 1;
    }
    

    Hat jemand einen Vorschlag was ich machen muß, damit fopen() auch nach dem erstellen der Ladendialogbox weiter nutzbar ist, oder kennt jemand eine funktionierende Alternative zu fopen()?
    Ersterer Lösungsansatz wäre mir lieber , da ich dann nicht so viel im Quelltext umbauen müßte 😃

    MFG Wastman



  • Meintest du vielleicht....

    pf = fopen( Datei, "r");  // Datei ohne die Anführungszeichen ("")
    if( !pf)
    


  • [quote="wastman"]

    int test=Konfig.Senario_laden("szFile");
    

    Hier hat er auch noch nen Hauer drin...



  • Außerdem fehlt da meines erachtens nach noch ein CloseHandle...

    hf = CreateFile(ofn.lpstrFile, GENERIC_READ,0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
    CloseHandle(hf);
    int test=Konfig.Senario_laden("szFile");
    

    Du solltest Dich mal entscheiden: Entweder API-Funktionen (CreateFile, ReadFile, WriteFile) oder gleich ganz mit CRT (fopen, fwrite, fputs, fputc).

    Warum so ein Mischmasch?



  • Erstmal danke für die Anmerkungen

    zu Dago hast natürlich recht Gänsefüßchen sind zuviel da Datei eine Variable aus dem Funktionsrumpf ist

    bool Konfiguration::Senario_laden(char *Datei )
    

    zu MSDN Du hast auch recht die Anführungsstriche sind zuviel!

    Diese hatte ich vergessen wegzumachen, wie die Anführungszeichen bei Senario_Laden auch, nachdem ich zu Testzwecken feste Dateipfad übergeben hatte. 😞

    Ich denke übrigens das du damit recht haben könntest, dass fopen() nicht mehr geht weil der handle noch nicht geschlossen wurde. Werd das mal ausprobieren.
    Das Schließen des Handle stand auch nicht im Beispiel bei msdn daher habe ich das wohl "verpeilt" 🙄

    Na ja und zum Thema entscheiden kann ich nur sagen, das ich ein wenig unter Zeitdruck arbeite 😡 und daher so oft wie möglich auf mir bekannte Dinge zurückgreife was leider ein wenig Mischmasch zur Folge hat *zugeb und nicht stolz drauf* 🙄 aber man ist ja lern fähig 🙂



  • oh jetzt habe ich das Kapiert .... *kopfhau*

    war natürlich doppelt gemoppelt mit createFile()
    und fopen()....... ja ja das kommt davon wenn man code aus Toturials kopiert und nicht jede Zeile im Eifer des Gefechts genau ergründet 💡
    Bin jetzt bei fopen() einheitlich geblieben, da das Programm aus einer Consolenanwendung heraus entsteht, und dort auch schon des häufigernen fopen()benutzt wurde.

    Aber es geht jetzt 👍 😃

    Nochmal danke an alle die meine DAU Fragen beantwortet haben

    Gruß wastman


Anmelden zum Antworten