C Problème d'allocation dynamique structure

Fermé
MaNio54 - 20 sept. 2009 à 16:47
 MaNio54 - 20 sept. 2009 à 19:07
Bonjour,
Je vous explique mes soucis, j'ai un programme qui doit récupérer les données d'un fichier csv pour les classer. Pour cela je crée N structures (N étant le nombre de catégorie présente dans le fichier csv) et ces structures possèdent chacune L lignes (L étant le nombre total de lignes présentes dans le fichier).

Pour cela j'alloue de la mémoire dynamiquement, mais j'ai un soucis car des caractères bizarres apparaissent dans certains champs (par exemple des >, des cœurs, des smileys etc..). Alors qu'il n'y a aucun de ces caractères dans le fichier d'origine.

Comment trouver et résoudre le problème ?

Voici mon code présent dans le main()

typedef struct MOTS MOTS;
struct MOTS
{
int id;
char champs[45];
};

typedef struct BDD BDD;
struct BDD
{
MOTS *mot;
};

int ligne= ouvrir_fichier("null.csv" ,texte);//recupération du nombre de lignes durant l'ouverture du fichier
int cat = comptage_categorie(texte);


BDD *structure = (BDD *)malloc (cat*sizeof(BDD));
int i,j;

for (i=0; i<cat; i++)
{
for(j=0;j<ligne;j++){
structure[i].mot = (MOTS *)malloc (sizeof(MOTS));
}
}

j=0;
int k=0,a=0,l=0;

while(texte[a] != '\n')//boucle pour ignorer la première ligne
{
a++;
}

for(i=a+1;i<strlen(texte);i++)
{
if(isalnum(texte[i]))
{
structure[k].mot[l].champs[j] = texte[i];//si le caractère est une lettre ou un chiffre il est stocké
j++;
}
else if(texte[i] == ',')
{
j=0;//si c'est une virgule, on change de catégorie
k++;
}
else if(texte[i]== '\n')
{
l++;// si c'est un retour à la ligne changement de ligne et retour à la premiere catégorie
j=0;
k=0;
}
}
A voir également:

2 réponses

Bonjour

Tu oublies de mettre un caractère nul à la fin de tes mots. If faudrait le faire chaque fois que tu détectes la virgule ou la fin de ligne :

else if(texte[i] == ',')
{
structure[k].mot[l].champs[j]=0; // caractère nul à la fin d'un mot
j=0;//si c'est une virgule, on change de catégorie
k++;
}
else if(texte[i]== '\n')
{
structure[k].mot[l].champs[j]=0; // caractère nul à la fin d'un mot
l++;// si c'est un retour à la ligne changement de ligne et retour à la premiere catégorie
j=0;
k=0;
}
0
Merci beaucoup pour votre solution. Cela marche impeccable :)

Bonne soirée
0