.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2005, 2012, 2016 Michael Kerrisk .\" .\" SPDX-License-Identifier: GPL-1.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH fmemopen 3 "2 mai 2024" "Pages du manuel de Linux 6.8" .SH NOM fmemopen \- Ouvrir de la mémoire en tant que flux .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .P \fBFILE *fmemopen(void \fP\fItampon\fP\fB[.\fP\fItaille\fP\fB], size_t \fP\fItaille\fP\fB, const char *\fP\fImode\fP\fB);\fP .fi .P .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7)) : .RE .P \fBfmemopen\fP() : .nf Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L Avant la glibc 2.10 : _GNU_SOURCE .fi .SH DESCRIPTION La fonction \fBfmemopen\fP() ouvre un flux qui permet l'accès spécifié par \fImode\fP. Le flux permet d'effectuer des entrées/sorties sur la chaîne ou le tampon mémoire pointé par \fItampon\fP. .P L'argument \fImode\fP spécifie le mode d'ouverture du flux et peut avoir pour valeurs : .TP \fIr\fP Le flux est ouvert en lecture. .TP \fIw\fP Le flux est ouvert en écriture. .TP \fIa\fP Ajout ; le flux est ouvert en écriture, la position initiale du tampon étant définie au premier octet de valeur zéro. .TP \fIr+\fP Le flux est ouvert en lecture et en écriture. .TP \fIw+\fP Le flux est ouvert en lecture et en écriture. Le contenu du tampon est écrasé (autrement dit, \[aq]\e0\[aq] est placé dans le premier octet du tampon. .TP \fIa+\fP Ajout ; le flux est ouvert en lecture et écriture, la position initiale du tampon étant définie au premier octet de valeur zéro. .P 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 \fBfseek\fP(3) et obtenue à l'aide de \fBftell\fP(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 à \fItaille+1\fP. .P Si l'argument \fItampon\fP vaut NULL, alors la fonction \fBfmemopen\fP() alloue un tampon de \fItaille\fP 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 \fBopen_memstream\fP(3)). .P Si \fItampon\fP est différent de NULL, il doit pointer vers un tampon d'une taille minimale de \fItaille\fP octets alloués par l'appelant. .P Lorsqu'un flux ouvert en écriture est vidé (consultez \fBfflush\fP(3)), ou fermé (consultez \fBfclose\fP(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 \fItaille\fP en tient compte). .P Avec un flux ouvert en lecture, si le tampon contient des octets de valeur (\[aq]\e0\[aq]), 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 \fItaille\fP. .P 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). .P Essayer d'écrire plus de \fItaille\fP 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 \fIstdio\fP 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 : .P .in +4n .EX setbuf(flux, NULL); .EE .in .SH "VALEUR RENVOYÉE" En cas de succès, \fBfmemopen\fP() renvoie un pointeur de type \fIFILE\fP. Sinon, elle renvoie NULL et \fIerrno\fP contient le code d'erreur. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribut Valeur T{ .na .nh \fBfmemopen\fP(), T} Sécurité des threads MT\-Safe .TE .SH STANDARDS POSIX.1\-2008. .SH HISTORIQUE glibc 1.0.x. POSIX.1\-2008. .P .\" http://austingroupbugs.net/view.php?id=396 POSIX.1\-2008 spécifie que « b » dans \fImode\fP 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 ». .P .\" Avec la glibc 2.22, le mode binaire a été supprimé (voir ci\-dessous), de nombreux bogues anciens dans l'implémentation de \fBfmemopen\fP() ont été résolus et un nouveau symbole versionné a été créé pour cette interface. .SS "Mode binaire" De la glibc 2.9 à la glibc 2.21, l'implémentation dans la glibc de \fBfmemopen\fP() prenait en charge un mode « binaire » qui pouvait être activé en spécifiant la lettre « b » comme second caractère de \fImode\fP. 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 \fBSEEK_END\fP du troisième argument de \fBfseek\fP(3) est relative à la fin du tampon (c'est\-à\-dire la valeur spécifiée par l'argument \fItaille\fP), et non à la longueur de la chaîne courante. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=12836 Un bogue de l'API affectait l'implémentation du mode binaire : pour indiquer le mode binaire, le « b » doit être le \fIsecond\fP caractère de \fImode\fP. Ainsi, par exemple, « wb+ » a le comportement attendu, mais pas « w+b ». Ce n'était pas cohérent avec le traitement de \fImode\fP par \fBfopen\fP(3). .P Le mode binaire a été supprimé à partir de la version 2.22 de la glibc et un « b » spécifié dans \fImode\fP n'a dorénavant aucun effet. .SH NOTES Il n'y a pas de descripteur de fichier associé avec le flux renvoyé par cette fonction (par exemple, \fBfileno\fP(3) retournera une erreur si elle est appelée avec un tel flux). .SH BOGUES .\" http://sourceware.org/bugzilla/show_bug.cgi?id=11216 Avant la glibc 2.22, si \fItaille\fP est égale à zéro, \fBfmemopen\fP() échoue avec l'erreur \fBEINVAL\fP. 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. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=13152 Avant la glibc 2.22, indiquer un mode d'ajout (« a » ou « a+ ») pour \fBfmemopen\fP() 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. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=13151 Avant la glibc 2.22, si l'argument \fImode\fP de \fBfmemopen\fP() indiquait un ajout (« a » ou « a+ »), et si l'argument \fItaille\fP ne couvrait pas d'octet de valeur zéro dans \fItampon\fP, 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 \fBfmemopen\fP() de la glibc définissait la position du fichier à \fB\-1\fP. Ce bogue a été corrigé avec la glibc 2.22. .P .\" https://sourceware.org/bugzilla/show_bug.cgi?id=14292 Avant la glibc 2.22, lorsqu'un appel à \fBfseek\fP(3) avec une valeur de \fIdépart\fP égale à \fBSEEK_END\fP était effectué sur un flux créé à l'aide de \fBfmemopen\fP(), le \fIdécalage\fP était \fIsoustrait\fP à la position de fin de flux au lieu d'y être ajouté. Ce bogue a été corrigé à partir de la glibc 2.22. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=6544 L'ajout du mode « binaire » dans la glibc 2.9 pour \fBfmemopen\fP() a modifié silencieusement l'ABI : auparavant, \fBfmemopen\fP() ignorait « b » dans \fImode\fP. .SH EXEMPLES Le programme ci\-dessous utilise \fBfmemopen\fP() pour ouvrir un tampon d'entrée et \fBopen_memstream\fP(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\ : .P .in +4n .EX $\fB ./a.out \[aq]1 23 43\[aq]\fP taille=11; ptr=1 529 1849 .EE .in .SS "Source du programme" .\" SRC BEGIN (fmemopen.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& int main(int argc, char *argv[]) { FILE *out, *in; int v, s; size_t taille; char *ptr; \& if (argc != 2) { fprintf(stderr, "Utilisation : %s \[aq]...\[aq]\en", 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\en", taille, ptr); \& free(ptr); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "VOIR AUSSI" \fBfopen\fP(3), \fBfopencookie\fP(3), \fBopen_memstream\fP(3) .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Frédéric Hantrais et Lucien Gentis . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .