begin process at 2008 07 06 00:10:21
1 205 401 membres
368 nouveaux aujourd'hui
14 119 membres club

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 : Mon fopen ne fonctionne pas [ Divers / Débutant(e) ] (daviddubois)

Mon fopen ne fonctionne pas le 11/05/2008 08:01:13

daviddubois
Bonjour tout le monde,

Mon fopen ne fonctionne pas et je suis bloqué depuis hier soir.

    Fichier = fopen(NomFichier,"rt");
    if (Fichier == NULL) return false;

arrivé sur la ligne if (Fichier==NULL) return false, il renvoie false car Fichier vaut bien NULL alors que je suis sûr que mon fichier se trouve au bon endroit et que le nom est correct.

Je l'appelle via la main :

    if(Produit.Charger("produit.txt"))printf("OK");

voici une partie de mon code :

#include <BasicConsole.h>
#include "CarambouilleDD1.h"

////////////////
// CProduits //
///////////////

CProduit::CProduit()
:m_PP(0) // j'initialise à zéro au cas où le modificateur ne sait pas affecter une valeur.
{
}

//le constructeur par copie est appelé avec le constructeur par copie
CProduit::CProduit(const CProduit& Source)
:CGenerique(Source),m_NomProduit(Source.m_NomProduit),m_PP(Source.m_PP)
{
}

//le constructeur spécifique est appelé avec la méthode d'ajout
CProduit::CProduit(const char* UnNom,int UnPrix)
:m_PP(0) //on recopie la même chose que dans le constructeur spécifique
{
    Nom(UnNom);
    PP(UnPrix);
}

CProduit::~CProduit()
{
}

CGenerique* CProduit::Cloner() const
{
    return new CProduit(*this);
}

bool CProduit::Nom(const char* UnNom)
{
    if((strlen(UnNom)<1)&&(UnNom==NULL))return false;
    return m_NomProduit.Chaine(UnNom);   
}

bool CProduit::PP(int UnPrix)
{
    if(UnPrix < 1) return false;
    m_PP = UnPrix; //on peut ici transformer la valeur d'un membre privé car s'est sa propre classe
    return true;
}

const char* CProduit::Nom() const
{
    return m_NomProduit.Chaine;
}

int CProduit::PP() const
{
    return m_PP;
}

bool CProduit::EstValide() const
{
    return (strlen(Nom())>1 && (PP() > 1));
}

bool CProduit::GereUnicite() const
{
    return true;
}

int CProduit::Comparer(const CGenerique& Autre, long TypeComparaison) const
{
    const CProduit& P = (const CProduit&)Autre;
    switch (TypeComparaison)
    {
    case 0:
        return m_NomProduit.Comparer(P.m_NomProduit,Comparaison_TriCroissantNonStrict);
   
    }
    return 0;
}

long CProduit::NombreClesDeTri() const
{
    return 1;
}

//////////////////
// CTabProduits //
//////////////////

CTabProduits::CTabProduits()
:CTableauGenerique(CProduit())
{
}

CTabProduits::CTabProduits(const CTabProduits& Source)
:CTableauGenerique(Source)
{
}

CTabProduits::~CTabProduits()
{
}

CGenerique* CTabProduits::Cloner() const
{
    return new CTabProduits(*this);
}

CProduit& CTabProduits::Element(long Indice) const
{
    return (CProduit&)CTableauGenerique::Element(Indice);
}

long CTabProduits::Indice(const char* UnNom) const
{
    return CTableauGenerique::Indice(CProduit(UnNom,1));
}

bool CTabProduits::Charger(const char* NomFichier)
{
    CChargeurFichierTexte    Chargeur;

    return Chargeur.Charger(NomFichier,'\t',FctnTraiterLigne,this);
}

bool CTabProduits::FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte)
{
    return ((CTabProduits*)Contexte)->TraiterLigne(Chargeur);
}

bool CTabProduits::TraiterLigne(const CChargeurFichierTexte& Chargeur)
{
    if (Chargeur.NombreChamps() == 2) Ajouter(CProduit(Chargeur.Champs(0),atol(Chargeur.Champs(1))));
    return true;
}

bool CTabProduits::Ajouter(const CProduit& Modele)
{
    return CTableauGenerique::Ajouter(Modele);
}

et le fichier .h

#ifndef CARAMBOUILLE_H
#define CARAMBOUILLE_H

#include "chaine.h"
#include "generique.h"

class CProduit;
class CTabProduits;

class CProduit : public CGenerique
{
public:
    CProduit();
    CProduit(const CProduit& Source);
    CProduit(const char* UnNom, int UnPrix);
    ~CProduit();

    CGenerique*    Cloner() const;
    const char*    Nom() const;
    int            PP() const;
    bool        Nom(const char* UnNom);
    bool        PP(int UnPrix);
    bool        EstValide() const;
    bool        GereUnicite() const;
    long        NombreClesDeTri() const;
    int            Comparer(const CGenerique& Autre, long TypeComparaison) const;



private :
    CChaine        m_NomProduit;
    int            m_PP; //Prix Produit
};

class CTabProduits : public CTableauGenerique
{
public:
    CTabProduits();
    CTabProduits(const CTabProduits& Source);
    ~CTabProduits();
   
