Problème avec "fclose" [Résolu]

Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 6 juil. 2006 à 17:33 - Dernière réponse : Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention
- 31 juil. 2006 à 13:30
Bonjours, cas fais 2 heures que je cherche mon bug et je ne trouve pas! C'est frustrant!
J'ai fais pas mal de test et je ne trouve rien.
Je met donc mon code sur le poste (cas fais longtemps que je n'ai pas fais de C, 4/5 ans, et là vraiment je ne m'en sort pas!)

#include <cstdlib>
#include
#include <string.h>
#include <stdlib.h>
typedef unsigned long ErreurCode;

ErreurCode ChercheTextDansFichier (FILE * Fichier, char * TextAChercher, unsigned long * Position)
{
char * Tempon;
unsigned long PositionFichier = 0;
unsigned long PositionChaine = 0;
unsigned long TailleFichier;
    fseek (Fichier, 0, SEEK_END);
    TailleFichier = ftell(Fichier);
    fseek (Fichier, 0, SEEK_SET);
    Tempon = (char *)malloc(strlen(TextAChercher));
    while (!(feof(Fichier)) && (PositionChaine < strlen(TextAChercher)))
    {
        PositionFichier++;
        Tempon[PositionChaine] = (char)fgetc (Fichier);
        PositionChaine++;
        Tempon[PositionChaine] = '\0';
        if (strncmp(TextAChercher,Tempon,PositionChaine) != 0)
        {
             PositionChaine = 0;
        }
    }
    if (feof(Fichier))
    {
        *Position = 0;
    }
    else
    {
        *Position = PositionFichier - strlen(TextAChercher);
    }
    free (Tempon);
    return 0;
}

ErreurCode LitDonneeBaliseFichier (FILE * Fichier, char * Balise, char ** Donnee)
{
unsigned long PositionDepart;
unsigned long PositionFin;
char * Tempon;

    Tempon = (char *)malloc (strlen(Balise) + 3);
    Tempon[0] = '<';
    Tempon[1] = '\0';
    strcat (Tempon, Balise);
    strcat (Tempon,">");
    ChercheTextDansFichier (Fichier, Tempon, &PositionDepart);
    PositionDepart += (strlen(Tempon)); //Position de début de balise (donc carac '<') - carac de fin de chaine
    Tempon[1] = '/';
    Tempon[2] = '\0';
    strcat (Tempon, Balise);
    strcat (Tempon,">");
    ChercheTextDansFichier (Fichier, Tempon, &PositionFin); //position de début de balise donc OK
    *Donnee = (char *)malloc (PositionFin - PositionDepart + 2); //+1 car carac de fin de chaine + 1 (fichier commance à 0 et malloc à 1)
    *Donnee[0] = '\0';
    fseek (Fichier, PositionDepart, SEEK_SET);
    PositionFin -= PositionDepart;
    PositionDepart = 0;
    while (PositionDepart < PositionFin)
    {
        (*Donnee)[PositionDepart] = (char)fgetc (Fichier);
        PositionDepart ++;
    }
    (*Donnee)[PositionDepart] = '\0';
    free (Tempon);
    return 0;
}

int main(int argc, char *argv[])
{
FILE * FichierXML;
char * Texte;
    FichierXML = fopen("D:\\schema_bodacc_Bilan_V2006.01.xml","r");
    LitDonneeBaliseFichier (FichierXML,"versionSchema",&Texte);
    printf ("Fin de test valeur :\n%s\n",Texte);
    free (Texte);
    system("PAUSE");
    fclose(FichierXML);
    system("PAUSE");
    return 0;
}

PS : Je compile avec "Dev-C++".
PS² : Si vous avez une meilleur syntax (pour autre chose que le "fclose") vous pouvez bien sur me la faire parvenir.
Merci.
D'oh! Nuts!
Mmmmm...
 DONUTS
Afficher la suite 

Votre réponse

45 réponses

Meilleure réponse
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 31 juil. 2006 à 11:58
3
Merci
Heeeee, oups <!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\VIW\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="/imgs2/smile_blush.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

J'ai failli oublier d’expliquer pourquoi j'ai heu ce genre d'erreur. Oui j’ai
fini par trouver (non pas sans énervement).

Bon ba vaux mieux tard que jamais.<!--[if gte vml 1]><v:shape id="_x0000_i1026"
type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\VIW\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="/imgs2/smile_blush.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

Tout d'abor il faux savoir que j'ai continué à développer comme si de rien
n'étais. Au bout de quelque fonction supplémentaire à mon programme j'ai tester
sans le printf(""); et plus de problème??????
<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt=""
style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\VIW\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"
o:href="/imgs2/smile_big.gif"/>
</v:shape><![endif]--><!--[if !vml]-->
Par la suite j'ai rencontré d'autre erreur très étrange (l'adresse mémoire
0x000000 ne peut pas être read, et autre adresse 0xfffffff). J'ai fini par vérifier
ce que l'on peut dire sur mon compilateur (Dev-C++) sur le forum de 01net (là
ou j'ai récupérer Dev-C++) et un message disais qu'il n’était pas compatible
avec Win XP. J'ai donc réinstaller sur un 98 et hoooo miracle plus de bug (pas
1 seul <!--[endif]-->mon code était tout bon ). Donc mes bugs semblaient venir de mon OS.
Il me semble pourtant que quelqu’un ici avais fais le test avec Dev-C++ sur XP
et qu'il n'avais pas hue de problème, peut être cas viens du SP (je suis en
SP2) ou d’autre chose, enfin bon<!--[endif]-->

