Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème avec "fclose" [ Divers / Débutant(e) ] (Polack77)

jeudi 6 juillet 2006 à 17:33:25 | Problème avec "fclose"

Polack77

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 <iostream>
#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

jeudi 6 juillet 2006 à 17:44:13 | Re : Problème avec "fclose"

AlexMAN

Membre Club
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)

jeudi 6 juillet 2006 à 20:07:00 | Re : Problème avec "fclose"

BruNews

Administrateur CodeS-SourceS
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++

vendredi 7 juillet 2006 à 09:07:28 | Re : Problème avec "fclose"

Polack77

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

vendredi 7 juillet 2006 à 09:09:02 | Re : Problème avec "fclose"

turnerom

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

vendredi 7 juillet 2006 à 09:11:35 | Re : Problème avec "fclose"

turnerom

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

vendredi 7 juillet 2006 à 09:15:22 | Re : Problème avec "fclose"

Polack77

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

vendredi 7 juillet 2006 à 09:23:32 | Re : Problème avec "fclose"

Polack77

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
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

vendredi 7 juillet 2006 à 10:12:50 | Re : Problème avec "fclose"

turnerom

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

vendredi 7 juillet 2006 à 10:14:59 | Re : Problème avec "fclose"

Polack77

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


1 2 3 4 5

Cette discussion est classé dans : fichier, char, unsigned, tempon, positiondepart


Répondre à ce message

Sujets en rapport avec ce message

Debutant : ecrire et lire un fichier txt [ par manu ] Bonjour a tous.Je debute, aussi desole.... :)Je cherche donc a ecrire dans un fichier txt, puis a lire ce fichier ligne a ligne, faire un split / expl ecriture fichier txt turboC++ [ par idk ] qqun connais une fonction, qui te place le cursor, (dans un fichier),CAD qui renvoie à la ligne suivante exemple char prenom="tom"char nom="bauq" Et d écriture dans un fichier txt [ par jimtruand ] bonjour,j'ai un fichier txt à traiter et à envoyer via ftp à un serveur. la partie ftp est ok.la partie fichier pt'problèmedans le fichier je dois mod Lecture/Ecriture/Modification d'une structure dans un fichier [ par paniX ] Bonjour. Alors voici mon probleme:j'ai créé une structure client qui a cette forme :struct client{ int id; char nom[30]; char prenom[30]; char adresse Ecriture/lecture dans un fichier [ par SneakGuy ] Haaa... Merci, sa m'a aider... Enfin, j'ai encore plusieurs problemes...pour l'ecriture j'ai quelque chose qui ressemble a sa:char user[20];char pass[ Pointeurs sur des tableaux de plusieurs dimensions [ par ProGamer ] J'ai besoin de faire des pointeurs sur ce genre de tableaux. Voici comment je m'y prends (et surtout, voici comment ça ne marche pas...):unsigned char Comment concertir Ansistring en unsigned char*????? [ par asik38 ] Ansistring x;unsigned char str[100];str[100]=x;??????Merci!!! pb avec conio je cher cherche l'erreur( j'ai merde sur le mess precedent) [ par kin ] portpia.cpp#include"PortPiaPc.h"void main(){ PortPiaPc inst; inst(0x320,0x0f);}PortPiaPc.cpp#include "PortPiaPc.h"#include "conio.h"PortPiaPc::PortPia Unsigned char to AnsiString et Ansistring to UnS Char??? [ par asik38 ] Comment on fait pour convertir unsigned char an ansistringEt de AnsiString en unsigned char*Merci!!! ça concerne la lecture et l'ecriture sur un fichier et ... [ par wfish ] voila mon pb :j'ai fais un ptit prog de traitement de fichier. il sert à mettre certaines infos prises dans un fichier et les mettre dans un autre !!1


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.