Problem mit GetPrivatProfileString



  • Hallo zusammen,

    ich möchte aus einer INI bestimmte Werte abfragen. Das Problem dabei ist, dass diese als String abgefragt werden müssen (denke ich zumindest, lasse mich gerne eines besseren belehren). Die INI ist folgendermaßen aufgebaut:

    [TimeData_1]
    1= 0,0.29,0,0, ,0,0
    3= 0,0.69,0,0, ,0,0
    etc.
    

    Ich brauche jetzt nur die Werte 0.29/0.69 undsoweiter, die ganzen 0, Kommas und Leerzeichen sind nicht wichtig. Abfragen tu ich das ganze folgendermaßen:

     char Key[200];
       
      GetPrivateProfileString("timedata_1", "1", NULL, Key, sizeof(Key), "C:1_0.ini");
    
    

    Hier müsste ja jetzt ein Char-Array Key=['0', ',', '0','.','2',....] angelegt sein. Um die überflüssigen Werte zu löschen mache ich folgendes:

      char str2[200];
      int j=0;
      for(uint i=0; i<=strlen(Key); i++){
    	
    	if(Key[i]!=','||Key[i]!=' ')
    	{
    		str2[j]=Key[i];
    		j++;
    	}
        
      }
    
    

    Nun dürften ja nur noch die vielen Nullen und zwischendrin die gesuchte Zahl, zb 0.29, im char sein. Das ganze brauche ich jetzt allerdings noch als integer. Wie mache ich das? Oder stimmt mein bisheriger Code überhaupt?
    Vielen Dank schonmal


  • Mod

    0.29 als Integer?

    Ansonsten: sscanf statt eigenem Stringparsing.



  • @SeppJ Ja ich brauche 0.29 als integer. WIe genau mach ich das mit sscanf? ich wandle dann den abgefragten char in einen string um und gebe diesen in die sscanf ein? oder kann ich direkt den Key-Chararray eingeben?


  • Mod

    Du redest wirr, daher kann man deine Fragen nicht beantworten. Datentypen funktionieren nicht so, wie du denkst.

    Wie soll 0.29 als Ganzzahl gehen? Du fragst keinen char ab, denn ein char[200] ist kein char. Was ist deiner Meinung nach ein String?



  • @SeppJ Ja keine Ahnung wo mein Problem ist..

    Okey aus irgendeinem Grund war ich der festen Überzeugung dass man mit int auch Kommazahlen nutzen kann?:D

    Nochmal mein Vorgehen:

    Ich frage ja aus der INI ab und bekomme da einen String.
    Da müssen nun die unnötigen Zeichen gelöscht werden.
    Das, was übrig bleibt kann ich aber nicht als String weiterverwenden, sondern brauche das als "Zahl" da das als Länge in einer GUI weiterverwendet wird, dann eben als Double.

    Das was ich bisher geschrieben habe müsste mir ja in str2 die 0.29 wiedergeben oder? Und wenn nicht, was dann und wieso?
    Und diesen Wert brauche ich dann eben als Kommazahl um diesen weiterzuverarbeiten.

    Bzw vergessen wir alles vorherig Programmierte. Ich frage jetzt den Wert des Keys "1" mit obiger GetPrivateProfileString ab. Was bekomme ich da?



  • @bla1027 sagte in Problem mit GetPrivatProfileString:

    "C:1_0.ini"

    Das ist bestimmt kein gültiger Pfad. GetPrivateProfileString liefert als return die Information ob der Aufruf geklappt hat oder nicht und im Fehlerfall eine fehlercode.
    Siehe auch: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofilestring


  • Mod

    Die Antwort, wie man am besten Zahlen (oder allgemein jede Information) aus Zeichenketten bekommt ist nach wie vor sscanf. Zu benutzen ist das genauso wie scanf (mit dem du vertraut sein solltest), bloß dass die Eingabe halt aus einem String kommt. Es setzt aber natürlich ein gewisses Grundverständnis von C-Datentypen und -Strukturen voraus, das die derzeit noch zu fehlen scheint. Vielleicht solltest du die ersten paar Kapitel deines Lehrbuchs noch einmal wiederholen?



  • @firefly Das war der übersichtlichkeit halber abgekürzt;)

    Hab das Problem aber auch gelöst, ich hab einfach aufm Schlauch gestanden..



  • @firefly sagte in Problem mit GetPrivatProfileString:

    @bla1027 sagte in Problem mit GetPrivatProfileString:

    "C:1_0.ini"

    Das ist bestimmt kein gültiger Pfad.

    IIRC ist das sogar ein gültiger Pfad. Er benennt ein File namens 1_0.ini im aktuellen Verzeichnis des Laufwerks C:.

    So hat man früher in DOS gearbeitet. z.B. kopieren von allen Files in D: (ohne Unterverzeichnisse) nach E:\backup

    C:\> E:
    E:\> md backup
    E:\> cd backup
    E:\backup> D:
    D:\> copy *.* E:
    

    Hat funktioniert, weil DOS sich das aktuelle Verzeichnis pro Laufwerk gemerkt hat. Das war praktisch, weil man beim Arbeiten mit verschiedenen Laufwerken nicht immer das Unterverzeichnis wiederholen musste. Und soweit ich weiss ist das auch bei Windows 10 noch so. Funktioniert zumindest in cmd.exe noch genau so. Und ich meine mich zu erinnern dass das keine Magic von cmd.exe ist sondern wirklich im Win32 Subsystem noch so gehandhabt wird. D.h. solche Pfade funktionieren auch in ganz normalen Win32 Subsystem Calls.

    google-google-google

    Steht auch hier noch so beschrieben: https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats

    C:Projects\apilibrary\apilibrary.sln -- A relative path from the current directory of the C: drive.


Anmelden zum Antworten