Aus der Antwort von Éric Malenfant:
AFAIK, dies ist in Standard-C ++ nicht möglich. Abhängig von Ihrer Plattform bietet Ihre Implementierung der Standardbibliothek möglicherweise (als nicht standardmäßige Erweiterung) einen fstream-Konstruktor, der einen Dateideskriptor als Eingabe verwendet. (Dies ist der Fall für libstdc ++, IIRC) oder eine DATEI *.
Basierend auf den obigen Beobachtungen und meinen Recherchen unten gibt es Arbeitscode in zwei Varianten; eine für libstdc ++ und eine für Microsoft Visual C ++.
libstdc ++
Es gibt eine nicht standardmäßige __gnu_cxx::stdio_filebuf
Klassenvorlage, die std::basic_streambuf
den folgenden Konstruktor erbt und hat
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
mit Beschreibung Dieser Konstruktor ordnet einen Dateistream-Puffer einem geöffneten POSIX-Dateideskriptor zu.
Wir erstellen es über das POSIX-Handle (Zeile 1) und übergeben es dann als basic_streambuf (Zeile 2) an den Konstruktor von istream:
#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 ++
Früher gab es eine nicht standardmäßige Version des Konstruktors von ifstream, die den POSIX-Dateideskriptor verwendet, aber er fehlt sowohl in aktuellen Dokumenten als auch im Code. Es gibt eine andere nicht standardmäßige Version des Konstruktors von ifstream, die FILE * verwendet
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
und es ist nicht dokumentiert (ich konnte nicht einmal eine alte Dokumentation finden, in der es vorhanden wäre). Wir nennen es (Zeile 1), wobei der Parameter das Ergebnis des Aufrufs von _fdopen ist , um den C-Stream FILE * vom POSIX- Dateihandle abzurufen .
#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;
}