Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chuyển hướng I/O (I/O Redirection) trong C++

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