এরিক ম্যালেনফ্যান্টের দেওয়া উত্তর থেকে:
আফাইক, স্ট্যান্ডার্ড সি ++ এ করার কোনও উপায় নেই। আপনার প্ল্যাটফর্মের উপর নির্ভর করে, আপনার স্ট্যান্ডার্ড লাইব্রেরির প্রয়োগটি একটি ইনস্ট্রিপ্ট কনস্ট্রাক্টর ইনপুট হিসাবে একটি ফাইল বর্ণনাকারী গ্রহণ করতে পারে (একটি অমানুষিক এক্সটেনশন হিসাবে) অফার করতে পারে। (এটি libstdc ++, IIRC এর ক্ষেত্রে) বা একটি ফাইল *।
উপরোক্ত পর্যবেক্ষণ এবং নীচে আমার গবেষণার উপর ভিত্তি করে দুটি রূপে ওয়ার্কিং কোড রয়েছে; একটি libstdc ++ এর জন্য এবং অন্যটি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ এর জন্য।
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) কে পাশ দিয়ে তৈরি করি এবং তারপরে আমরা এটিকে ইসট্রিমের কনস্ট্রাক্টরকে বেসিক_স্ট্রিমবুফ (লাইন 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;
}
মাইক্রোসফ্ট ভিজ্যুয়াল সি ++
POSIX ফাইল বর্ণনাকারী নেওয়ার ক্ষেত্রে ifstream এর কনস্ট্রাক্টরের অ-মানক সংস্করণ ব্যবহৃত হত তবে এটি বর্তমান ডক্স এবং কোড থেকে উভয়ই অনুপস্থিত । যদি আইফ্রিমের কনস্ট্রাক্টর FILE * নিচ্ছে তার আর একটি অ-মানক সংস্করণ রয়েছে
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{
}
এবং এটি নথিভুক্ত করা হয়নি (এমনকি এটি উপস্থিত থাকবে এমন কোনও পুরানো নথিও আমি খুঁজে পাইনি)। আমরা পিসিক্স ফাইল হ্যান্ডেল থেকে সি স্ট্রিম ফাইল * পেতে _fdopen কল করার প্যারামিটারের সাথে এটি (লাইন 1) কল করি call
#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;
}