Maison >développement back-end >C++ >Comment créer un flux C à partir d'un descripteur de fichier POSIX ?

Comment créer un flux C à partir d'un descripteur de fichier POSIX ?

DDD
DDDoriginal
2024-12-20 17:45:14429parcourir

How to Create a C   fstream from a POSIX File Descriptor?

Comment construire un fstream C à partir d'un descripteur de fichier POSIX ?

La création d'un fstream C à partir d'un descripteur de fichier POSIX nécessite une réflexion. Bien que cela puisse paraître simple, la mise en œuvre peut être complexe.

Approche standard C

La bibliothèque C standard ne fournit pas de méthode directe pour créer un fstream à partir d'un descripteur de fichier. Cependant, certaines implémentations, telles que libstdc , peuvent proposer un constructeur d'extension non standard qui accepte un descripteur de fichier ou un pointeur FILE* en entrée.

Solution Libstdc

Libstdc fournit le __gnu_cxx :: Modèle de classe stdio_filebuf, qui hérite de std::basic_streambuf et possède un constructeur qui associe un flux tampon avec un descripteur de fichier POSIX :

stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))

Un exemple utilisant ce constructeur :

#include <ext/stdio_filebuf.h> // Libstdc++ extension
#include <iostream>

int main() {
    ...

    int posix_handle = ...;

    __gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::in);
    istream is(&filebuf);

    ...

Solution Microsoft Visual C

Microsoft Visual C propose également un tampon non standard Constructeur ifstream qui accepte un pointeur FILE* :

explicit basic_ifstream(_Filet *_File);

Vous pouvez utiliser ce constructeur avec _fdopen pour créer un ifstream à partir d'un descripteur de fichier :

#include <cstdio>
#include <iostream>

int main() {
    ...

    int posix_handle = ...;

    FILE* c_stream = _fdopen(posix_handle, "r");
    ifstream ifs(c_stream);

    ...

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn