Из ответа Эрика Маленфана:
AFAIK, в стандартном С ++ нет возможности сделать это. В зависимости от вашей платформы ваша реализация стандартной библиотеки может предлагать (как нестандартное расширение) конструктор fstream, принимающий дескриптор файла в качестве входных данных. (Это относится к libstdc ++, IIRC) или FILE *.
На основании вышеизложенных наблюдений и моих исследований ниже есть рабочий код в двух вариантах; один для libstdc ++ и другой для Microsoft Visual C ++.
libstdc ++
Существует нестандартный шаблон класса __gnu_cxx::stdio_filebuf
, который наследует std::basic_streambuf
и имеет следующий конструктор
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
с описанием Этот конструктор связывает буфер файлового потока с открытым файловым дескриптором POSIX.
Мы создаем его, передав дескриптор POSIX (строка 1), а затем передаем его конструктору istream как basic_streambuf (строка 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 ++
Раньше была нестандартная версия конструктора ifstream, принимающего дескриптор файла POSIX, но он отсутствует в текущих документов и из кода. Есть еще одна нестандартная версия конструктора ifstream, принимающая FILE *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
и это не задокументировано (я даже не смог найти старую документацию, где она могла бы присутствовать). Мы вызываем его (строка 1) с параметром, являющимся результатом вызова _ fdopen, чтобы получить ФАЙЛ потока C * из дескриптора файла 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;
}
person
Piotr Dobrogost
schedule
09.03.2011
mmap
с файлом и отображать его содержимое как массив байтов. - person eigenfield   schedule 22.04.2020