Advertisement
AntonioVillanueva

Parser dict {key}:{value} fichero externo

Jan 24th, 2023
1,118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.08 KB | None | 0 0
  1. /*Antonio Villanueva Segura
  2. * on a un fichier externe type {key}:{value} \n
  3. * p.e
  4. * LOGIN :axiome
  5. * PASWORD:concept
  6. * {key}:{value}
  7. *
  8. * Tout d'abord  on filtre les caractères indésirables space,tabulations ..filter(char *str)
  9. * et nous voulons filtrer pour récupérer les clés{KEY} et les valeurs{VALUE}
  10. * Ensuite, on peut demander  getValue(char *ligne) && getKey(char *ligne) dans chaque ligne
  11. */
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. //Fichier avec structure de dictionnaire {key}:{value}
  17. #define FICHIER "data.txt"
  18. #define LONGUEUR_MAX 64 //Longueur maximale d'une ligne à lire
  19.  
  20. //Structure de base type dictionnaire
  21. struct dict{
  22.     char key[64];
  23.     char value[64];
  24. };
  25.  
  26. char* isCommentaire(char *src){
  27. // La ligne doit contenir deux points pour être de type {key} :{value}
  28. // et une longueur minimale key:value a:1 == strlen -> 3   
  29.     if (strlen(src)<3 ){return NULL;}
  30.     return strrchr (src,':');
  31. }
  32.  
  33. void filter(char *str){
  34.     //Filtrer les caractères inférieurs à l'espace
  35.     if ( isCommentaire (str) == NULL){
  36.         *str='\0';
  37.         return;
  38.     }
  39.     char* src = str;
  40.     char* dst = str;
  41.  
  42.     while (*src != '\0') {//n'a pas atteint la fin ?
  43.  
  44.         if (*src >0x20) {//Filter caractères inferieurs à l'espace 0x20
  45.           *dst = *src;
  46.           dst++;
  47.         }
  48.         src++;//src en dernière position
  49.     }
  50.     *dst = '\0';//ajoute fin de chaîne
  51.     src=dst;
  52.    
  53. }
  54.  
  55. char* getValue(char *ligne,char *dst){
  56.     //Dans un système {key}:{value} renvoie "value" ...et dst
  57.     if (strlen(ligne)<3 && ligne!=NULL){return NULL;}
  58.     char *src=strchr ( ligne , ':' );//commence après le côlon   
  59.     src++;//:
  60.     while (( *src != '\0') && (*src != '\n')){
  61.         *dst = *src;//copie le contenu de src vers dst
  62.         dst++;
  63.         src++;
  64.     }
  65.  
  66.     //*dst='\0';
  67.     *dst=0;
  68.     return dst;
  69. }
  70.  
  71. char* getKey(char *ligne,char *dst){
  72.     //Dans un système {key}:{value} renvoie "key" ..et dst
  73.     if (strlen(ligne)<3 && ligne!=NULL){return NULL;}
  74.     char *src=ligne;
  75.     while ((*src != ':') && ( *src != '\0') && (*src != '\n')){
  76.         *dst = *src;
  77.         dst++;
  78.         src++;
  79.     }
  80.  
  81.     //*dst='\0';
  82.     *dst=0;    
  83.     return dst;
  84. }
  85.  
  86. void printDict (struct dict *ptr,int longueur){
  87.     //Imprime le tableau de type de dictionnaire {key}:{value}
  88.     for (int i=0;i<longueur;i++){          
  89.         printf ("%d {key} %s = %s {value} \n",i,ptr->key, ptr->value);
  90.         ptr++;
  91.     }
  92. }
  93.  
  94.  
  95. int main() {
  96.    
  97.     FILE *fptr;
  98.        
  99.     int lignes=0;//nombre de lignes avec information  {key}:{value}
  100.     char ligne[LONGUEUR_MAX]; //Ligne lue depuis le fichier externe
  101.     char key[64];//chaîne temporaire pour lire une clé {key}
  102.     char value[64];//chaîne temporaire pour lire un valeur {value}
  103.  
  104.    
  105.     //Ouverture du fichier
  106.     if( (fptr = fopen(FICHIER,"r")) == NULL)//ouvrir le fichier en lecture
  107.     {
  108.       printf("Error! %s",FICHIER);  
  109.       exit(1);            
  110.     }  
  111.    
  112.    
  113.     //Analyse des nombres des lignes de dictionnaire
  114.     while (fgets(ligne, LONGUEUR_MAX, fptr)){ //lire une ligne 
  115.         filter(ligne);
  116.         if (strrchr (ligne,':')!=NULL){lignes++;}
  117.     }
  118.    
  119.    
  120.     struct dict base[lignes];//Crée le dictionnaire
  121.    
  122.     //printf ("Nombre de lignes %d" ,lignes);//DEBUG nombre de lignes
  123.     rewind(fptr);//Rembobiner le fichier
  124.  
  125.    
  126.     int index=0;    
  127.     while (fgets(ligne, LONGUEUR_MAX, fptr)){ //lire une ligne 
  128.        
  129.         filter(ligne);//Nettoyage ligne spaces,tabs ,commentaires .. etc
  130.        
  131.         if (strrchr (ligne,':')!=NULL){//C'est une ligne de type {key} :{value} ?
  132.            
  133.             //memset(key,0,strlen(key));//key[0]='\0' RESET
  134.             //memset(value,0,strlen(value));//value[0]='\0'
  135.  
  136.             //Get {Key}: {value}
  137.             getKey(ligne,(char *)&key);
  138.             getValue(ligne,(char *) &value);
  139.            
  140.            
  141.             //memset(base[index].key,0,64);//key[0]='\0'
  142.             //memset(base[index].value,0,64);//value[0]='\0'               
  143.                    
  144.             //Copie la clé{key} et la valeur{value} dans la structure
  145.             strcpy (base[index].key, key);  //memcpy(dest, org ,strlen(org));  
  146.             strcpy (base[index].value, value);//memcpy(dest, org ,strlen(org));        
  147.  
  148.             index++;//Nouvel index dans la structure du dictionnaire   
  149.         }
  150.    
  151.     }
  152.    
  153.    
  154.     printf ("Num. lignes %d \n",lignes);
  155.     printDict (base,lignes);
  156.    
  157.     fclose(fptr);//fermeture FICHIER    
  158.     return EXIT_SUCCESS;
  159. }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement