Malric Malenfant द्वारा दिए गए उत्तर से:
AFAIK, मानक C ++ में ऐसा करने का कोई तरीका नहीं है। आपके प्लेटफ़ॉर्म के आधार पर, मानक लाइब्रेरी का आपका कार्यान्वयन इनपुट के रूप में फ़ाइल डिस्क्रिप्टर लेते हुए एक फाल्ट कंस्ट्रक्टर के रूप में (एक अमानक एक्सटेंशन के रूप में) पेश कर सकता है। (यह 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 दृश्य C ++
POSIX फाइल डिस्क्रिप्टर लेने वाले ifstream के कंस्ट्रक्टर का गैर-मानक संस्करण हुआ करता था लेकिन यह वर्तमान डॉक्स और कोड से दोनों गायब है । इफस्ट्रीम के निर्माण का एक और गैर-मानक संस्करण है FILE *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
और यह प्रलेखित नहीं है (मैं किसी भी पुराने दस्तावेज़ को नहीं ढूंढ सका जहाँ यह मौजूद होगा)। हम इसे (लाइन 1) पैरामीटर के साथ बुलाते हैं _ पॉडिक्सन हैंडल से सी स्ट्रीम फ़ाइल * प्राप्त करने के लिए _fdopen को कॉल करने का परिणाम है ।
#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;
}