Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

NOM

       fmemopen, open_memstream, open_wmemstream  - Ouvrir de la memoire comme
       un flux

SYNOPSIS

       #include <stdio.h>

       FILE *fmemopen(void *buf, size_t size, const char *mode);

       FILE *open_memstream(char **ptr, size_t *sizeloc);

       #include <wchar.h>

       FILE *open_wmemstream(wchar_t **ptr, size_t *sizeloc);

   Exigences de macros de test de fonctionnalites  pour  la  glibc  (consultez
   feature_test_macros(7)) :

       fmemopen(), open_memstream(), open_wmemstream() :
           Depuis la glibc 2.10 :
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _GNU_SOURCE

DESCRIPTION

       La  fonction  fmemopen()  ouvre un flux qui permet l'acces specifie par
       mode. Le flux permet d'effectuer des entrees sorties sur la  chaine  ou
       la  memoire  du  tampon  pointee  par buf. Ce tampon doit au moins etre
       d'une longueur de size octets.

       L'argument mode est le meme que celui de la fonction fopen(3). Si  mode
       specifie  un  mode  d'ajout  (<< append  mode >>),  alors  la  position
       initiale du fichier est definie a la  position  du  premier  octet  nul
       ('\0')  du  tampon ; sinon la position initiale est definie au debut du
       tampon. Depuis la glibc 2.9, la lettre << b >>peut etre specifiee comme
       second  caractere  de mode. Ceci fournit le mode binaire : une ecriture
       n'implique pas d'ajouter un caractere nul de  terminaison  et  fseek(3)
       SEEK_END  est relative a la fin du tampon (c-a-d la valeur specifie par
       size) au lieu de la taille de la chaine courante.

       Lorsqu'un flux ouvert en ecriture est vide  (consultez  fflush(3)),  ou
       ferme  (consultez fclose(3)), un octet nul est ecrit a la fin du tampon
       s'il y  a  de  la  place.  L'appelant  devrait  s'assurer  qu'un  octet
       supplementaire  est  disponible  dans  le  tampon (et que size en tient
       compte) pour permettre ceci.

       Essayer d'ecrire plus de size octets dans le tampon  cree  une  erreur.
       (Par  defaut,  de telles erreurs ne sont seulement visibles que lorsque
       le  tampon  stdio  est  vide.  Desactiver  la  mise  en   tampon   avec
       setbuf(fp, NULL)  peut  etre  utile pour detecter les erreurs au moment
       d'une   operation   de   sortie.   Alternativement,   l'appelant   peut
       explicitement definir buf comme un tampon de flux stdio, au meme moment
       en informant stdio de la  taille  du  tampon  avec  setbuffer(fp,  buf,
       size)).

       Avec un flux ouvert en lecture, un octet nul dans le tampon ne cree pas
       d'operations de lecture et renvoie une indication de  fin  de  fichier.
       Une  lecture  depuis  le  tampon  indiquera seulement la fin du fichier
       quand le pointeur de fichier aura avance de plus  de  size  octets  par
       rapport au debut du tampon.

       Si  l'argument  buf  vaut  NULL,  alors  la  fonction fmemopen() alloue
       dynamiquement  un  tampon  de  size  octets.  C'est  utile   pour   les
       applications  qui  veulent ecrire des donnees dans un tampon temporaire
       et les lire ensuite. Le tampon est automatiquement supprime lorsque  le
       flux  est  ferme.  Notez que l'appelant ne peut pas obtenir un pointeur
       vers  le  tampon  alloue  temporairement  avec  cette  fonction  (c'est
       possible avec open_memstream(), ci-dessous).

       La  fonction open_memstream() ouvre un flux en ecriture vers un tampon.
       Le tampon est dynamiquement alloue (comme avec  malloc(3))  et  grandit
       automatiquement  a  la  demande. Apres la fermeture du flux, l'appelant
       doit liberer (free(3)) ce tampon.

       Lorsqu'un flux est ferme (fclose(3)) ou vide (fflush(3)), les  adresses
       pointees  par ptr et sizeloc sont mises a jour, avec respectivement, un
       pointeur vers le tampon et la taille  du  tampon  actuel.  Ces  valeurs
       restent  valides  tant  que  l'appelant n'effectue pas de sortie sur le
       flux. Si d'autres sorties sont realisees, alors le flux  doit  etre  ne
       nouveau vide avant d'essayer d'acceder a ces variables.

       Un  octet  nul  est  conserve  a  la fin du tampon. Cet octet n'est pas
       inclus dans la valeur de la taille stockee dans sizeloc.

       La position du flux de fichier  peut  etre  changee  avec  fseek(3)  ou
       fseeko(3).  Deplacer  la position apres la fin des donnees deja ecrites
       remplit l'intervalle vide avec des zeros.

       La fonction open_wmemstream() est similaire  a  open_memstream(),  mais
       elle opere sur les caracteres larges et non sur des octets.

