Éric Malenfant'ın verdiği cevaptan:
AFAIK, bunu standart C ++ ile yapmanın bir yolu yok. Platformunuza bağlı olarak, standart kitaplığı uygulamanız (standart olmayan bir uzantı olarak) bir dosya tanımlayıcısını girdi olarak alan bir fstream kurucusu sunabilir. (Libstdc ++, IIRC için durum böyledir) veya bir DOSYA *.
Yukarıdaki gözlemlere ve aşağıda yaptığım araştırmaya dayanarak, çalışma kodunun iki çeşidi vardır; biri libstdc ++ için ve diğeri Microsoft Visual C ++ için.
libstdc ++
Aşağıdaki __gnu_cxx::stdio_filebuf
yapıcıyı devralan std::basic_streambuf
ve sahip olan standart olmayan bir sınıf şablonu var
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
with description Bu yapıcı, bir dosya akışı arabelleğini açık bir POSIX dosya tanımlayıcısıyla ilişkilendirir.
Bunu POSIX handleyini (1. satır) geçerek oluşturuyoruz ve sonra istream'in yapıcısına basic_streambuf (2. satır) olarak iletiyoruz:
#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 ++
Önceden POSIX dosya tanımlayıcısını alan ifstream yapıcısının standart olmayan bir sürümü vardı , ancak hem mevcut belgelerde hem de kodda eksik . İfstream'in kurucusunun FILE * alan standart olmayan başka bir sürümü daha var
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{
}
ve belgelenmemiş (mevcut olacağı herhangi bir eski belgeyi bile bulamadım). POSIX dosya tanıtıcısından C akış FILE * elde etmek için _fdopen çağrısının sonucu olan parametresi ile (1. satır) diyoruz .
#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;
}