Sehr simple INI-File lesen
-
Noch eine letzte Frage: Als zweites lese ich eine IP-Adresse (als Wert) mit aus der ini und speichere diesen mit strcpy(server_ip, p+1); in server_ip ab. Jetzt kommt es aber das server_ip (ein 16-byte-char-array) länger ist als die gelesene IP-Adresse. Wie stell ich es an an der richtigen stelle ein \0 einzufügen?
-
darum kümmert sich strcpy. Du musst nur darauf achten das man nicht mehr in server_ip reinkopieren kann, als in server_ip-Platz ist
-
lolz schrieb:
Für INI-Files ist boost::spirit ja schon (fast) overkill.
'boost' ist *immer* overkill, das zeug ist >600MB. stimmt das?
-
Hallo
Ich liebe einfach deine objektiven und ergebnisoffenen Antworten.
chrische
-
chrische5 schrieb:
Ich liebe einfach deine objektiven und ergebnisoffenen Antworten.
es war eine frage
-
pale dog schrieb:
lolz schrieb:
Für INI-Files ist boost::spirit ja schon (fast) overkill.
'boost' ist *immer* overkill, das zeug ist >600MB. stimmt das?
Bei Boost nimmt man ja eh nur das was man braucht.
-
Hallo
pale dog schrieb:
chrische5 schrieb:
Ich liebe einfach deine objektiven und ergebnisoffenen Antworten.
es war eine frage
Sorry, habe ich erst später gesehen. Obwohl sie auch wirklich provokativ gestellt war.
chrische
-
rüdiger schrieb:
darum kümmert sich strcpy. Du musst nur darauf achten das man nicht mehr in server_ip reinkopieren kann, als in server_ip-Platz ist
Ich benutze ja strcpy! Trotzdem ist bei der Ausgabe von server_ip ein Noten-Symbol und ein \n am Ende der Zeile.
Datei:
; Check the README for explanations on what the settings do
default_wlan_connection=1
default_server_ip=192.168.0.124
connect_on_startup=1Code:
pINIfile = fopen("settings.ini" , "r"); while(fgets(iniLineBuffer, sizeof iniLineBuffer, pINIfile) != NULL) { if(iniLineBuffer[0] == ';') { printf("Comment-line!\n"); } else { valueDelimiter = strchr(iniLineBuffer, '='); if(!valueDelimiter) { iniError = 1; continue; } *valueDelimiter = '\0'; if(strcmp(iniLineBuffer, "default_wlan_connection") == 0) { wlan_setting = atoi(valueDelimiter+1); printf("WLAN-Connection: %d\n", wlan_setting); } else if(strcmp(iniLineBuffer, "default_server_ip") == 0) { strcpy(server_ip, valueDelimiter+1); // Geht nicht ganz printf("Server-IP: %s\n", server_ip); } else if(strcmp(iniLineBuffer, "connect_on_startup") == 0) { connect_on_startup = atoi(valueDelimiter+1); printf("Auto-Connect: %d\n", connect_on_startup); } } } fclose(pINIfile);
Ausgabe:
Comment-line!
WLAN-Connection: 1
Server-IP: 192.168.0.124♪Auto-Connect: 1
-
Dieses "♪\n" ist ganz sicher ein "\r\n". Gibt es dafür in C (nicht++) nich ein trim oder so?
-
Wie gesagt. Ein String hört in C auf, sobald ein \0 gefunden wird...
-
Ich hab versucht die (womöglichen newlines und carriage-returns) manuell zu entfernen (auch wenn ich die lösung unschön finde), mit
[...] *valueDelimiter = '\0'; iniValue = valueDelimiter+1; if(strcmp(iniLineBuffer, "default_server_ip") == 0) { if(iniValue[sizeof(iniValue)] == '\n') iniValue[sizeof(iniValue)] = '\0'; if(iniValue[sizeof(iniValue)] == '\r') iniValue[sizeof(iniValue)] = '\0'; strcpy(server_ip, iniValue); printf("Server-IP: %s\n", server_ip); }
aber das funktioniert auch nicht. Kann ich da sizeof nicht so anwenden, bzw muss ich bei
iniValue = valueDelimiter+1;
richtig
*iniValue = valueDelimiter+1;
machen (ne, oder)?
Gibt es denn keine richtige trim-funktion?
-
sizeof() liefert die vorreservierte Größe des Arrays - und 'x[sizeof(x)]' liegt mit Sicherheit außerhalb des reservierten Bereiches. Das letzte Zeichen des tatsächlich eingetragenen Strings erreichst du mit 'x[strlen(x)-1]'.
-
Jo, funktioniert, danke.