C-এ, আমরা রিডাইরেকশন (redirection) এর জন্য freopen() ফাংশন ব্যবহার করি। এই ফাংশন ব্যবহার করে, আমরা একটি বিদ্যমান FILE পয়েন্টারকে অন্য একটি স্ট্রিমে রিডাইরেক্ট করতে পারি। freopen-এর সিনট্যাক্স নিচের মতো:
FILE *freopen(const char* filename, const char* mode, FILE *stream)
C++-এও, আমরা রিডাইরেকশন করতে পারি। C++-এ স্ট্রিম (streams) ব্যবহার করা হয়। এখানে আমরা নিজস্ব স্ট্রিম ব্যবহার করতে পারি, এবং সিস্টেম স্ট্রিমগুলোও রিডাইরেক্ট করতে পারি। C++-এ তিন ধরনের স্ট্রিম রয়েছে:
- istream: শুধু ইনপুট সাপোর্ট করার স্ট্রিম
- ostream: শুধু আউটপুট সাপোর্ট করার স্ট্রিম
- iostream: ইনপুট এবং আউটপুট দুটোই সাপোর্ট করে
এই ক্লাসগুলো, এবং ফাইল স্ট্রিম ক্লাসগুলো ios এবং streambuf ক্লাস থেকে ডেরাইভড। তাই ফাইল স্ট্রিম এবং I/O স্ট্রিম অবজেক্ট একইভাবে বিহேভ করে। C++ স্ট্রিম বাফার (stream buffer) যেকোনো স্ট্রিমে সেট করার অনুমতি দেয়। তাই আমরা সহজে স্ট্রিমের সাথে জড়িত স্ট্রিম বাফার পরিবর্তন করে রিডাইরেক্ট করতে পারি। উদাহরণস্বরূপ, যদি দুটি স্ট্রিম A এবং B থাকে, এবং আমরা স্ট্রিম A কে স্ট্রিম B-এ রিডাইরেক্ট করতে চাই, তবে আমাদের এই ধাপগুলো ফলো করতে হবে:
- স্ট্রিম A-এর স্ট্রিম বাফার পাওয়া এবং সেটি সংরক্ষণ করা
- স্ট্রিম A-এর স্ট্রিম বাফারকে স্ট্রিম B-এর স্ট্রিম বাফার দিয়ে সেট করা
- স্ট্রিম A-এর স্ট্রিম বাফারকে এর পূর্বের অবস্থানে রিসেট করা (অপশনাল)
উদাহরণ কোড
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
fstream fs;
fs.open("abcd.txt", ios::out);
string lin;
// স্ট্রিম বাফার ব্যাকআপ নিন
streambuf* sb_cout = cout.rdbuf();
streambuf* sb_cin = cin.rdbuf();
// ফাইল স্ট্রিম বাফার পান
streambuf* sb_file = fs.rdbuf();
// এখন cout ফাইলকে পয়েন্ট করবে
cout.rdbuf(sb_file);
cout << "This string will be stored into the File" << endl;
// ব্যাকআপ থেকে পূর্বের বাফার ফেরত আনুন
cout.rdbuf(sb_cout);
cout << "Again in Cout buffer for console" << endl;
fs.close();
return 0;
}
আউটপুট (কনসোলে)
Again in Cout buffer for console
abcd.txt ফাইলে
This string will be stored into the File