Strtok problem

emmy_2019 Messages postés 59 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai un petit soucis avec la fonction strtok:

j'ai un fichier Config.ini(sur WinCE je n'ai pas trouvé des fonction pour le parser et du coup j'utilises l''alogorithme normal pour la lecture d'un fichier)

fichier:
;-----
;Fichier de configuration des adresses IP pour le compteur IRIS(CONFIG_IP_IRIS.ini)
;----
[IRIS]
Adrr_CALC=192.168.0.95
Addr_TCP_IRMA1=192.168.0.132
Addr_TCP_IRMA2="192.168.0.131
Addr_TCP_IRMA3=192.168.0.132 
-


code source:

ip_adress_t cpiris_lecture_config_ip(ip_adress_t adress)
{
	char tmp[512];
	wchar_t file_name[512];
	FILE *file_id;
	char * token=NULL;

	//le path de fichier CONFIG_IP_IRIS.ini
	swprintf(file_name, L"%S%S", path_commun, CONFIG_IP_IRIS);
	//wprintf(L"File_Name = %s  \n", file_name);
	//Ouverture du fichier
	if((_wfopen_s(&file_id, file_name, L"r")) != 0)
	{
		 /* obtenir le code d'erreur */
		 DWORD error_id = GetLastError();
		send_log("cpiris_lecture_config_ip failed: with error code %lu\n", error_id);
	}
	else
	{
		//Lecture du fichier ligne par ligne et remplissage de structure 
		while(fgets(tmp, sizeof(tmp), file_id) != NULL)
		{

			send_log("cpiris_lecture_config_ip tmp is %s\n", tmp);
			if((strstr(tmp, "Adrr_CALC")) != NULL)
			{
				token = strtok(tmp, "Adrr_CALC=");
				send_log("cpiris_lecture_config_ip tmp cal is %s\n", token);
				strcpy(adress.ip_calc,token);
			}
			else if((strstr(tmp, "Addr_TCP_IRMA1=")) != NULL)
			{
				//send_log("cpiris_lecture_config_ip tmp1 is %s\n", tmp);
				token = strtok(tmp, "Addr_TCP_IRMA1=");
				send_log("cpiris_lecture_config_ip tmp 1 is %s\n", token);
				strcpy(adress.ip_irma_1,token);
			}
		
		
		}
	}
	fclose(file_id);
	//send_log("cpiris_lecture_config_ip adress.ip_calc is %s ip_irma_1=%s, ip_irma_2=%s, ip_irma_3=%s\n", adress.ip_calc, adress.ip_irma_1, adress.ip_irma_2, adress.ip_irma_3);
	return adress;
	
}



Resultat:
cpiris_lecture_config_ip tmp cal is 192.168.0.95

- cpiris_lecture_config_ip tmp is Addr_TCP_IRMA1=192.168.0.130

cpiris_lecture_config_ip tmp 1 is 92.
- cpiris_lecture_config_ip tmp is Addr_TCP_IRMA2=192.168.0.131

- cpiris_lecture_config_ip tmp 2 is 19
cpiris_lecture_config_ip tmp is Addr_TCP_IRMA3=192.168.0.132


cpiris_lecture_config_ip tmp 3 is 192.168.0.1


Avez-vous une idée pourquoi j'ai eu 92.(pour 192.168.0.130) , 19(pour 192.168.0.132) et 192.168.0.1(pour 192.168.0.132)?
Je vous remercie par avance.



Configuration: Windows / Chrome 75.0.3770.100

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut emmy_2019,

Ce n'est pas comme cela que l'on se sert de
strtok()
:

http://www.cplusplus.com/reference/cstring/strtok/

et je ne l'utiliserai pas personnellement dans ton cas.

Il te suffit d'utiliser
strstr()
, qui va renvoyer le pointeur vers l'endroit où se trouve la sous-chaîne qui correspond à ta recherche et d'y ajouter la longueur de ta sous-chaîne pour te positionner au char suivant.

Voilà un exemple :

#include <stdio.h>
#include <string.h>

int main(void) {
    char * st = "Adrr_CALC=192.168.0.95";
    char * found = NULL;

    if ((found = strstr(st, "Adrr_CALC="))) {
        found = found + strlen("Adrr_CALC=");
        printf("value is: %s\n", found);
    }

    return 0;
}

qui donne :

$ gcc -Wall 36090951.c
$ ./a.out 
value is: 192.168.0.95

Sinon, pour parser un fichier .ini, il y a cette fonction dédiée de l'API Windows, qui est en legacy car elle était utilisée par les systèmes 16 bits avant l'apparition du registre Windows.

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofilestring

Si elle existe sur ton WinCE, tu devrais sans doutes l’utiliser.

Dal
0
emmy_2019 Messages postés 59 Date d'inscription   Statut Membre Dernière intervention  
 
Merci Dal je vais essayé ta solution
malheureusement cela n'existait pas sur WinCe 6.0 j'ai eu une erreur fonction non définie
0
emmy_2019 Messages postés 59 Date d'inscription   Statut Membre Dernière intervention  
 
Dal stp je récupère la chaine mais à la fin il y'a un catère de retour à la ligne que je vois ce n'est pas normale puisque je vais utiliser cette adresse dans une requête http
As-tu une idée pour enlever tout chariot stp?
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
OK, de rien.

Dans ton cas, vu que tes données viennent d'un fichier, tu auras des retours à la ligne
\n
dans les données lues par
fgets()
.

Si tu n'en veux pas, tu peux les supprimer en en cherchant l'existence avec
strchr()
et en terminant la chaîne à cet endroit.

Cela donne ceci dans mon code d'exemple :

#include <stdio.h>
#include <string.h>

int main(void) {
    char st[] = "Adrr_CALC=192.168.0.95\n";
    char * found = NULL;                                                        

    if ((found = strstr(st, "Adrr_CALC="))) {
        found = found + strlen("Adrr_CALC=");

        /* remove trailing \n if it is there */
        char * newline = NULL;
        if ((newline = strchr(found, '\n')))
            *newline = '\0';

        printf("value is: [%s]\n", found);
    }

    return 0;
}
0