Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
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> >>.