VALEUR RENVOY'EE

       Si   elles   reussissent   integralement,   les  fonctions  fmemopen(),
       open_memstream() et open_wmemstream()  renvoient un  pointeur  de  type
       FILE.  Sinon,  elles  renvoient  NULL et errno est definie avec le code
       d'erreur.

VERSIONS

       fmemopen()  est  open_memstream()  sont  deja   disponibles   dans   la
       glibc 1.0.x. open_wmemstream() est disponible depuis la glibc 2.4.

CONFORMIT'E

       POSIX.1-2008. Ces fonctions ne sont pas specifiees dans POSIX.1-2001 et
       ne sont que rarement disponible sur d'autres systemes.

NOTES

       Il n'y a pas de descripteur de fichier associe avec le flux renvoye par
       ces fonctions (par exemple, fileno(3) retournera une erreur si elle est
       appelee avec un tel flux).

BOGUES

       Avant la glibc 2.7, un positionnement apres la fin d'un flux  cree  par
       open_memstream() n'agrandit pas le tampon ; l'appel a fseek() echoue et
       renvoie -1.

EXEMPLE

       Le programme  ci-dessous  utilise  fmemopen()  pour  ouvrir  un  tampon
       d'entree  et open_memstream() pour ouvrir un tampon de sortie de taille
       dynamique. Ce programme scrute  la  chaines  en  entree  (recuperee  du
       premier  argument  de  la  ligne  de  commande du programme) sous forme
       d'entiers, et ecrit le carre de ces entiers dans le tampon  de  sortie.
       Voici un exemple de la sortie produite par ce programme :

           $ ./a.out '1 23 43'
           size=11; ptr=1 529 1849

   Source du programme

       #define _GNU_SOURCE
       #include <string.h>
       #include <stdio.h>
       #include <stdlib.h>

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           FILE *out, *in;
           int v, s;
           size_t size;
           char *ptr;

           if (argc != 2) {
            fprintf(stderr, "Usage: %s <file>\n", argv[0]);
            exit(EXIT_FAILURE);
           }

           in = fmemopen(argv[1], strlen(argv[1]), "r");
           if (in == NULL)
               handle_error("fmemopen");

           out = open_memstream(&ptr, &size);
           if (out == NULL)
               handle_error("open_memstream");

           for (;;) {
               s = fscanf(in, "%d", &v);
               if (s <= 0)
                   break;

               s = fprintf(out, "%d ", v * v);
               if (s == -1)
                   handle_error("fprintf");
           }
           fclose(in);
           fclose(out);
           printf("size=%ld; ptr=%s\n", (long) size, ptr);
           free(ptr);
           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       fopen(3), fopencookie(3), feature_test_macros(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.27 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis 2010, cette traduction est maintenue a l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone       au       sein        du        projet        perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe  Blaess  <URL:http://www.blaess.fr/christophe/> (1996-2003),
       Alain Portal <URL:http://manpagesfr.free.fr/>  (2003-2006).   Florentin
       Duneau et l'equipe francophone de traduction de Debian (2006-2009).

       Veuillez   signaler   toute   erreur   de   traduction  en  ecrivant  a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.