    CGenerique*        Cloner() const;
    CProduit&        Element(long Indice) const;
    long            Indice(const char* UnNom) const;
    bool            Charger(const char* NomFichier);
    bool            Ajouter(const CProduit& Modele);

private:
    static bool    FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte);
    bool        TraiterLigne(const CChargeurFichierTexte& Chargeur);


};
#endif

et le .cpp pour le chargement :

#include <BasicConsole.h>
#include "CarambouilleDD1.h"

////////////////
// CProduits //
///////////////

CProduit::CProduit()
:m_PP(0) // j'initialise à zéro au cas où le modificateur ne sait pas affecter une valeur.
{
}

//le constructeur par copie est appelé avec le constructeur par copie
CProduit::CProduit(const CProduit& Source)
:CGenerique(Source),m_NomProduit(Source.m_NomProduit),m_PP(Source.m_PP)
{
}

//le constructeur spécifique est appelé avec la méthode d'ajout
CProduit::CProduit(const char* UnNom,int UnPrix)
:m_PP(0) //on recopie la même chose que dans le constructeur spécifique
{
    Nom(UnNom);
    PP(UnPrix);
}

CProduit::~CProduit()
{
}

CGenerique* CProduit::Cloner() const
{
    return new CProduit(*this);
}

bool CProduit::Nom(const char* UnNom)
{
    if((strlen(UnNom)<1)&&(UnNom==NULL))return false;
    return m_NomProduit.Chaine(UnNom);   
}

bool CProduit::PP(int UnPrix)
{
    if(UnPrix < 1) return false;
    m_PP = UnPrix; //on peut ici transformer la valeur d'un membre privé car s'est sa propre classe
    return true;
}

const char* CProduit::Nom() const
{
    return m_NomProduit.Chaine;
}

int CProduit::PP() const
{
    return m_PP;
}

bool CProduit::EstValide() const
{
    return (strlen(Nom())>1 && (PP() > 1));
}

bool CProduit::GereUnicite() const
{
    return true;
}

int CProduit::Comparer(const CGenerique& Autre, long TypeComparaison) const
{
    const CProduit& P = (const CProduit&)Autre;
    switch (TypeComparaison)
    {
    case 0:
        return m_NomProduit.Comparer(P.m_NomProduit,Comparaison_TriCroissantNonStrict);
   
    }
    return 0;
}

long CProduit::NombreClesDeTri() const
{
    return 1;
}

//////////////////
// CTabProduits //
//////////////////

CTabProduits::CTabProduits()
:CTableauGenerique(CProduit())
{
}

CTabProduits::CTabProduits(const CTabProduits& Source)
:CTableauGenerique(Source)
{
}

CTabProduits::~CTabProduits()
{
}

CGenerique* CTabProduits::Cloner() const
{
    return new CTabProduits(*this);
}

CProduit& CTabProduits::Element(long Indice) const
{
    return (CProduit&)CTableauGenerique::Element(Indice);
}

long CTabProduits::Indice(const char* UnNom) const
{
    return CTableauGenerique::Indice(CProduit(UnNom,1));
}

bool CTabProduits::Charger(const char* NomFichier)
{
    CChargeurFichierTexte    Chargeur;

    return Chargeur.Charger(NomFichier,'\t',FctnTraiterLigne,this);
}

bool CTabProduits::FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte)
{
    return ((CTabProduits*)Contexte)->TraiterLigne(Chargeur);
}

bool CTabProduits::TraiterLigne(const CChargeurFichierTexte& Chargeur)
{
    if (Chargeur.NombreChamps() == 2) Ajouter(CProduit(Chargeur.Champs(0),atol(Chargeur.Champs(1))));
    return true;
}

bool CTabProduits::Ajouter(const CProduit& Modele)
{
    return CTableauGenerique::Ajouter(Modele);
}

Merci d'avance pour votre aide.


Re : Mon fopen ne fonctionne pas le 11/05/2008 10:59:08

jfrancois
Bonjour,

1) Les 2 instructions suivantes sont tout à fait correctes donc le problème est certainement au niveau du fichier ! Il faudrait initialiser avec un nom complet pour tester : "C:\\Temp\\Fichier.txt" (par ex.).

Fichier = fopen(NomFichier,"rt");
if (Fichier == NULL) return false;

2) strlen(UnNom) avec UnNom = NULL ça plante !

bool CProduit::Nom(const char* UnNom)
{
   if((strlen(UnNom)<1)&&(UnNom==NULL))return false;
   return m_NomProduit.Chaine(UnNom);   
}

Il vaudrait mieux mettre (si pointeur nul ou si longueur nulle)
:

   if (UnNom == NULL  ||  *UnNom == 0) return false;


Jean-François


Re : Mon fopen ne fonctionne pas le 11/05/2008 11:03:34

daviddubois
Bonjour Jean-François,

Un tout grand merci pour ta réponse.

Je viens juste de trouver le problème !

J'avais juste oublié de mettre ( ) dans :

const char* CProduit::Nom() const
{
    return m_NomProduit.Chaine;
}


Maintenant ça fonctionne.

Merci encore.




Classé sous : const, return, bool, cproduit, ctabproduits

Participer à cet échange

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS