Partage
  • Partager sur Facebook
  • Partager sur Twitter

mon fopen ne fonctionne pas

je suis sûr que le fichier est dans le bon répertoire et bien nommé

Sujet résolu
    11 mai 2008 à 8:06:32

    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);
    }
    


    Edit : Je viens avec du nouveau :si je mets un autre fichier txt, ça fonctionne, mais pas avec le mien.

    j'obtiens ce message d'erreur :

    Citation : mon compilo

    L'instruction à "0x004082d0" emploie l'adresse mémoire "0x00000000000" la mémoire ne peut pas être read.



    Edit 2: je viens encore avec du nouveau :

    Quand le fichier est vide, il charger j'ai OK, par contre dés que j'ai une ligne dans le fichier, ça plante avec le message ci-dessus.

    Merci d'avance pour votre aide.

    Edit3 :j'ai trouvé.

    J'avais oublié deux parenthèses dans l'accesseur.

    Incroyable que ce genre d'erreur compile mais ne passe pas à l'exécution.

    Bon Dimanche

    beegees
    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2008 à 16:22:08

      Pourquoi tu n'utilise pas les flux fstream, ifstream et ofstream ??
      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2008 à 18:00:11

        parce que notre Prof ne nous l'a pas appris.

        Après l'examen, je m'y mets, s'est promis.

        Le problème est résolu, j'avais oublié deux parenthèses.

        Par contre, je patoge sur un autre problème (voir message précédent dans le forum).

        Merci encore.

        beegees
        • Partager sur Facebook
        • Partager sur Twitter

        mon fopen ne fonctionne pas

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown