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() ?
Partager