Bonsoir,
J'ai un fichier contient deux champs: objet et attribut nommé "exemple.txt" :

2 11
4 11
10 10
5 O1
.....
.....

Sachant que on a la même taille pour tous les attributs de tous les objets dans notre exemple on a la taille = 2.
Cette taille peut changer d'un exemple à l'autre donc on ne connait pas la taille d'attribut en avance.

Je voudrais calculer la taille de l'attribut puis vérifier si on dans ce fichier si on a au moins un objet qui possède un attribut tout à 1 c'est à dire la chaine "11" dans notre cas.
la fonction verifier() nous retourne 1 si il existe la chaine "11" sinon O.

Voici mon essai :


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int verifier(int taille)
{
FILE *fp;
char *chaine,s[100],attribut[32];
int i,trouve=0,objet=0;
chaine = (char *) malloc(taille);
for(i=0; i < taille; i++)
chaine[i]='1';
chaine[taille]='\0';
printf("chaine=%s\n",chaine);
pFTrie = fopen("exemple.txt","r");
while (fgets(s, 100, fp))
{
sscanf(s,"%d%s",objet,attribut);
if(memcmp(attribut,chaine,taille))
{
free(chaine);
fclose(fp);
return 1;
}
}
free(chaine);
fclose(fp);
return 0;
}
 
int main()
{
FILE *fp;
int trouve=0,taille;
fp=fopen("exemple.txt");
While (fgets(s,100,fp))
sscanf(s,"%d%s",&objet,attribut);
taille=strlen(attribut);
trouve = verifier(taille);
printf("valeur de retour %d\n",trouve);
 
return 0;
}

Mais, le message suivant n'affiche pas:
printf("valeur de retour %d\n",trouve);

-Pourquoi ?

lorsque je lance l'exécution après la compilation j'ai le message suivant:
HEAP CORRUPTION DETECTED : after normal (#95) at 0*01020068.
CRT detected that the application wrote to memory after end of heap buffer.



Ceci à cause d 'instruction free chaine(); dans la fonction verifier () car je supprime cette instruction donc l'exection se passe.
Mais, comment on va liberer l'espace dynamique louée par chaine[taille] ?
- l'allocation et la libération de l'espace dynamique char *chaine est bien définie ?
- Existe-t-il le type boolean comme un type des données ? comment le déclare ?
- On peut utiliser le type boolean comme valeur de retour pour la fonction verifier() ?