Cois qu'il en sois maintenant je développe et compile sur un Win 98 et je n'ai plus
le moindre problème.

Si quelqu'un connais un compilateur gratuit compatible XP je suis preneur (pas
Visual C++ version Express je l'ai déjà et je n’aime pas, chacun ses gout).

Dans tout les cas MERCI à tous ceux qui on prit du temps pour m'aider (cas fais
plaisir) VIVE <st1:personname productid="LA COMMUNAUTE" w:st="on">LA COMMUNAUTE</st1:personname>
de CodeS-SourceS!



A+

D'oh! Nuts!
Mmmmm...
 DONUTS

Merci Polack77 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Polack77
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 6 juil. 2006 à 17:44
0
Merci
Pourquoi passer un char ** a LitDonneBaliseFichier() ?

LitDonneeBaliseFichier (FichierXML,"versionSchema",Texte);

ErreurCode LitDonneeBaliseFichier (FILE * Fichier, char * Balise, char * Donnee)
{
...
Donnee = (char *)malloc (PositionFin - PositionDepart + 2);
...
}

Et pour tout acces a Donnee, il suffit de faire un Donnee[].

Si tu bosses sous windows, regarde du coté des API CreateFile(), CloseFile()..etc

+2(p - n)
Commenter la réponse de cs_AlexMAN
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 6 juil. 2006 à 20:07
0
Merci
Pense au but à atteindre, ça t'évitera d'amuser le processeur avec des instruction inutiles.
Tempon[0] = '<';
Tempon[1] = '\0';
strcat(Tempon, Balise);

deviendrait
Tempon[0] = '<';
strcpy(Tempon + 1, Balise);
etc...

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 09:07
0
Merci
Heeee, AlexMAN, je passe un "char **" car c'est un
pointeur sur pointeur. Si non comment je fais pour changée l'adrs contenu par
mon pointeur "Texte"??? En passant un "char *" et
"texte" ma fonction appelante (main) ne pourra pas accéder à mes
données puisque je passe à ma fonction (LitDonneeBaliseFichier) l'adrs contenu
dans "texte" et pas l'adrs de "texte"??? A moins que je ne
fasse erreur???


Oui BruNews effectivement je vais tenter d'optimiser un peut plus mes modifications/copies
de chaine.


