Dalla risposta data da Éric Malenfant:
Per quanto ne so, non c'è modo di farlo in C ++ standard. A seconda della piattaforma, l'implementazione della libreria standard può offrire (come estensione non standard) un costruttore fstream che accetta un descrittore di file come input. (Questo è il caso di libstdc ++, IIRC) o di un FILE *.
Sulla base delle osservazioni precedenti e della mia ricerca di seguito, c'è un codice funzionante in due varianti; uno per libstdc ++ e un altro per Microsoft Visual C ++.
libstdc ++
C'è un __gnu_cxx::stdio_filebuf
modello di classe non standard che eredita std::basic_streambuf
e ha il seguente costruttore
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
con descrizione Questo costruttore associa un buffer del flusso di file a un descrittore di file POSIX aperto.
Lo creiamo passando l'handle POSIX (riga 1) e poi lo passiamo al costruttore di istream come basic_streambuf (riga 2):
#include <ext/stdio_filebuf.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream ofs("test.txt");
ofs << "Writing to a basic_ofstream object..." << endl;
ofs.close();
int posix_handle = fileno(::fopen("test.txt", "r"));
__gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::in); // 1
istream is(&filebuf); // 2
string line;
getline(is, line);
cout << "line: " << line << std::endl;
return 0;
}
Microsoft Visual C ++
C'era una versione non standard del costruttore di ifstream che accettava il descrittore di file POSIX, ma manca sia dalla documentazione corrente che dal codice. Esiste un'altra versione non standard del costruttore di ifstream che accetta FILE *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
e non è documentato (non sono riuscito nemmeno a trovare alcuna vecchia documentazione dove sarebbe stata presente). Lo chiamiamo (riga 1) con il parametro che è il risultato della chiamata a _fdopen per ottenere il FILE di flusso C * dall'handle del file POSIX.
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream ofs("test.txt");
ofs << "Writing to a basic_ofstream object..." << endl;
ofs.close();
int posix_handle = ::_fileno(::fopen("test.txt", "r"));
ifstream ifs(::_fdopen(posix_handle, "r")); // 1
string line;
getline(ifs, line);
ifs.close();
cout << "line: " << line << endl;
return 0;
}