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 :

Augmenter la taille d'un buffer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Par défaut Augmenter la taille d'un buffer
    Bonjour,
    Ça va maintenant faire un bon moment que je reste bloquée sur ce point : je souhaite placer le résultat d'un read dans un buffer, et si le buffer est trop petit, l'augmenter.
    J'ai essayé avec un buffer statique et un dynamique mais ça ne marche toujours pas.
    Voilà une partie de mon 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
     
    char buffer[SIZEBUF];
    ssize_t nb;
    int size=SIZEBUF;       //size prend la taille originale du buffer
    nb=read(fd,buffer,sizeof(buffer));
     
    if(nb==size)
    {
           while (nb>0 && nb==size)
          {
    	size*=2;
    	buffer[size];      //ici je voulais réallouer mon buffer avec une taille plus grande
    	nb=read(fd,buffer,size);
          }
     
    }
    Est-ce que c'est possible en statique ou je dois le faire en dynamique ?


    Merci d'avance pour votre aide,
    Julie

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Non, il est impossible de modifier la taille du buffer sur la pile de manière portable. Il faut utiliser realloc. Fais bien attention à l'utiliser correctement, en prenant en charge les cas d'erreur.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Par défaut
    D'accord merci je vais essayer de le changer en dynamique alors

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Par défaut
    Je vais de changer mon 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
     
    int size=SIZEBUF;
     
    char *buffer=NULL;
    buffer=malloc(SIZEBUF*sizeof(char));
     
    ssize_t nb;
    while(nb=read(fd,buffer,size)> 0 )
         {
    	if(nb==size)
                {
    	      size*=2;
    	      buffer=realloc(buffer,size);
    	      if(buffer==NULL)
    		  {
    		  fprintf(stderr,"erreur realloc");
    		  exit(EXIT_FAILURE);
    		  }
    	    }
        }
    Mais le problème c'est que nb est toujours différents de size, je n'arrive pas à rentrer dans la boucle du if

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et si tu affichais size, puis nb à chaque lecture?
    Tu pourrais voir ce qu'il se passe…

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Par défaut
    Citation Envoyé par ternel Voir le message
    Et si tu affichais size, puis nb à chaque lecture?
    Tu pourrais voir ce qu'il se passe…
    Je vois que nb vaut toujours 1, donc c'est normal qu'il ne rentre pas dans la boucle if.
    En fait je cherche à savoir comment savoir que le buffer est plein, mais je ne sais pas comment faire.
    Je pensais que read renvoyait le nombre d'octets lu, donc si c'était égal à size il fallait réallouer.
    Mais apparement ce n'est pas la bonne méthode

  7. #7
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    read ne te garantit nullement de retourner le nombre exact d'octets reçu en paramètre (cf. man).


    Citation Envoyé par Matt_Houston Voir le message
    Il faut utiliser realloc. Fais bien attention à l'utiliser correctement, en prenant en charge les cas d'erreur.
    Citation Envoyé par KiitKaate Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	      buffer=realloc(buffer,size);
    	      if(buffer==NULL)
    		  {
    		  fprintf(stderr,"erreur realloc");
    		  exit(EXIT_FAILURE);
    		  }
    Ton bloc mémoire d'origine est perdu si realloc échoue (cf. man).

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    read ne te garantit nullement de retourner le nombre exact d'octets reçu en paramètre (cf. man).






    Ton bloc mémoire d'origine est perdu si realloc échoue (cf. man).
    Oui c'est vrai je viens de créer un buffer tmp, dans lequel je mets le résultat du réalloc. S'il a fonctionné, je recopie tmp dans buffer

Discussions similaires

  1. stringstream : augmenter la taille initiale du buffer
    Par jeanmarcL dans le forum SL & STL
    Réponses: 2
    Dernier message: 17/04/2007, 21h10
  2. comment augmenter la taille d'un tableau ?
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 16/12/2005, 12h47
  3. augmenter la taille d'une tablespace?
    Par sali dans le forum Oracle
    Réponses: 1
    Dernier message: 01/12/2005, 15h52
  4. [Redo log] : augmenter la taille des fichiers
    Par user_oracle dans le forum Oracle
    Réponses: 3
    Dernier message: 29/11/2005, 19h49
  5. []Augmenter la taille de la pile des appels ?
    Par oncle ervil dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/05/2005, 09h29

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