Merci à vous deux pour vos réponses mais j'ai toujours mon problème. Mon code
plante au "fclose" (Windows m'affiche une fenêtre "Projet1.exe a
rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le
désagrément encouru.") et je ne comprend vraiment pas pourquoi.





D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
turnerom 492 Messages postés samedi 10 juillet 2004Date d'inscription 12 janvier 2012 Dernière intervention - 7 juil. 2006 à 09:09
0
Merci
Salut,

une question me taraude : pourquoi les types de retours de toutes tes
fonctions (sauf le main) sont des unsigned long (typedefé en
ErreurCode) est qu'a chaque fois tu fais un return 0 ? Tes fonctions
devraient être de type void !!!

TuRn3r
Commenter la réponse de turnerom
turnerom 492 Messages postés samedi 10 juillet 2004Date d'inscription 12 janvier 2012 Dernière intervention - 7 juil. 2006 à 09:11
0
Merci
Sinon pour le fclose quel est son code de retour ?

As-tu testé le code de retour de fopen (pour être sur que ton fichier est bien ouvert par exemple) !

TuRn3r
Commenter la réponse de turnerom
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 09:15
0
Merci
Toute mes fonction on un ErreurCode comme type de retour car je vais faire une remonté d'erreur (qui n'est pas encors en place bien sur mais prévue). Oui j'ai tester mon fopen et il me renvoie une ards (j'avais pensé aussi que ca pouvais venir de cas mais c'est une bonne remarque, je vais tester la valeur de retour du "fopen" et ne rien executer si c'est 0).

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 09:23
0
Merci
Je confirme que le fichier est bien ouvert (et en plus
j'affiche bien la donnée de ma balise, alors...)



A oui autre remarque : mon programme ne plante pas si je n'exécute pas LitDonneeBaliseFichier ce que j'avais tester :
           Allouer de la mémoire à texte
           Lire les 20 premiers carac de mon
fichier (les metre dans "texte")
           Se déplace dans le fichier
           Afficher "texte"
           Libérer la mémoire de texte
           Fermer le fichier
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\VIW\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="/imgs2/smile_tongue.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[if gte vml 1]><v:shape id="_x0000_i1026"
type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\VIW\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="/imgs2/smile_tongue.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->Et là tout ce passe pour le mieux!!! Je ne comprends
vraiment pas et cas vas finir par me rendre (tout du moins encor plus que maintenant)



D'oh! Nuts!
Mmmmm...
 DONUTS et
Commenter la réponse de Polack77
turnerom 492 Messages postés samedi 10 juillet 2004Date d'inscription 12 janvier 2012 Dernière intervention - 7 juil. 2006 à 10:12
0
Merci
Peux tu trouver la ligne qui provoque l'erreur en mettant des printf un peu partout.

Sinon, dans ton cas ca peux passer, mais pense toujours dans tes malloc a mettre des sizeof, je m'explique:
Tempon = (char *)malloc(strlen(TextAChercher));

doit devenir:

Tempon = (char *)malloc(strlen(TextAChercher) *sizeof(char));


Tu as de la chance que ca passe car sur un Windows 32Bits (surquoi tu
dois etre a mon avis) sizeof(char) == 1. Mais pense toujours à le
mettre ca te sauveras la mise un jour

TuRn3r
Commenter la réponse de turnerom
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 10:14
0
Merci
oui j'y avais pensé mais comme un char vaux 1 oct pas de problème. Ce n'est pas le cas sur tout les system???????? Merci de l'info!!!!!

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 7 juil. 2006 à 10:26
0
Merci
Normalement sizeof(char) vaut toujours 1

_____________________________________
Commenter la réponse de vecchio56
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 10:32
0
Merci
Heee, question béte :
"malloc(12);" et equivalent à "malloc(zizeof(char) * 12);" au niveau quantité de mémoire, mais au niveau temps d'execution aussi?

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 10:35
0
Merci
Heeee, [auteurdetail.aspx?ID=304809 turnerom] je sais ou plante mon code, au "fclose", ce qui me posse problème c'est de savoir pourcois. (mettre des printf partout c'est fais et à priorie tout ce passe bien, jusqu'au "fclose" en tout cas).

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 7 juil. 2006 à 10:36
0
Merci
Oui bien évidemment, le compilateur traduit sizeof(char) direct en 1, donc c'est strictement équivalent

_____________________________________
Commenter la réponse de vecchio56
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 10:45
0
Merci
OK, je pensais pas (hé je suis un peut null quand même). Du coup je pense que mettre le zizeof par défaut dans tout les malloc est plus prudant.
Heeeee, [auteurdetail.aspx?ID=19734 vecchio56]tu dit que zizeof(char) est traduit en 1 mais la multiplication? Le system ne calcul peut être pas de multiplication par 1 mais c'est envisagable non??? Dans tout les cas il semble evidant que si ce calcul s'effectue il est pas bien long donc je ne revien pas sur ce que je vien d'ecrir : il est plus prudant de mettre le zizeof par défaut dans tout les malloc.
Merci.

Je plante toujours sur ce *µù£$¤% de fclose!
En plus mon chef m'a dit que si je défenestrais mon PC j'étais
viré. Pourtant des fois ca me démange.


D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 10:50
0
Merci
Heeeee, quelqu'un pourais compiler le bout de code que j'ais mit juste pour voir si c'est pas mon compilateur ou mon fichier XML?

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 11:05
0
Merci
Alors là je comprand vraiment plus rien!!!!!!!!!!!!!!!
Je fesais des testes et j'ai donc ajouter des printf et system("PAUSE") et je plante plus?????????????????????????
Si j'ajoute "    printf ("\nCherche la position de %s",Tempon);" dans "LitDonneeBaliseFichier" juste avant la ligne "ChercheTextDansFichier (Fichier, Tempon, &PositionDepart);"
La c'est pas mon PC mais moi qui vais faire un vol plané (c'est l'aterisage qui m'inquiéte)!

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 7 juil. 2006 à 11:09
0
Merci
La multiplication est faite a la compilation et non a l'exécution. De la même manière, ca ne change rien d'écrire int a=1+1+1 ou int a=3, le même code sera généré, donc même tetmps d'exécution.

_____________________________________
Commenter la réponse de vecchio56
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 7 juil. 2006 à 11:12
0
Merci
OK merci pour toutes ces infos. Donc sizefo dans tout les cas!

D'oh! Nuts!
Mmmmm...
 DONUTS
Commenter la réponse de Polack77
turnerom 492 Messages postés samedi 10 juillet 2004Date d'inscription 12 janvier 2012 Dernière intervention - 7 juil. 2006 à 11:15
0
Merci
Wikipedia :
<li>Le type char
</li>

Il s'agit du type usuel pour représenter un caractère. Aucun système
de représentation n'est imposé pour les caractères et on utilise en
général des dérivés du code ASCII. Un caractère doit juste être codé
sur au moins 8 bits. Il est assez usuel toutefois d'utiliser exactement
8 bits pour représenter un char.

TuRn3r
Commenter la réponse de turnerom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.