Từ đầu khóa học, chúng ta luôn nhập dữ liệu từ bàn phím và hiển thị kết quả trực tiếp trên cửa sổ console. Tuy nhiên, trong một số kỳ thi lập trình (đặc biệt là ở Việt Nam) và trong công việc lập trình sau này, có những tình huống mà dữ liệu nhập vào rất lớn và không thể nhập bằng tay. Trong trường hợp đó, dữ liệu thường được tạo sẵn và đặt trong một file văn bản. Nhiệm vụ của người làm bài là đọc dữ liệu từ file đó, thiết kế thuật toán và sau đó ghi kết quả vào một file văn bản tương ứng (hoặc vẫn hiển thị kết quả trên cửa sổ console - tùy thuộc vào yêu cầu của bài toán). Rất may, ngôn ngữ C/C++ cung cấp những cú pháp đơn giản để thực hiện việc đọc - ghi dữ liệu từ file. Có hai phương pháp để làm điều này.
I. Sử dụng hàm freopen()
trong thư viện <cstdio>
Với những người sử dụng editor Code::Blocks, đặc biệt là trong lĩnh vực lập trình thi đấu, hàm freopen()
thực sự rất tiện lợi trong việc nhập xuất dữ liệu bằng file. Cú pháp sử dụng như sau:
Khi cần sử dụng nhập xuất dữ liệu bằng file, hàm này thường được lập trình viên thêm vào ở đầu của hàm main()
trong chương trình. Tuy nhiên, các đối số của nó có thể hơi phức tạp, vì vậy chúng ta sẽ phân tích chúng:
{Tên_file}
: Đây là tên của file dữ liệu được sử dụng để đọc dữ liệu đầu vào hoặc ghi kết quả ra. File này có thể có nhiều phần mở rộng khác nhau, chẳng hạn như .inp, .out, .dat, .in, .ou,... Tùy vào yêu cầu của đề bài mà chúng ta sử dụng định dạng tương ứng.{Định_dạng_nhập_xuất}
: Đây là một chữ cái quy định rằng file dữ liệu này được sử dụng cho mục đích gì. Có 5 định dạng nhập xuất sau đây:
Thông thường, trong lập trình thi đấu, chúng ta thường quan tâm đến hai định dạng là "r" và "w", vì dữ liệu chỉ được nhập từ một file và in ra một file khác cùng tên (nhưng khác phần mở rộng).
{Luồng_vào_ra}
: Đây là một trong hai luồngstdin
hoặcstdout
. Nếu file được sử dụng để đọc dữ liệu vào, ta chọn luồng làstdin
; ngược lại, nếu file được sử dụng để ghi kết quả ra, ta chọn luồng làstdout
.
Ví dụ minh họa: Dưới đây là một bài thi trong kỳ thi HSG Tin học với yêu cầu nhập dữ liệu từ file có phần mở rộng là .inp và in kết quả ra file có phần mở rộng là .out:
Đề bài yêu cầu nhập dữ liệu từ file Chinhphuong.inp
và đưa kết quả ra file Chinhphuong.out
sau khi tính toán. Vậy, ta chỉ cần thêm hai hàm freopen()
ở đầu hàm main()
:
II. Sử dụng các kiểu dữ liệu ifstream
, ostream
và fstream
trong thư viện <iostream>
1. Khai báo các file input và output
Ngoài cách sử dụng freopen()
, trong C++ còn có ba lớp được cung cấp sẵn để hỗ trợ đọc/ghi dữ liệu từ file:
ifstream
: Sử dụng để đọc dữ liệu từ file.ofstream
: Sử dụng để ghi dữ liệu ra file.fstream
: Sử dụng để vừa đọc và ghi dữ liệu bằng file.
Để sử dụng các lớp này, bạn cần khai báo hai thư viện: <iostream>
cho hai lớp ifstream
và ofstream
, và <fstream>
cho lớp fstream
. Sau đó, bạn có thể tạo một đối tượng để điều khiển file dữ liệu theo cú pháp sau:
Chẳng hạn, ta có thể khai báo ra ba biến kiểm soát file input và output như sau:
2. Mở một file để làm việc
Sau khi khai báo các đối tượng file, chúng ta cần mở nó ra để tiến hành đọc/ghi dữ liệu. Để làm việc này, ta sử dụng cú pháp: