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\) và \(b\) từ tệp ACONGB.INP
và xuất tổng \(a + b\) ra tệp ACONGB.OUT
.
Mã nguồn
#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ẩnstdin
thành luồng nhập từ fileACONGB.INP
. - Câu lệnh
freopen("ACONGB.OUT", "w", stdout);
chuyển hướng luồng xuất chuẩnstdout
thành luồng xuất ra fileACONGB.OUT
. - Các câu lệnh
cin
vàcout
đều đã được điều hướng để nhập và xuất với các fileACONGB.INP
vàACONGB.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