7
votes

Type de fichier personnalisé en C / C ++

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?

c c++

3 commentaires

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?


5 Réponses :


6
votes

Non, ce n'est pas le cas. Le fichier est ce que l'on appelle un type opaque - il n'a rien de personnaliser.


3 commentaires

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"



0
votes

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.


3 commentaires

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 () que vous avez surchargé - il y a plusieurs façons de le faire .



1
votes

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.

Si vous pouvez déposer une conformité standard, examinez la documentation de votre implémentation.

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

  • posix a une FDOPEN () qui est capable de créer un fichier * à partir d'un descripteur de fichier;

  • 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).


5 commentaires

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.



3
votes

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

fmemopen, open_memStream, open_wmemStream - Mémoire ouverte comme flux


0 commentaires

5
votes

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> est défini par la mise en œuvre, il n'ya donc aucun moyen standard d'associer d'autres choses avec une.

Si vous pouvez obtenir un descripteur de fichier C pour tout ce que vous essayez d'écrire, vous pouvez appeler fdopen dessus pour la transformer en un fichier * . Ce n'est pas standard C ou C ++, mais il est fourni par POSIX. Sous Windows, il est orthographié _fdopen . < / p>

Si vous utilisez Windows et que vous avez un gérer , vous pouvez utiliser _open_osfhandle pour associer un descripteur de fichier avec celui-ci, puis utilisez _fdopen de là.

Êtes-vous vraiment lié à FLCTS ? Sinon, remplacez-le avec l'utilisation d'un iostream C ++. Ensuite, vous pouvez fournir votre propre descendant de std :: basic_streambuf , enveloppez-le dans un std :: ostream et utilisez standard C ++ I / O sur elle.


1 commentaires

Merci beaucoup, cela fonctionne: CreativeEpipe () + _OPEN_OSFHANDLE () + FDOPEN ()