kommandozeilen programm, strings etc.
-
Hallo, ich bin neu hier und hoffe sowohl helfen zu können, als auch ein wenig Hilfe zu empfangen

mein problem ist folgendes. Ich habe eine gegebene Ini-Datei, deren Inhalt wie folgt aussieht:
keyA = Wert1 blu = blae gebraucht = tollnatürlich noch viel mehr mögliche Zeilen.
jetzt habe ich ein Programm geschrieben, dass diese Schlüssel und Werte (was sie darstellen sollen) voneinander trennt und getrennt ausgibt. das klappt auch wunderbar, jedoch möchte ich nun dem Nutzer eine Eingabemöglichkeit verschaffen, und zwar soll er sich einen Schlüssel aussuchen und das Programm gibt den dazugehörigen Wert aus und da hänge ich zurzeit.
mein code bisher:
void split (char* pInput,char* pOut1,char* pOut2) { const char*p = strchr (pInput, '='); char *p2; if (!p) { *pOut1 = '\0'; *pOut2 = '\0'; } else { strncpy (pOut1, pInput, p - pInput); pOut1[p - pInput] = 0; strcpy (pOut2, p + 1); if (strlen(pOut2)) { p2 = &pOut2[strlen(pOut2) - 1]; while (p2 >= pOut2) { if ((*p2 == '\n') || (*p2 == ' ') || (*p2 == '\t')) { *p2 = 0; } else { break; } p2--; } } } } int main(int argc, char **argv) { char buf[BUFSIZ]; FILE * pFile; char mystring [BUFSIZ]; char s1[BUFSIZ], s2[BUFSIZ]; pFile = fopen ("cdplayer.ini" , "r"); if (pFile == NULL) perror ("Error opening file"); else { while (!feof(pFile)) { fgets (mystring, BUFSIZ , pFile); split(mystring,s1,s2); if (*s1) { printf("Schluessel:\n%s\nWert:\n%s\n\n",s1,s2); } //puts (mystring); } } printf ("Schluessel eingeben:\n"); if (0 == fgets(buf, BUFSIZ, stdin)) { perror("Fehler bei fgets"); exit(1); } fclose(pFile); return 0; }hat jemand eine Idee wie ich das realisieren kann?
später einmal wird das zu einem socketprogramm, wo der client ein Telegramm erhält und in der Ini-Datei vorgefertigte Antworten auf das Telegramm findet und die richtige zurücksendet.danke im voraus

-
Inqui schrieb:
hat jemand eine Idee wie ich das realisieren kann?
ja, ich. soll ich es dir auch sagen wie?
Spaß beiseite, am besten du speicherst dir die Key-Values in einem Baum. Eine INI File kann ja so aussehen:
# gloable section mit Namen "" key1 = va11 key2 = val2 ... [SECTION 1] key1 = val3 key2 = 9 [SECTION 2] key1 = 88 key2 ...Du kannnst dann einen B-Tree aufbauen, wo die Blätter die Sections sind und der Inhalt der Blätter Listen von Key-Pairs. Du kannst dann mit Tree-Operationen dich im Baum bewegen.
Es ist nicht schwer, aber wenn man diesen Weg nimmt, kann auch viel Arbeit kosten. Du könntest auch die GLIB nehmen, dort gibt Key-Value file parser, damit kannst du genau das machen, was du willst und musst dich nicht ums parsen kümmern.
-
benutzt du windoofs? wenn ja, da gibt's fertige funktionen für sowas.

-
ja, ich benutze windows.
welche funktionen meinst du?
danke schonmal an supertux soweit

die ini-dateien sind allerdings vorgegeben und beinhalten keine sections
-
-
hm, funktioniert soweit das programm aus deinem link, aber wie kann ich das jetzt sinnvoll auf meine ini-datei anwenden (natürlich nur das getString, nicht das writeString)?
dieser pfad zur registry ist irgendwie auch verwirrend...
-
GetProfileString ?
-
Inqui schrieb:
hm, funktioniert soweit das programm aus deinem link, aber wie kann ich das jetzt sinnvoll auf meine ini-datei anwenden (natürlich nur das getString, nicht das writeString)?
steht doch da. das letzte argument der funktion ist der pfad zu deiner ini-datei.
Inqui schrieb:
dieser pfad zur registry ist irgendwie auch verwirrend...
naja, mit den funktionen kann man auch reg-entries schreiben. das kannste aber ignorieren.

-
ah,ok.
ich hatte da probeweise schonmal meinen pfad eingegeben, aber hatte nicht geklappt. ich versuchs montag nochmal und geb dann feedback, vielen dank soweit schonmal
-
Korrektur:
Die WinAPi-Funktion ist GetPrivateProfileString!
Wenn man das Private weglässt, wirdx das ganze in die Registry gemappt (ursprünglich, bei älteren Win-Versionen wurde das in die Win.ini eingetragen, glaub ich)Ich hätt dazu dennoch eine Frage:
wie kann ich die gloabele Section aus der Ini-File auslesen/schreiben?
Gibt es die überhaupt bei Windows ini-Files?DWORD GetPrivateProfileString( LPCTSTR lpAppName, // points to section name LPCTSTR lpKeyName, // points to key name LPCTSTR lpDefault, // points to default string LPTSTR lpReturnedString, // points to destination buffer DWORD nSize, // size of destination buffer LPCTSTR lpFileName // points to initialization filename ); BOOL WritePrivateProfileString( LPCTSTR lpAppName, // pointer to section name LPCTSTR lpKeyName, // pointer to key name LPCTSTR lpString, // pointer to string to add LPCTSTR lpFileName // pointer to initialization filename );Was muss ich da beim ersten Parameter angeben? NULL funktioniert nicht, da schreibt die Funktion alle Section-names in den Puffer.
-
also nach wie vor komme ich nicht zur richtigen ini-datei in meinem verzeichnis...
z:\tools\testprog
wäre das richtige, aber
GetPrivateProfileString (TEXT("Section1"), TEXT("FirstKey"), TEXT("Error: GPPS failed"), inBuf, 80, TEXT("z:\tools\testprog\append.ini")); printf (TEXT("Key: %s\n"), inBuf);führt nicht zum gewünschten ergebnis...
kann mir jemand weiterhelfen? danke

-
GetPrivateProfileString (TEXT("Section1"), TEXT("keyA"), TEXT("Error: GPPS failed"), inBuf, 80, TEXT("D:\\User\\Pompetzki\\tools\\testprog\\cdplayer.ini")); printf (TEXT("Wert: %s\n"), inBuf);doppelter backshlash ist die lösung
