Man page - fmemopen(3)

Packages contains this manual

Available languages:

en fr ja

Manual

fmemopen

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
Mode binaire
NOTES
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

fmemopen - Ouvrir de la mémoire en tant que flux

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <stdio.h>

FILE *fmemopen(void tampon [. taille ], size_t taille , const char * mode );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

fmemopen () :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE

DESCRIPTION

La fonction fmemopen () ouvre un flux qui permet l’accĂšs spĂ©cifiĂ© par mode . Le flux permet d’effectuer des entrĂ©es/sorties sur la chaĂźne ou le tampon mĂ©moire pointĂ© par tampon .

L’argument mode spĂ©cifie le mode d’ouverture du flux et peut avoir pour valeurs :

r

Le flux est ouvert en lecture.

w

Le flux est ouvert en écriture.

a

Ajout ; le flux est ouvert en écriture, la position initiale du tampon étant définie au premier octet de valeur zéro.

r+

Le flux est ouvert en lecture et en écriture.

w+

Le flux est ouvert en lecture et en écriture. Le contenu du tampon est écrasé (autrement dit, '\0' est placé dans le premier octet du tampon.

a+

Ajout ; le flux est ouvert en lecture et écriture, la position initiale du tampon étant définie au premier octet de valeur zéro.

Le flux conserve la notion de position actuelle qui est l’endroit du tampon oĂč la prochaine opĂ©ration d’entrĂ©e/sortie aura lieu. La position actuelle est automatiquement mise Ă  jour par les opĂ©rations d’entrĂ©es/sorties. Elle peut aussi ĂȘtre dĂ©finie de maniĂšre explicite Ă  l’aide de fseek (3) et obtenue Ă  l’aide de ftell (3). Dans tous les modes autres que Ajout, la position actuelle est initialisĂ©e au dĂ©but du tampon. En mode Ajout, si aucun octet de valeur zĂ©ro n’est trouvĂ© dans le tampon, la position actuelle est initialisĂ©e Ă  taille+1 .

Si l’argument tampon vaut NULL, alors la fonction fmemopen () alloue un tampon de taille octets. C’est utile pour les applications qui veulent Ă©crire des donnĂ©es dans un tampon temporaire et les lire ensuite. La position initiale est dĂ©finie au dĂ©but du tampon. Le tampon est automatiquement supprimĂ© lorsque le flux est fermĂ©. Notez que l’appelant ne peut pas obtenir de pointeur vers le tampon temporaire allouĂ© avec cette fonction (voir Ă  ce sujet open_memstream (3)).

Si tampon est diffĂ©rent de NULL, il doit pointer vers un tampon d’une taille minimale de taille octets allouĂ©s par l’appelant.

Lorsqu’un flux ouvert en Ă©criture est vidĂ© (consultez fflush (3)), ou fermĂ© (consultez fclose (3)), un octet nul est Ă©crit Ă  la fin du tampon s’il y a de la place. Pour ce faire, l’appelant doit s’assurer qu’un octet supplĂ©mentaire est disponible dans le tampon (et que taille en tient compte).

Avec un flux ouvert en lecture, si le tampon contient des octets de valeur ('\0'), les opĂ©rations de lecture ne renverront pas une indication de fin de fichier. Une lecture depuis le tampon n’indiquera la fin du fichier que lorsque la position actuelle du tampon aura atteint la valeur taille .

Les opĂ©rations d’écriture s’effectuent soit Ă  la position actuelle (pour les modes autres que Ajout), ou Ă  une position correspondant Ă  la taille du flux (pour les mode Ajout).

Essayer d’écrire plus de taille octets dans le tampon crĂ©e une erreur. Par dĂ©faut, de telles erreurs ne seront visibles (en l’absence de donnĂ©es) que lorsque le tampon stdio sera vidĂ©. DĂ©sactiver cette mise en tampon avec l’appel suivant peut s’avĂ©rer utile pour dĂ©tecter les erreurs au moment d’une opĂ©ration de sortie :

setbuf(flux, NULL);

VALEUR RENVOYÉE

En cas de succùs, fmemopen () renvoie un pointeur de type FILE . Sinon, elle renvoie NULL et errno contient le code d’erreur.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3880728-1.png

STANDARDS

POSIX.1-2008.

HISTORIQUE

glibc 1.0.x. POSIX.1-2008.

POSIX.1-2008 spĂ©cifie que « b » dans mode sera ignorĂ©. Cependant, Technical Corrigendum 1 ajuste la norme pour permettre un traitement spĂ©cifique Ă  l’implĂ©mentation dans ce cas, permettant ainsi Ă  la glibc de traiter « b ».

Avec la glibc 2.22, le mode binaire a Ă©tĂ© supprimĂ© (voir ci-dessous), de nombreux bogues anciens dans l’implĂ©mentation de fmemopen () ont Ă©tĂ© rĂ©solus et un nouveau symbole versionnĂ© a Ă©tĂ© créé pour cette interface.

Mode binaire

De la glibc 2.9 Ă  la glibc 2.21, l’implĂ©mentation dans la glibc de fmemopen () prenait en charge un mode « binaire » qui pouvait ĂȘtre activĂ© en spĂ©cifiant la lettre « b » comme second caractĂšre de mode . Dans ce mode, les opĂ©rations d’écriture n’ajoutaient pas de maniĂšre implicite l’octet de valeur zĂ©ro terminal, et la valeur SEEK_END du troisiĂšme argument de fseek (3) est relative Ă  la fin du tampon (c’est-Ă -dire la valeur spĂ©cifiĂ©e par l’argument taille ), et non Ă  la longueur de la chaĂźne courante.

Un bogue de l’API affectait l’implĂ©mentation du mode binaire : pour indiquer le mode binaire, le « b » doit ĂȘtre le second caractĂšre de mode . Ainsi, par exemple, « wb+ » a le comportement attendu, mais pas « w+b ». Ce n’était pas cohĂ©rent avec le traitement de mode par fopen (3).

Le mode binaire a Ă©tĂ© supprimĂ© Ă  partir de la version 2.22 de la glibc et un « b » spĂ©cifiĂ© dans mode n’a dorĂ©navant aucun effet.

NOTES

Il n’y a pas de descripteur de fichier associĂ© avec le flux renvoyĂ© par cette fonction (par exemple, fileno (3) retournera une erreur si elle est appelĂ©e avec un tel flux).

BOGUES

Avant la glibc 2.22, si taille est Ă©gale Ă  zĂ©ro, fmemopen () Ă©choue avec l’erreur EINVAL . Il est plus cohĂ©rent dans ce cas de crĂ©er un flux renvoyant la fin de fichier au premier essai de lecture, et c’est ce que fait l’implĂ©mentation de la glibc depuis la glibc 2.22.

Avant la glibc 2.22, indiquer un mode d’ajout (« a » ou « a+ ») pour fmemopen () dĂ©finit la position initiale du fichier au premier octet de valeur zĂ©ro, mais ne force pas l’ajout des Ă©critures suivantes Ă  la fin du flux si la position actuelle dans le fichier est rĂ©initialisĂ©e Ă  un autre endroit que la fin du flux. Ce bogue a Ă©tĂ© corrigĂ© avec la glibc 2.22.

Avant la glibc 2.22, si l’argument mode de fmemopen () indiquait un ajout (« a » ou « a+ »), et si l’argument taille ne couvrait pas d’octet de valeur zĂ©ro dans tampon , alors, d’aprĂšs POSIX.1-2008, la position initiale du fichier devait ĂȘtre dĂ©finie Ă  l’octet qui suit la fin du tampon. Dans ce cas cependant, l’implĂ©mentation de fmemopen () de la glibc dĂ©finissait la position du fichier Ă  -1 . Ce bogue a Ă©tĂ© corrigĂ© avec la glibc 2.22.

Avant la glibc 2.22, lorsqu’un appel Ă  fseek (3) avec une valeur de dĂ©part Ă©gale Ă  SEEK_END Ă©tait effectuĂ© sur un flux créé Ă  l’aide de fmemopen (), le dĂ©calage Ă©tait soustrait Ă  la position de fin de flux au lieu d’y ĂȘtre ajoutĂ©. Ce bogue a Ă©tĂ© corrigĂ© Ă  partir de la glibc 2.22.

L’ajout du mode « binaire » dans la glibc 2.9 pour fmemopen () a modifiĂ© silencieusement l’ABI : auparavant, fmemopen () ignorait « b » dans mode .

EXEMPLES

Le programme ci-dessous utilise fmemopen () pour ouvrir un tampon d’entrĂ©e et open_memstream (3) pour ouvrir un tampon de sortie de taille dynamique. Ce programme scrute la chaĂźne en entrĂ©e (rĂ©cupĂ©rĂ©e du premier argument de la ligne de commande du programme) sous forme d’entiers, et Ă©crit le carrĂ© de ces entiers dans le tampon de sortie. Voici un exemple de la sortie produite par ce programme :

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

Source du programme

#define _GNU_SOURCE
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
FILE *out, *in;
int v, s;
size_t taille;
char *ptr;
if (argc != 2) {
fprintf(stderr, "Utilisation : %s '<num>...'\n", argv[0]);
exit(EXIT_FAILURE);
}
in = fmemopen(argv[1], strlen(argv[1]), "r");
if (in == NULL)
err(EXIT_FAILURE, "fmemopen");
out = open_memstream(&ptr, taille);
if (out == NULL)
err(EXIT_FAILURE, "open_memstream");
for (;;) {
s = fscanf(in, "%d", &v);
if (s <= 0)
break;
s = fprintf(out, "%d ", v * v);
if (s == -1)
err(EXIT_FAILURE, "fprintf");
}
fclose(in);
fclose(out);
printf("taille=%zu; ptr=%s\n", taille, ptr);
free(ptr);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

fopen (3), fopencookie (3), open_memstream (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .