Trong C, ta dùng hàm freopen() để chuyển hướng. Hàm này chuyển con trỏ FILE hiện có sang luồng khác. Cú pháp:
FILE *freopen(const char* filename, const char* mode, FILE *stream)
Trong C++ cũng làm được chuyển hướng. C++ dùng stream. Ta có thể dùng stream riêng, cũng chuyển hướng stream hệ thống. Trong C++ có ba loại stream:
- istream: Stream chỉ hỗ trợ nhập
- ostream: Stream chỉ hỗ trợ xuất
- iostream: Dùng cho cả nhập và xuất
Các lớp này, và lớp file stream đều kế thừa từ ios và streambuf. Do đó file stream và IO stream object hoạt động tương tự. C++ cho phép đặt stream buffer cho bất kỳ stream nào. Vì vậy ta chỉ cần thay đổi stream buffer liên kết với stream để chuyển hướng. Ví dụ: có hai stream A và B, muốn chuyển A sang B, làm các bước:
- Lấy stream buffer của A, lưu lại
- Đặt stream buffer của A thành stream buffer của B
- Khôi phục stream buffer của A về vị trí cũ (tùy chọn)
Ví dụ Code
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
fstream fs;
fs.open("abcd.txt", ios::out);
string lin;
// Sao lưu stream buffer
streambuf* sb_cout = cout.rdbuf();
streambuf* sb_cin = cin.rdbuf();
// Lấy file stream buffer
streambuf* sb_file = fs.rdbuf();
// Giờ cout trỏ vào file
cout.rdbuf(sb_file);
cout << "This string will be stored into the File" << endl;
// lấy buffer trước từ bản sao
cout.rdbuf(sb_cout);
cout << "Again in Cout buffer for console" << endl;
fs.close();
return 0;
}
Kết quả
Again in Cout buffer for console
abcd.txt
This string will be stored into the File