[gelöst] Ini-Datei auslesen OHNE API



  • Moin zusammen,

    stimmt, man möchte die REG nutzen, deshalb hat man GetProfilString() nicht implementiert... Nur mit dem Nachteil, dass nach einem Hardreset bei den meisten PDA/PNA dann die REG wieder auf Auslieferzustand ist, Änderungen durch mich also verschwunden sind.

    Gut, man könnte Startsequenzen dazwischen bauen, die diese Einträge wieder setzt, aber das ist mir zu doof und bremst den Systemstart aus. Deshalb der Weg über die INI.

    ...diese Funktion komplett selber schreiben... Sorry, da muss ich kneifen, da ich nur blutiger Nichtkönner bin... 😋



  • Moin, moin,

    'nen ini- Reader hab' ich, würd' ich Dir auch geben.
    Ist an einem Vormittag entstanden, als das von Sourceforge geholte Exemplar einer Lib mit SegFaults, hinter die ich nie gekommen bin, 'ne ganze DLL lahmgelegt hat.
    Kann inis nur lesen, ist nicht schnell (Directory ohne Hash, durchsucht stringmäßig), funktioniert aber ohne Abkacken und Memory Leaks.

    Ini- basiert mach' ich, weil ohne OS keine zentralen Instanzen vorhanden sind, das ist bei mir der Normalfall.

    Bißchen viel zum Posten hier, bitt ggf. per PM anfordern.



  • Das Auslesen einer INI ist nun wirklich nicht die große Kunst. Das packst du locker.

    Edit: ich habs aus den gleichen Gründen wie PointerCrash mal gemacht. Sowas brauch man immer früher oder später mal, wenn man Applikationen in unterschiedlichen Konfigurationen einsetzen will.



  • It0101 schrieb:

    Edit: ich habs aus den gleichen Gründen wie PointerCrash mal gemacht. Sowas brauch man immer früher oder später mal, wenn man Applikationen in unterschiedlichen Konfigurationen einsetzen will.

    Hast Du Deinen mit Hash und rewrite oder auch nur "Fauler Hund-" IniReader, so wie ich?



  • int getPrivateProfileString(
      const char* sektion,
      const char* name,
      const char* vorgabe,
      char *wert,
      int max,
      const char* datei)
    {
      char zeile[100],t1[100],t2[100],s[100]="";
      FILE *f = fopen(datei,"r");
      if( !f ) return -1;
      while( fgets(zeile,100,f) )
        if( 2==sscanf(zeile,"%[^\]]%[^\n]",t1,t2) && !strcmp((sscanf(t2,"%s",zeile),zeile),"]") && ((sscanf(t1,"%s",zeile),zeile),*zeile=='[') )
          strcpy(s,(sscanf(strchr(t1,'[')+1,"%s",zeile),zeile));
        else
        if( !strcmp(s,sektion) )
          if( 2==sscanf(zeile,"%[^=]=%[^\n]",t1,t2) && !strcmp((sscanf(t1,"%s",zeile),zeile),name) )
            return fclose(f),t2[max-1]=0,strlen(strcpy(wert,t2))+1;
      fclose(f);
      return strlen(strcpy(wert,vorgabe))+1;
    }
    

    Funktioniert für einfache Beispiele

    [bla]
    fasel=123
    

    wie auch für kompliziertere

    [ bla ] 
      fasel  = 1 2 3
    


  • Ihr macht mich ganz jeck im Kopf... 😃
    Dabei brauche ich nur ein paar Einträge aus der INI, die sowieso nur knapp 20 Einträge hat, wenn es hoch kommt...

    Das Ganze dient einem Tool, mit dem wir den User entlasten wollen... Damit werden aus der REG und der von uns generierten INI bestimmte Werte ausgelesen und einem Tool zur Verfügung gestellt, wo der User die Möglichkeit hat einen Screenshot zu erstellen.

    Wir haben halt immer wieder das Problem, dass User ein Problem melden, aber nicht in der Lage sind, das 1. genau zu beschreiben welche Hard- und Software-Kombination sie da haben, noch in der Lage sind nach Anleitung uns diese Informationen zu beschaffen.... DAUs halt... 🙄

    So weit hab ich das Tool fertig, es fehlt halt "nur" noch das Auslesen dieses einen INI-Eintrages, aber das bekomme ich auch noch gebacken.

    Erst mal herzlichen Dank für Eure Hilfe!!! 👍



  • naja, wenn du aus der REG liest bist du ja auf Windows, sprich es würde daher doch nichts gegen GetPrivateProfileString() oder WritePrivateProfileString()
    sprechen oder? ich meine wieso dann der Aufwand?



  • Weil CE5 GetPrivateProfileString() und WritePrivateProfileString() nicht unterstützt... das ist ja das doofe!



  • ach ja, steht ja weiter oben... hmm, dann ist der aufwand berechtigt ^^
    selber arbeite ich auch grad intensiv mit ini dateien, doch hab ich das Glück
    das ganze mit der API zu erledigen =b

    wobei das von Wutz ziemlich sicher funktionieren wird, zudem ich mir vorstellen kann,
    nur schon von der beschreibung her, dass die Funktion ziemlich allgemein bzw.
    Optional gehalten wurde sprich du kannst sie verwenden da sie ziemlich sicher
    portabel ist.

    denn wie Wutz geschrieben hatte:

    Wutz schrieb:

    Funktioniert für einfache Beispiele

    [bla]
    fasel=123
    

    wie auch für kompliziertere

    [ bla ] 
      fasel  = 1 2 3
    


  • hmmm... das krieg ich einfach nicht gebacken. Irgendwo hab ich da eine persönliche Einschränkung in meinem Verständnis... oder es liegt an mangelnden Kenntnissen. Das Lösung von @wutz verstehe ich nämlich überhaupt nicht... leider 😞

    Könnt Ihr mir hier mal bitte aufs Pferd helfen?

    char toSplit[] = "Version";
        char first[100] = {0};
        char last[100] = {0};
        int position = 0;
        char* found = NULL;
    
    		if ( _wfopen( GPWini, L"r") !=0)
    			{
    			ini  = _wfopen( GPWini, L"r" );
    			while(fgetws(cText1, 2000, ini) != 0)
    				{
    				wcscpy(variable1, cText1);
    				if (wcscmp(variable1, L"[GoPal]\n\n") == 0 || wcscmp(variable1, L"[GoPal]\n") == 0 )
    					iniflag == TRUE;
    					{
        					found = strrchr( toSplit, '=' );
        					if(found != NULL)
       						{
            					position = found - toSplit + 1;
            					strncat(first,toSplit,position - 1);
            					strncat(last,toSplit+position,strlen(toSplit)-position);
        						}
    					}
    				}
        			swprintf(hStr5, L"%d", last);
    			wcscat(variable, hStr5);
    			wcscat(variable, L"\n");
    			}
    		else wcscat(variable, L"Fehler\n");
    

    Die INI sieht folgendermassen aus:

    [GoPal]
    GPVers=5.5
    Version=91940
    

    ...und ich brauche lediglich den Eintrag von Version.
    GPVers hole ich mir über eine wcscmp()Funktion... nur für wcscmp() sind das zu viele Möglichkeiten, die ich abfangen müsste.



  • Ich kriegs nicht gebacken...
    Hab beschlossen, das auszulagern in eine Textdatei. Da brauch ich nur den String einzulesen und fertig...

    Das ist zwar keine optimale Lösung, aber ich bin zu doof, einen String zu splitten. Vielleicht schaff ich das irgendwann mal...

    Danke für eure Hilfeversuche!



  • Pitter (c) schrieb:

    Ich kriegs nicht gebacken...
    Hab beschlossen, das auszulagern in eine Textdatei. Da brauch ich nur den String einzulesen und fertig...

    Das ist zwar keine optimale Lösung, aber ich bin zu doof, einen String zu splitten. Vielleicht schaff ich das irgendwann mal...

    Danke für eure Hilfeversuche!

    Ich hab' Dir doch schon gesagt, dass Du ne Lib von mir haben kannst.



  • Sorry, das hatte ich im Eifer des Gefechts garnicht mit bekommen...
    Du hast Post!

    Merci!



  • Hallo zusammen,

    mir hat das keine Ruhe gelassen, das anders hinzubekommen, also hab ich den ganzen Abschnitt noch mal neu gemacht:

    wchar_t *string = cText;
    wchar_t *string_2;
    wchar_t *state;
    
    	FILE *ini = _wfopen(GPWini, L"r");
    	if (ini)
    	{
    		iniflag = 0;
    		while (fgetws(cText, 2000, ini) != 0)
    		{
    			if (cText[0] == L';') continue;	// Kommentarzeile ignorieren
    			if (cText[0] == L'[')	// erkennen der Section
    				if (wcsncmp(cText, L"[GoPal]", 7) == 0) iniflag = 1;
    				else iniflag = 0;
    			if (iniflag > 0 && wcsncmp(cText, L"Version", 7) == 0) {
    				if (cText[7] == L'=' || 
    					((cText[7] == L' ' || cText[7] == L'\t') && cText[8] == L'=')) {	
                        wcscat(variable, &cText[9]);   // schreibe in variable					
                        wcscat(variable, L"\n"); // Zeilenumbruch
    					break;
    				}
    			}
    		}
    		fclose(ini);
    	}
    

    Das funktioniert einwandfrei und jetzt kommen noch ein paar Fehlerroutinen rein, dann habe ich fertig... 😉

    Edit:
    noch mal verfeinert... hatte es erst nicht geschnallt, warum ich den Eintrag nicht ohne token raus bekam... Anfängerfehler halt... 😉


Anmelden zum Antworten