Nhập xuất bằng tệp văn bản


Luồng nhập xuất

Ở lí thuyết và bài tập của các chương trước, ta đã quen với việc nhập dữ liệu qua một hộp thoại (console) và xuất dữ liệu cũng qua hộp thoại đó, đơn giản nhất là bài tập A cộng B.

Nhập xuất bài tập A cộng B

Cách nhập xuất này được gọi là nhập xuất chuẩn (standard input/output), có mô hình luồng nhập xuất như sau:

Mô hình nhập xuất chuẩn

Trong thực tế, thao tác nhập và xuất dữ liệu không chỉ giới hạn ở màn hình console. Tùy theo yêu cầu của chương trình, dữ liệu có thể được lấy vào từ tệp tin, từ mạng Internet hoặc từ các giao diện người dùng đồ họa. Tương tự, dữ liệu đầu ra cũng có thể được ghi vào tệp, hiển thị trên trình duyệt web hoặc gửi đến các thiết bị ngoại vi khác. Việc lựa chọn phương thức nhập/xuất phù hợp là một phần quan trọng trong thiết kế và triển khai phần mềm.

Hàm freopen

Để thực hiện việc nhập từ tệp văn bản (ví dụ: ACONGB.INP) và xuất kết quả ra một tệp khác (ví dụ: ACONGB.OUT), ta cần chuyển hướng luồng nhập và luồng xuất chuẩn của chương trình sang các tệp tin tương ứng. Khi đó, sơ đồ luồng dữ liệu có thể được mô tả như sau:

Mô hình nhập xuất qua tệp

Ngôn ngữ C++ cung cấp hàm freopen để hỗ trợ việc thay đổi luồng nhập và xuất một cách trực tiếp. Đây là một cách làm đơn giản, hiệu quả và rất phù hợp trong các bài tập lập trình.

Cú pháp chuyển luồng nhập sang tệp:

freopen(<tên_tệp>, "r", stdin);

Cú pháp chuyển luồng xuất sang tệp:

freopen(<tên_tệp>, "w", stdout);

Ví dụ

Nhập hai số \(a\)\(b\) từ tệp ACONGB.INP và xuất tổng \(a + b\) ra tệp ACONGB.OUT.

Mã nguồn

C++
#include <bits/stdc++.h>

using namespace std;

int a, b;

int main() {
    freopen("ACONGB.INP", "r", stdin);
    freopen("ACONGB.OUT", "w", stdout);

    cin >> a >> b;

    cout << a + b;

    return 0;
}

Trong đó:

  • Câu lệnh freopen("ACONGB.INP", "r", stdin); chuyển hướng luồng nhập chuẩn stdin thành luồng nhập từ file ACONGB.INP.
  • Câu lệnh freopen("ACONGB.OUT", "w", stdout); chuyển hướng luồng xuất chuẩn stdout thành luồng xuất ra file ACONGB.OUT.
  • Các câu lệnh cincout đều đã được điều hướng để nhập và xuất với các file ACONGB.INPACONGB.OUT.

Lưu ý

  • Tệp đầu vào phải tồn tại và nằm trong cùng thư mục với tệp chương trình .CPP, nếu không chương trình sẽ sinh ra lỗi.
  • Tệp đầu ra nếu chưa tồn tại thì sẽ được tự động tạo và đặt trong cùng thư mục với file .CPP