Bonsoir tout le monde,
je suis en train d'écrire un prog qui .... je vois pas trop comment expliquer
En gros je bosse dans un société qui manipule à longueur de journée des fichiers sur des machines Linux. Nous développons tous nos softs en interne (tri, dédup...)
Quelqu'un de chez nous à developper qq chose qui nous permet de nommer les champs d'un fichier texte comme on le fait sur un fichier dbase ou une base de donnée.
cela nous permet de dire : tri le fichier sur le champ nomDeFamille au lieu de dire tri le fichier sur le champ 34.
Ca c'était pour la petite histoire.

Je suis en train d'écrire un truc qui va permettre "d'utiliser des alias de nom".
Cela permettra au programme de dire que les champs nom et nomDeFamille représente la même chose.

L'idée est de stocker dans un tableau de structure les couples source->destination.
Malheureusement chez moi, pointeur rime avec "mais qu'elle horeur". J'ai un mal de chien avec ce truc. Si bien que les copies de valeurs que je fais dans le programme ci dessous ne donnent pas le résultat attendu.

voici le source avec un max de commentaire

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
int flagtrace=0;
#include "config.c"
#include "signatur.c"
#include "structure.cpp"

#define MAXALIAS 512
 
struct salias {
	char *de;
	char *vers;
	} listeAlias;

int main(int argc, char *argv[]){	

	// utilisés pour la table d'alias 
	FILE	*falias;
	char	ligne[512]; //stocke la ligne en cours de lecture
	char 	*nomFicAlias;  // Nom du fichier contenant les alias
	char	*p, *separChampAlias, *separVal, *destAlias;
	char	*cleanSrc, *cleanDst; // utilisé pour nettoyer les noms

	int i,j,l,lgclean;
	int nbligneAlias;
	
	separChampAlias="="; // Séparateur de=>vers dans le fichier alias
	separVal=",";  // Séparateur de valeurs dans fichier alias.
	cleanSrc="ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöùúûüýÿ"; // utile pour supprimer les accents dans les noms de destinations.
	cleanDst="AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy"; // les caractères du dessus seront remplacés par ceci.
	lgclean=strlen(cleanSrc); 

	for (i=1;i<argc;i++) {
		p=argv[i];
		if (strncmp(p,"alias=",6)==0)
			nomFicAlias=p+6;
	}

	salias listeAlias[MAXALIAS];
	nbligneAlias=0;
	lgclean=strlen(cleanSrc); 
	
	falias=fopen(nomFicAlias,"r");
	while (fgets(ligne,sizeof(ligne),falias)) {
		if (nbligneAlias>=MAXALIAS){
			tracemsg(ERREUR,"Nombre d'alias trop important. Valeur max=%i.\n",MAXALIAS);
			return(1);
		}
		i=strlen(ligne)-1; ligne[i]=0; //suppression du caracatére de fin de ligne 
		
		/* On sépare nom de destination et la liste de sources
		   A ce moment, on se retrouve avec d'une part 
		  le nom de destination,
		  et d'autre part, la liste des noms(séparés par une virgule) qui prendront cette valeurs 
		*/
		p=strtok(ligne, separChampAlias);
		destAlias=p; //On stocke temporairement le nom de destination car il peut etre utilisé plusieur fois . A mon avis, c'est pas la bonne facon de faire.
		// Petit nettoyage du nom de destination. prénom devient prenom
		i=strlen(destAlias);
		for (j=0;j<i;j++){
			for (l=0;l<lgclean; l++){
				if (destAlias[j]==cleanSrc[l])
					destAlias[j]=cleanDst[l];
			}
		}
			
		/* et on prend toutes les valeurs source possibles qui seront stocké dans le membre listeAlias[].de
		on prodruit un couple de et vers pour chaque valeur source. Soit   prenom=pren,prenomType donneront 2 éléments
		*/
		while (p!=NULL){	
			p=strtok(NULL, separVal);
			if (p!=NULL){
				listeAlias[nbligneAlias].vers= destAlias; // ceci doit etre faux
				listeAlias[nbligneAlias].de=p; //ceci aussi 
				tracemsg(TRACE,"le champ '%s' devient '%s'.\n",listeAlias[nbligneAlias].de,listeAlias[nbligneAlias].vers );
				nbligneAlias++;
			}
		}
	}
	
	for (i=0; i<nbligneAlias;i++){
		tracemsg(TRACE,"%s = %s\n ",listeAlias[i].de,listeAlias[i].vers); // ici c'est pas beau comme resultat :(
	}
}

le programme prend en l'argument alias=fichieralias

le fichier alias contient ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
adr1=adresse1,adresse
rs1=raisonsociale1,etp1
nomFamille=nom

J'ai mis en gras les parties que je pense fause.

L'execution me donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
htristra@leo:~/test$ /exec/Linux.i686/alfa/testrv2 alias=ficalias
le champ 'raisonsociale' devient 'rkkkks1'.
le champ 'rs' devient 'rkkkks1'.
le champ 'raisonsociale2' devient 'rs2i'.
le champ 'etp2' devient 'rs2i'.
le champ 'nom' devient 'nomFamille'.
le = nomFamille
 p2 = nomFamille
 mille = nomFamille
 etp2 = nomFamille
 nom = nomFamille
A mon avis, ca plante car j'attribue un pointeur (ou son adresse plutot) à un tableau de char. Je pense que c'est pour cela que les premiers echo sont bon (pas encore de modif de p) et que les 5 dernieres lignes affiche toutes nomFamille (elles pointent tous vers la meme adresse)

J'ai essayé le memcpy pour copier la valeur mais cela me donne une superbe "erreur de segmentation" .

Si quelqu'un pouvait m'expliquer la bonne facon de copier la valeur de ce fichu p dans listeAlias[].de et listeAlias[].vers, ce serait merveilleux.


Merci d'avance et bon week-end