Trong thư viện fstream có ba lớp, được sử dụng để tạo, ghi hoặc đọc:
ofstream
: tạo tệp tin và ghi dữ liệu vào tệp tinifstream
: đọc dữ liệu từ tệp tinfstream
: là sự kết hợp giữa ofstream và ifstream —tạo
,ghi
vàđọc
1/ Tạo và ghi dữ liệu vào tệp tin
Ví dụ 1
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
// tao tep tin danh_sach_trai_cay.txt
ofstream tepTin("C:\\cpp\\danh_sach_trai_cay.txt");
// ghi du lieu vao tep tin danh_sach_trai_cay.txt
tepTin << "DANH SACH TRAI CAY\n";
tepTin << "1 \tCam\n";
tepTin << "2 \tQuyt\n";
tepTin << "3 \tBuoi";
// dong tep tin dang mo
tepTin.close();
}
Kết quả
DANH SACH TRAI CAY 1 Cam 2 Quyt 3 Buoi
Dòng 8: tạo
một tệp tin lưu ở C:\cpp\danh_sach_trai_cay.txt
, thao tác với biến tepTin
chính là thao táo với tệp tin này. Trong dòng này, ofstream
có thể thay bằng fstream
.
Lưu ý:
- Với máy tính sử dụng hệ điều hành Windows, đường dẫn khi lập trình trong C++ là
\\
thay vì\
- Với máy tính sử dụng các hệ điều hành Linux, MacOS, đường dẫn là
/
, ví dụ:/home/cpp/danh_sach_trai_cay.txt
- Nếu bỏ đường dẫn đến tệp tin, chẳng hạn
ofstream tepTin("danh_sach_trai_cay.txt")
, thì tệp tindanh_sach_trai_cay.txt
sẽ được tạo ở thư mục chứa tệp tin thực thi mã C++ sau khi biên dịch;
Dòng 11 đến 14: ghi
dữ liệu vào tệp tin danh_sach_trai_cay.txt
bằng toán tử <<
Dòng 17: đóng tệp tin đang thao tác để giải phóng bộ nhớ (RAM)
2/ Đọc dữ liệu từ tệp tin
Ví dụ 2
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
// mo tep tin can doc
ifstream docTepTin("C:\\cpp\\danh_sach_trai_cay.txt");
// dung while va ham getline de doc du lieu trong file theo tung dong
while (getline (docTepTin, dong)) {
cout << dong;
}
// Close the file
docTepTin.close();
}
Kết quả
DANH SACH TRAI CAY 1 Cam2 Quyt3 Buoi
Dòng 8: mở tệp tin cần đọc dữ liệu
Dòng 11 đến 13: đọc và xuất dữ liệu. Sử dụng vòng lặp while
kết hợp với getline
để đọc dữ liệu trong danh_sach_trai_cay.txt
, hàm getline
gán dòng hiện tại của docTepTin
được phân biệt bởi /n
cho biến dong
.
Dòng 16: đóng tệp tin đang thao tác để giải phóng bộ nhớ (RAM)
3/ Mở rộng
Append mode
Trong ví dụ 1, khi các em tạo tệp tin danh_sach_trai_cay.txt
để ghi dữ liệu, nếu tệp tin này đã tồn tại, thì toàn bộ dữ liệu trước đó trong nó sẽ bị mất.
Append mode là chế độ ghi dữ liệu vào cuối tệp tin, các dữ liệu trước đó của tệp tin vẫn được giữ nguyên, viết lại ví dụ 1 ở chế độ append mode như sau:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
// tao tep tin danh_sach_trai_cay.txt
ofstream tepTin;
tepTin.open("C:\\cpp\\danh_sach_trai_cay.txt", ios::app);
// ghi du lieu vao tep tin danh_sach_trai_cay.txt
tepTin << "DANH SACH TRAI CAY\n";
tepTin << "1 \tCam\n";
tepTin << "2 \tQuyt\n";
tepTin << "3 \tBuoi";
// dong tep tin dang mo
tepTin.close();
}
Các em sử dụng hàm open
với chế độ append mode ios::app
Prepend mode
Prepend mode là chế độ ghi dữ liệu vào đầu tệp tin, các dữ liệu trước đó của tệp tin vẫn được giữ nguyên. Mặc định C++ không hỗ trợ chế độ này, nhưng các em có thể thực hiện như sau:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
// doc tep tin danh_sach_trai_cay.txt
fstream tepTin("C:\\cpp\\danh_sach_trai_cay.txt");
// doc toan bo noi dung
string noiDungHienTai;
getline(tepTin, noiDungHienTai, '\0');
tepTin.close();
// mo lai tep tin danh_sach_trai_cay.txt
tepTin.open("C:\\cpp\\danh_sach_trai_cay.txt");
// ghi noi dung moi
tepTin << "Chao\n";
// ghi noi dung cu cua tep tin
tepTin << noiDungHienTai;
// dong tep tin dang mo
tepTin.close();
}
Các em chú ý dòng 11: tham số thứ 3
của hàm getline
là \0
, nếu tham số này chúng ta không thêm vào thì mặc định sẽ là \n
. Tham số này các em có thể điền bất kỳ chuỗi gì, nhưng để đọc được toàn bộ nội dung của tệp tin, các em cần điền chuỗi mà trong tệp tin đó không có.