Z odpowiedzi udzielonej przez Érica Malenfanta:
AFAIK, nie ma takiej możliwości w standardowym C ++. W zależności od platformy Twoja implementacja biblioteki standardowej może oferować (jako niestandardowe rozszerzenie) konstruktor fstream pobierający deskryptor pliku jako dane wejściowe. (Tak jest w przypadku libstdc ++, IIRC) lub PLIK *.
Bazując na powyższych obserwacjach i moich badaniach poniżej, kod działa w dwóch wariantach; jeden dla libstdc ++, a drugi dla Microsoft Visual C ++.
libstdc ++
Istnieje niestandardowy __gnu_cxx::stdio_filebuf
szablon klasy, który dziedziczy std::basic_streambuf
i ma następujący konstruktor
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
z opisem Ten konstruktor wiąże bufor strumienia plików z otwartym deskryptorem pliku POSIX.
Tworzymy go, przekazując uchwyt POSIX (linia 1), a następnie przekazujemy go do konstruktora istream jako basic_streambuf (linia 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);
istream is(&filebuf);
string line;
getline(is, line);
cout << "line: " << line << std::endl;
return 0;
}
Microsoft Visual C ++
Kiedyś istniała niestandardowa wersja konstruktora ifstream pobierającego deskryptor pliku POSIX, ale brakuje go zarówno w bieżącej dokumentacji, jak iw kodzie. Istnieje inna niestandardowa wersja konstruktora ifstream pobierająca PLIK *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{
}
i nie jest udokumentowane (nie mogłem nawet znaleźć żadnej starej dokumentacji, w której byłaby obecna). Nazywamy to (wiersz 1), a parametr jest wynikiem wywołania _fdopen w celu pobrania strumienia C PLIK * z uchwytu pliku 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"));
string line;
getline(ifs, line);
ifs.close();
cout << "line: " << line << endl;
return 0;
}