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 -
[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:
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 :