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=1

    Code:

    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.


Anmelden zum Antworten