IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème avec fopen


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut problème avec fopen
    Bonsoir, j'utilise la fonction fopen sous windows XP tout se passe bien mais au bout d'un moment la fonction me retourne un pointeur null. Fichier ou répertoire inexistant!! alors qu'ils existes.
    Avez-vous eu vent d'un tel problème?

    code :



    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    //---------------------------------------------------------------------------
    void __fastcall TFEditionEssai::SaveEssai (AnsiString FileName)
    {
      FILE *hf ;
      TTreeNode* NodeEssai ;
      PStructEssai  DEssai;
      PStructCycleRef  DCycleRef;
      PStructPasTemp  DPasTemp;
      PStructSauv  DSauv ;
      PStructCycleEnd  DCycleEnd;
      PStructPasEnd  DPasEnd;
      int MyNodeType ;
     
     
      hf = fopen (FileName.c_str(), "w+b") ;
     
      if (hf == NULL)
      {
         ShowMessage(strerror(errno));
         return ;
      }
     
     
      TTreeNode *CurItem = TreeViewCycle->Items->GetFirstNode();
     
     
      while (CurItem)
      {
        MyNodeType = CurItem->ImageIndex;
        switch (CurItem->ImageIndex )
               {
                  case ntEssai:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DEssai = new TStructEssai;
                    DEssai = PStructEssai(CurItem->Data);
                    fwrite (DEssai, sizeof (TStructEssai), 1, hf) ;
                    break ;
                  case ntCycleRef:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DCycleRef = new TStructCycleRef;
                    DCycleRef = PStructCycleRef(CurItem->Data);
                    fwrite (DCycleRef, sizeof (TStructCycleRef), 1, hf) ;
                    break ;
                  case ntPasTemp:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DPasTemp = new TStructPasTemp;
                    DPasTemp = PStructPasTemp(CurItem->Data);
                    fwrite (DPasTemp, sizeof (TStructPasTemp), 1, hf) ;
                    break ;
                  case ntCycleEnd:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DCycleEnd = new TStructCycleEnd;
                    DCycleEnd = PStructCycleEnd(CurItem->Data);
                    fwrite (DCycleEnd, sizeof (TStructCycleEnd), 1, hf) ;
                    break;
                  case ntSauvegarde:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DSauv = new TStructSauv;
                    DSauv = PStructSauv(CurItem->Data);
                    fwrite (DSauv, sizeof (TStructSauv), 1, hf) ;
                    break ;
                  case ntPasEnd:
                    fwrite (&MyNodeType , sizeof (int), 1, hf);
                    DPasEnd = new TStructPasEnd;
                    DPasEnd = PStructPasEnd(CurItem->Data);
                    fwrite (DPasEnd, sizeof (TStructPasEnd), 1, hf) ;
                    break;
               }
        CurItem = CurItem->GetNext();
      }    
     
      if (hf)
        fclose (hf) ;
     
    }
    (bigboomshakala)

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut


    AnsiString ? Classes non-template commençant par T ?
    C'est du Borland, ça, non ?

    Et pour savoir si le fichier existe ou non : Tu devrais afficher le nom du fichier, ainsi que celui du répertoire courant si le chemin est relatif. Histoire d'être sûr que c'est bien le bon fichier que la fonction recherche...

  3. #3
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut !

    Tout d'abord, fopen c'est du C, et non du C++ (la différence, c'est que les fonctions C++ sont plus "sûres") : utilise ofstream (écriture) et ifstream (lecture) qui sont bien meilleurs...

    Commence par lire ceci...

    Ensuite, il se peut que ta chaîne de caractère ne corresponde pas vraiment au chemin de ton fichier... As-tu vérifié (via un std::cout<<FileName par exemple) ?

    [EDIT] Rhaaa ! Grillé dans la réponse ! Tou es plou rapide quou moé !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Réponse à Médinoc
    Oui c'est bien du Borland Builer 5
    J'ai vérifier avec l'outil de builder de débogage c'est bien le bon fichier et le bon répertoire.

    La fonction fopen fonctionne très bien sauf qu'au bout d'un moment elle retourne un pointeur null alors que le fichier existe ainsi que le répertoire. La variable FileName est issue d'une boite de dialogue => "SaveEssai(SaveDialog->FileName)". Je vais même jusqu'à spécifier un autre nom de fichier et emplacement de sauvegarde via la boite de sauvegarde lorsque le problème apparait mais sans effet, le pointeur est toujours null. Cet incident est furtif je sais pas trop si c'est lié au temps à XP qui fait des choses !!!!

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    j'ai eu pas mal de problèmes avec fopen en C++, tu devrais laisser tomber et suivre les conseils de mathieu_t, ça marchera à tous les coups, et sans te poser de questions inutiles!

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut
    Salut,

    Pour info, sais tu que les TTreeView de borland disposent d'une méthode ReadFromFile()? (De tete, car ca fait un bout de temps que je ne les ai plus utilisés, TTreeView ->Items->ReadFromFile())

    Ils disposent d'ailleurs aussi de la méthode SaveToFile(), si mes souvenirs sont bon, au meme endroit

    N'aurais-tu pas plus facile de charger ton TTreeView grace à cette méthode, quitte à le reparcourrir par la suite pour modifier l'image de chacun des noeud, selon ta propre inspiration?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut,

    quand tu dis "au bout d'un moment" fopen renvoie NULL, tu veux dire "au bout d'un certain nombre de fichiers ouverts" ?
    Si tel est le cas, cela peut être une limitation de fichiers ouverts simultanément. Pour s'en assurer, tu peux essayer de faire une boucle de fopen (sans faire de fclose) et regarder si c'est toujours à la même itération que fopen renvoie NULL.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par karl3i
    quand tu dis "au bout d'un moment" fopen renvoie NULL, tu veux dire "au bout d'un certain nombre de fichiers ouverts" ?
    Si tel est le cas, cela peut être une limitation de fichiers ouverts simultanément. Pour s'en assurer, tu peux essayer de faire une boucle de fopen (sans faire de fclose) et regarder si c'est toujours à la même itération que fopen renvoie NULL.
    C'est même très probablement ça.

    Le nombre de fichiers "ouvrables" simultanément par un processus donné est limité. De mémoire il me semble que c'est 1024. Mais il me semble aussi que c'est reparamétrable (sous Unix en tout cas).

    Lorsque la limite fixée est atteinte, fopen renvoie systématiquement ... NULL.

    Donc soit il manque un fclose quelque part dans ton programme, et au bout d'un moment ça coince ; soit tu essaies (volontairement) d'ouvrir trop de fichiers.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par poukill
    j'ai eu pas mal de problèmes avec fopen en C++, tu devrais laisser tomber et suivre les conseils de mathieu_t, ça marchera à tous les coups, et sans te poser de questions inutiles!
    fopen fonctionne très bien en C++ !

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par rigobert
    fopen fonctionne très bien en C++ !
    Je sais, mais mon code devait fonctionner parfaitement (posté et approuvé dans ce forum), et ne marchait pas... En passant par les flux, c'était ok .
    Je continue à croire qu'il n'aura jamais qqch de magique en info, mais là je n'ai pas compris!

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut cloture pb
    merci à tous le pb est résolu, il me manquait bien un fclose

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec fopen
    Par Vincent157 dans le forum Visual C++
    Réponses: 1
    Dernier message: 28/06/2007, 15h14
  2. Problème avec fopen
    Par morgan47 dans le forum Langage
    Réponses: 5
    Dernier message: 21/12/2006, 23h47
  3. Problème avec fopen
    Par Fonzy007 dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2006, 19h15
  4. [FTP] Problème avec fopen sur URL
    Par Biboune2008 dans le forum Langage
    Réponses: 14
    Dernier message: 22/06/2006, 18h00
  5. Problème avec fopen
    Par Binouce dans le forum C
    Réponses: 10
    Dernier message: 15/01/2006, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo