2009-07-24 7 views
5

Est-il possible en C/C++ de créer mon propre flux personnalisé de type FILE (stdio.h) qui peut être utilisé avec fputs() par exemple?type FILE personnalisé en C/C++

+1

Quelle langue utilisez-vous, C ou C++? –

+0

J'utilise l'API C++ qui nécessite un FICHIER * comme argument. –

+0

http://stackoverflow.com/questions/539537/memory-buffer-as-file/539608#539608 - est-ce que cela aide? –

Répondre

5

Si votre "flux personnalisé" n'est pas quelque chose que vous pouvez représenter avec un descripteur de fichier ou un descripteur de fichier, alors vous n'avez pas de chance. Le type FILE est défini par l'implémentation, il n'existe donc aucun moyen standard d'associer d'autres éléments à un autre.

Si vous pouvez obtenir un descripteur de fichier C pour tout ce que vous essayez d'écrire, vous pouvez appeler le fdopen pour le transformer en FILE*. Ce n'est pas le standard C ou C++, mais c'est Posix. Sur Windows, il est orthographié _fdopen.

Si vous utilisez Windows et que vous avez un HANDLE, vous pouvez utiliser _open_osfhandle pour y associer un descripteur de fichier, puis utiliser _fdopen à partir de cet emplacement.

Êtes-vous vraiment lié à fputs? Sinon, remplacez-le par l'utilisation d'un IOStream C++. Ensuite, vous pouvez fournir votre propre descendant de std::basic_streambuf, l'entourer d'un std::ostream et utiliser les E/S C++ standard.

+0

Merci beaucoup, cela fonctionne: CreatePipe() + _open_osfhandle() + fdopen() –

6

Non, ce n'est pas le cas. FILE est ce qui est connu comme un type opaque - il n'a rien que vous pouvez personnaliser.

+0

Alors comment Windows peut-il gérer les fichiers sur disque, les fichiers sur le réseau, les fichiers virtuels, ...? Certains aspects doivent être personnalisables. – xtofl

+1

Nommez alors. Le type FILE n'a aucun membre disponible pour le programmeur d'application. –

+0

@xtofl: car FICHIER * sur Windows correspond au HANDLE retourné par CreateFile. FICHIER * ne fait pas la "personnalisation" – MSalters

0

C'est possible. Mais vous devriez lier votre application avec votre version de fputs(), etc à la place de celles qui viennent avec les bibliothèques standard. La plupart des compilateurs sont liés aux bibliothèques d'E/S standard par défaut. Vous devez comprendre comment contourner cela.

+2

Il ne veut pas réécrire fputs(), il veut spécialiser FICHIER. Ou du moins c'est ma lecture. –

+0

Si je définis mon propre fputs(), tout appel de fputs() passera par mes fputs. –

1

Il n'y a pas de manière standard avec l'interface FILE. Notez que le code C++ devrait normalement utiliser IOStream pour IO, avec l'interface IOStream, écrire un streambuf personnalisé est la solution à votre problème.

Si vous pouvez abandonner la conformité standard, consultez la documentation de votre implémentation.

  • POSIX a une fonction popen() qui créent une lecture FILE * à partir de la sortie ou de l'écriture à l'entrée d'un processus;

  • POSIX a un fdopen() qui est capable de créer un FICHIER * à partir d'un descripteur de fichier;

  • Au moins pour la libc GNU utilisée par Linux, il est possible de définir un flux C personnalisé (voir la section "Programmation de vos flux personnalisés awn" dans la documentation info).

+0

Comment popen (0 résoudre le problème? –

+0

Nous ne savons pas assez sur le problème pour être sûr, nous savons juste qu'il doit passer un fichier * à une API.organiser son programme en deux ou plusieurs processus pourrait être un solution (engendrant un processus qui fait un popen() puis appelle l'API avec le résultat par exemple) – AProgrammer

+0

Je vois, merci pour la suggestion, mais je ne peux pas faire ça.L'API que j'utilise a aussi un contexte comme argument et Il peut être très difficile d'appliquer cette solution –

3

Si vous compilez avec la bibliothèque GNU C, vous pouvez utiliser fmemopen (3):

fmemopen, ouvert _ memstream, ouvert _ wmemstream - mémoire ouverte comme flux

Questions connexes