est-il possible dans C / C ++ de créer mon propre flux personnalisé de fichier de type (stdio.h) pouvant être utilisé avec FLCTS () par exemple? P>
5 Réponses :
Non, ce n'est pas le cas. Le fichier est ce que l'on appelle un type opaque - il n'a rien de personnaliser. P>
Ensuite, comment Windows peut-il gérer des fichiers sur disque, fichiers sur le réseau, fichiers virtuels, ...? Certains aspect doivent être personnalisables.
Nom un alors. Le type de fichier n'a aucun membre disponible pour le programmeur d'application.
@xtofl: Parce que le fichier * sur les cartes Windows sur la poignée renvoyée par Createefile. Fichier * ne fait pas la "personnalisation"
c'est possible. Mais vous devez relier votre application avec votre version de FLCTS (), etc. au lieu de ceux qui arrivent avec les bibliothèques standard. La plupart des compilateurs sont liés aux bibliothèques IO standard par défaut. Vous devez comprendre comment se déplacer. P>
Il ne veut pas ré-écrire des fput (), il souhaite spécialiser le fichier. Ou du moins c'est ma lecture.
Si je définis mes propres fns (), tout appel de FLCTS () passera par mes fns.
@Franckfreiburger Pas du tout. Vous pouvez reporter à la fputts () code> que vous avez surchargé - il y a plusieurs façons de le faire .
Il n'y a pas de manière standard avec l'interface de fichier. Notez que le code C ++ doit généralement utiliser iOSTream pour IO, avec l'interface iOSTREAM, écrire un streambuf personnalisé est la solution à votre problème. P>
Si vous pouvez déposer une conformité standard, examinez la documentation de votre implémentation. p>
posix a une fonction popen () qui crée un fichier * lecture de la sortie ou de l'écriture à l'entrée d'un processus; p> li>
posix a une FDOPEN () qui est capable de créer un fichier * à partir d'un descripteur de fichier; p> li>
au moins pour le GNU libc utilisé par Linux, il est possible de définir la section Custom C personnalisée (voir la section "Programmation de votre AWN Custom Wreve" dans la documentation d'informations). P> LI> ul>
Comment Popen (0 traite-t-il du problème?
Nous n'en savons pas assez sur le problème pour être sûr. Nous savons simplement qu'il doit passer un fichier * à une API. L'organisation de son programme dans deux processus ou plus pourrait être une solution (frayant un processus qui fait partie intégrante () puis appelle l'API avec le résultat par exemple).
Je vois, merci pour la suggestion, mais je ne peux pas faire ça. L'API que j'utilise a également un contexte comme argument et il pourrait être très difficile d'appliquer cette solution.
@Aprogrammer. Dans ce cas, Popen () est une réponse éventuelle à presque toutes les questions postées sur So - pas très utile, je me sens.
@Neil, vous lisez plus dans ma suggestion de popen () que prévu. Il était censé être un exemple de choses spécifiques au système disponibles. Je l'ai mis avant le flux personnalisé GNU libc simplement parce que être POSIX est plus standard. J'ai reformulé que l'entrée espère être plus claire et ajoutée FDOPEN () pour être un peu plus complète.
Si vous compilez avec la bibliothèque GNU C, vous pouvez utiliser FMEMOPEN (3): P>
fmemopen, open_memStream, open_wmemStream - Mémoire ouverte comme flux p> blockQuote>
Si votre "flux personnalisé" n'est pas quelque chose que vous pouvez représenter avec un descripteur de fichier ou une poignée de fichier, vous n'avez pas de chance. Le type code> (code> est défini par la mise en œuvre, il n'ya donc aucun moyen standard d'associer d'autres choses avec une. P>
Si vous pouvez obtenir un descripteur de fichier C pour tout ce que vous essayez d'écrire, vous pouvez appeler Si vous utilisez Windows et que vous avez un Êtes-vous vraiment lié à fdopen code> dessus pour la transformer en un fichier * code>. Ce n'est pas standard C ou C ++, mais il est fourni par POSIX. Sous Windows, il est orthographié _fdopen code> . < / p>
gérer code>, vous pouvez utiliser _open_osfhandle code> pour associer un descripteur de fichier avec celui-ci, puis utilisez _fdopen code> de là. p>
FLCTS CODE>? Sinon, remplacez-le avec l'utilisation d'un iostream C ++. Ensuite, vous pouvez fournir votre propre descendant de std :: basic_streambuf code>, enveloppez-le dans un std :: ostream code> et utilisez standard C ++ I / O sur elle. P>
Merci beaucoup, cela fonctionne: CreativeEpipe () + _OPEN_OSFHANDLE () + FDOPEN ()
Quelle langue utilisez-vous, C ou C ++?
J'utilise une API C ++ nécessitant un fichier * comme argument.
Stackoverflow.com/questions/539537/Memory-buffer- AS-File / ... - Est-ce que cela aide?