Strtok problem
emmy_2019
Messages postés
63
Statut
Membre
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
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:
code source:
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.
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
Salut emmy_2019,
Ce n'est pas comme cela que l'on se sert de
http://www.cplusplus.com/reference/cstring/strtok/
et je ne l'utiliserai pas personnellement dans ton cas.
Il te suffit d'utiliser
Voilà un exemple :
qui donne :
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
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
malheureusement cela n'existait pas sur WinCe 6.0 j'ai eu une erreur fonction non définie
As-tu une idée pour enlever tout chariot stp?
Dans ton cas, vu que tes données viennent d'un fichier, tu auras des retours à la ligne dans les données lues par .
Si tu n'en veux pas, tu peux les supprimer en en cherchant l'existence avec 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; }