Faire un pointeur de fichier en lecture/écriture à un emplacement mémoire
Je peux faire un pointeur de fichier en écriture à un fichier avec fopen(). Mais ce que je peux faire un pointeur de fichier qui va faire en sorte d'appeler les fonctions telles que fputc ou fprintf écrira à un pointeur dans la mémoire? Un exemple de ceci est ByteArrayOutputStream en java. Aussi: je pourrais courir dans le sens inverse, où une bibliothèque a besoin d'un pointeur de fichier pour la lecture, j'ai donc allouer de la mémoire, et de faire un nouveau pointeur de fichier qui sera lu à partir de cet emplacement de la mémoire, mais de retour EOF lorsque la taille de la partie à court? (comme ByteArrayInputStream en Java). Est-il un moyen de le faire en C? Par exemple:
FILE *p = new_memory_file_pointer();
fprintf(p, "Hello World!\n");
char *data = get_written_stuff(p);
printf("%s", data); //will print Hello World!
&& /||
char s[] = "Hello World!\n";
FILE *p = new_memory_file_pointer_read(s, sizeof(s));
char *buffer = (char *)malloc( 1024*sizeof(char) );
fread((void *)buffer, 1, sizeof(s), p);
printf("%s", buffer); //prints Hello World!
EDIT: Pour ceux qui lisent cette question des années plus tard, en plus de la accepté de répondre, vous devriez regarder open_memstream(3)
, qui se comporte plus comme ces classes Java que fmemopen
n'.
- Juste pour être clair, lorsque vous utilisez
fopen()
, vous ne créez pas un pointeur vers le fichier, mais un pointeur vers une structure qui représente ce fichier. - M je sais. J'ai juste utilisé le terme de Pointeur de Fichier
- Double Possible de Comment faire pour écrire dans une mémoire tampon avec un FICHIER*?
- Êtes-vous sérieux en essayant de marquer un six-année-vieille question comme une copie d'un huit-année-vieille question qui n'a pas accepté de répondre?
- Ne pas les éditeurs ont de meilleures choses à faire avec leur temps?
Vous devez vous connecter pour publier un commentaire.
Si votre système d'exploitation fournit fmemopen,
il sera probablement répondre à vos fins.
En C++ (et que vous avez ajouté le C++ tag) vous pouvez écrire une fonction acceptant un arbitraire d'entrée/sortie de flux. Depuis
std::stringstream
oustd::ofstream
sont issus des classes, vous pouvez passer les deux de manière égale dans cette fonction. Un exemple:Et par analogie avec
std::istream
au lieu destd::ostream
si vous souhaitez lire les données:Comme Ise bien des points, il y a une fonction pour cette fmemopen dans POSIX 2008 et qui est pris en charge sous Linux. À l'aide de POSIX 2004, probablement la chose la plus proche que serait d'utiliser un fichier temporaire:
Il est plus facile de faire l'inverse; c'est, d'avoir une fonction qui écrit dans la mémoire et ensuite l'utiliser à la fois pour écrire dans la mémoire et aussi pour écrire dans un fichier. Vous pouvez utiliser mmap de sorte qu'une partie de la mémoire finit par être soutenu par un fichier et écrire dans cette mémoire écrit les données dans le fichier associé.
Si vous utilisez
std::istream
etstd::ostream
au lieu de la basse-niveau C de FICHIER* les objets, puis C++ offre idéalementstd::istringstream
etstd::ostringstream
pour lire/écrire des chaînes de caractères.Vous remarquerez que presque toutes les fonctions en C qui commencent par un "f" et qui fonctionnent sur les fichiers, ont des équivalents en commençant par "s" qui opèrent sur les chaînes. Un peut-être la meilleure approche serait de concevoir une interface d'e/S, qui n'est pas spécifique à des fichiers ou des chaînes, puis fournir des implémentations qui se connectent à des fichiers et des chaînes, respectivement. Puis appliquer votre logique de base en termes de cette interface, plutôt qu'en termes de bas-niveau C et C++ I/O. le Faire a aussi l'avantage de permettre des extensions futures, tels que le réseau de prise en charge de fichiers avec prise en charge intégrée pour la compression, la duplication, etc.
Avec un fichier mappé en mémoire. C'est de la plate-forme de sorte que vous aurez besoin de trouver de l'information sur la création d'mem fichiers mappés sur votre système cible(s). Je crois que la version posix est
mmap
. En tout cas, la recherche de "fichier mappé en mémoire" sur google devrait tourner un tas de l'aide.