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

Bibliothèque standard C Discussion :

tmpfile() nombre de fichiers max atteint!


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut tmpfile() nombre de fichiers max atteint!
    Bonjour à tous.

    J'ai un petit problème dans mon programme au sujet de la fonction tmpfile(). Voici le bout de code qui pose problème.

    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
    // lecture d'un fichier de conf qui renvoie creer_fichiers = 0 ou 1
     
    for (i=0; i<nb_traitement; i++)
    {
      // traitements
     
     
      // ouverture
      if( creer_fichiers )
      {
        fids = fopen( nomFichier, "w" );
        if( fids == NULL )
        {
          fprintf(stderr, "\nErreur d'ouverture du fichier <%s>\n",nomFichier);
          perror ("            erreur systeme ");
          return (errno);
        }
      }
      else
      {
        fids = tmpfile();
        if( fids == NULL )
        {
          printf("\n\nProbleme fids. i vaut: %d\n", i); // Pour DEBUG
          fprintf(stderr, "\nErreur d'ouverture d'un fichier temporaire\n");
          getchar(); // Pour DEBUG
          perror ("            erreur systeme ");
          return (errno);
        }
     
        // écriture dans fids et envoie de fids dans fonction
     
        // fermeture
        ret_fids = fclose(fids); fids = NULL;
        if( ret_fids != 0 )
        {
          fprintf(stderr, "\nErreur de fermeture du fichier %s\n",nomPulse);
          perror ("            erreur systeme ");
          return (errno);
        }
     
    }
    Tout marche nickel lorsque je configure mon fichier de conf pour créer les fichiers ( creer_fichiers = 1 ), mais lorsque je le configure pour ne pas en créer, j'ai au bout d'un moment une erreur sur l'ouverture du fichier temporaire. En fait, cette erreur survient lorsque i=32767, ce qui correspond apparemment au nombre max de fichiers différents que peut créer tmpfile() (Cf stdio.h il me semble).
    Mon problème est que nb_traitement est souvent (voir toujours) supérieur à cette valeur.
    Dans mon cas j'utilise peut-être plus de 32767 fichiers temporaires, mais uniquement 1 par 1. Ne devrait-il pas être détruit lors de sa fermeture (doc tmpfile), m'autorisant ainsi à en créer autant que je le veut ?
    Sinon y a-t-il une parade ?

    D'avance merci.

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je n'ai pas regardé le code mais :
    7.19.4.3 The tmpfile function
    Synopsis
    1 #include <stdio.h>
    FILE *tmpfile(void);
    Description
    2 The tmpfile function creates a temporary binary file that is different from anyother
    existing file and that will automatically be removedwhen it is closed or at program
    termination. If the program terminates abnormally,whether an open temporary file is
    removed is implementation-defined. The file is opened for update with "wb+" mode.
    Recommended practice
    3 It should be possible to open at least TMP_MAX temporary files during the lifetime of the
    program
    (this limit may be shared with tmpnam)and there should be no limit on the
    number simultaneously open other than this limit and anylimit on the number of open
    files (FOPEN_MAX).
    Returns
    4 The tmpfile function returns a pointer to the stream of the file that it created. If the file
    cannot be created, the tmpfile function returns a null pointer.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Ok, donc pas plus de 32767 (TMP_MAX) fichiers temporaires durant la "vie" du programme.
    Je vais me rabattre sur tmpnam.

    Merci beaucoup et à la prochaine...

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    humm
    7.19.4.3 The tmpfile function
    Synopsis
    1 #include <stdio.h>
    FILE *tmpfile(void);
    Description
    2 The tmpfile function creates a temporary binary file that is different from anyother
    existing file and that will automatically be removedwhen it is closed or at program
    termination. If the program terminates abnormally,whether an open temporary file is
    removed is implementation-defined. The file is opened for update with "wb+" mode.
    Recommended practice
    3 It should be possible to open at least TMP_MAX temporary files during the lifetime of the
    program (this limit may be shared with tmpnam)and there should be no limit on the
    number simultaneously open other than this limit and anylimit on the number of open
    files (FOPEN_MAX).
    Returns
    4 The tmpfile function returns a pointer to the stream of the file that it created. If the file
    cannot be created, the tmpfile function returns a null pointer.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Que faire alors ?

    Créer un fichier "poubelle" que j'efface en fin de boucle ? C'est pas super propre comme méthode ça!

    Un tmpnam( NULL ) pour chaque création du fichier temporaire peut-il outrepasser cette limitation ?

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Rodinia Voir le message
    Que faire alors ?
    descendre d'un niveau, par exemple si tu es sur un système POSIX :
    http://www.opengroup.org/onlinepubs/...s/mkstemp.html

    Citation Envoyé par Rodinia Voir le message
    Créer un fichier "poubelle" que j'efface en fin de boucle ? C'est pas super propre comme méthode ça!
    Pourquoi pas, si c'est possible autant faire ça, mais dans ce cas je me demande vraiment si l'écriture dans un fichier est une nécessité.

    Citation Envoyé par Rodinia Voir le message
    Un tmpnam( NULL ) pour chaque création du fichier temporaire peut-il outrepasser cette limitation ?
    ça ne changera rien à ton problème, le fait de passer NULL te renvoi simplement un pointeur sur une zone statique et éventuellement rendra ta fonction non thread safe.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    ça ne changera rien à ton problème, le fait de passer NULL te renvoi simplement un pointeur sur une zone statique et éventuellement rendra ta fonction non thread safe.
    J'oublie ça alors.

    Citation Envoyé par nicolas.sitbon Voir le message
    Pourquoi pas, si c'est possible autant faire ça, mais dans ce cas je me demande vraiment si l'écriture dans un fichier est une nécessité.
    Je dois créer un flux, car j'ai une fonction dans la boucle qui en a besoin. Je pense que je vais créer ce fichier "poubelle" et le détruire en fin de boucle.

    Merci.

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Rodinia Voir le message
    Je dois créer un flux, car j'ai une fonction dans la boucle qui en a besoin. Je pense que je vais créer ce fichier "poubelle" et le détruire en fin de boucle.
    Ta fonction, elle écrit beaucoup de données dans ce fichier? tu peux donner un chiffre? Ko? Mo? Go?

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Ta fonction, elle écrit beaucoup de données dans ce fichier? tu peux donner un chiffre? Ko? Mo? Go?
    Non pas beaucoup, de l'ordre du Mo, parfois moins. Pourquoi ? Tu pense que je devrait plutôt ne créer qu'un seul et même fichier temporaire?

  10. #10
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    oups ....

  11. #11
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    clair un accès disques est plus lent qu'un accès mémoire même avec un SSD

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

Discussions similaires

  1. nouveau fichier de log si taille max atteinte
    Par Juwan dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 16/05/2012, 10h48
  2. Réponses: 2
    Dernier message: 27/08/2005, 16h12
  3. [MFC] Limitation du nombre de fichiers...
    Par chronos dans le forum MFC
    Réponses: 5
    Dernier message: 02/06/2004, 10h40
  4. limitation nombre de fichiers
    Par bozo dans le forum MFC
    Réponses: 6
    Dernier message: 02/07/2003, 13h44
  5. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47

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