Dari jawaban yang diberikan oleh Éric Malenfant:
AFAIK, tidak ada cara untuk melakukan ini dalam C ++ standar. Bergantung pada platform Anda, implementasi library standar Anda mungkin menawarkan (sebagai ekstensi nonstandar) konstruktor fstream yang menggunakan deskriptor file sebagai input. (Ini adalah kasus untuk libstdc ++, IIRC) atau FILE *.
Berdasarkan pengamatan di atas dan penelitian saya di bawah ini ada kode yang berfungsi dalam dua varian; satu untuk libstdc ++ dan satu lagi untuk Microsoft Visual C ++.
libstdc ++
Ada __gnu_cxx::stdio_filebuf
template kelas non-standar yang mewarisi std::basic_streambuf
dan memiliki konstruktor berikut
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
dengan deskripsi Konstruktor ini mengaitkan buffer aliran file dengan deskriptor file POSIX yang terbuka.
Kami membuatnya melalui pegangan POSIX (baris 1) dan kemudian kami meneruskannya ke konstruktor istream sebagai basic_streambuf (baris 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 ++
Dulu ada versi non-standar dari konstruktor ifstream yang mengambil deskriptor file POSIX tetapi tidak ada baik dari dokumen saat ini maupun dari kode. Ada versi non-standar lain dari konstruktor ifstream yang menggunakan FILE *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
dan tidak didokumentasikan (saya bahkan tidak dapat menemukan dokumentasi lama yang akan menampilkannya). Kami menyebutnya (baris 1) dengan parameter yang merupakan hasil dari pemanggilan _fdopen untuk mendapatkan C stream FILE * dari pegangan 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;
}