C++ cung cấp các class stream để xử lý file theo hướng đối tượng: ofstream (ghi), ifstream (đọc), và fstream (đọc/ghi). Đây là cách hiện đại, an toàn hơn so với FILE* của C.
Các class chính
| Class | Header | Mục đích |
|---|---|---|
ofstream | <fstream> | Ghi file (output file stream) |
ifstream | <fstream> | Đọc file (input file stream) |
fstream | <fstream> | Đọc và ghi file |
Ví dụ: Ghi và đọc file văn bản
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// --- GHI FILE ---
ofstream fout("sample.txt");
if (!fout) {
cerr << "Không thể mở file để ghi!" << endl;
return 1;
}
string line;
cout << "Nhập nội dung (gõ -1 để kết thúc):\n";
while (getline(cin, line)) {
if (line == "-1") break;
fout << line << '\n';
}
fout.close(); // Tự động flush buffer
// --- ĐỌC FILE ---
ifstream fin("sample.txt");
if (!fin) {
cerr << "Không thể mở file để đọc!" << endl;
return 1;
}
cout << "\nNội dung file:\n";
while (getline(fin, line)) {
cout << line << endl;
}
fin.close();
return 0;
}
Các chế độ mở file (file mode flags)
| Flag | Ý nghĩa |
|---|---|
ios::in | Mở để đọc |
ios::out | Mở để ghi (xóa nội dung cũ) |
ios::app | Mở để ghi thêm vào cuối (append) |
ios::ate | Mở và di chuyển con trỏ đến cuối file |
ios::binary | Chế độ nhị phân (binary mode) |
ios::trunc | Xóa nội dung file nếu đã tồn tại (mặc định với out) |
Ví dụ mở file nhị phân để ghi thêm:
ofstream fout("data.bin", ios::binary | ios::app);
Kiểm tra trạng thái stream
fout.is_open(): Kiểm tra file đã mở thành công.fout.good(): Không có lỗi.fout.fail(): Có lỗi (sai format, hết đĩa...).fout.eof(): Đã đọc hết file (chỉ dành cho input).fout.bad(): Lỗi nghiêm trọng (hỏng stream).
Thực hành tốt (Best Practices)
- Luôn kiểm tra
is_open()sau khi mở file. - Sử dụng RAII: object stream tự đóng file khi ra khỏi scope (destructor gọi
close()). - Ưu tiên
getline()cho đọc dòng, tránhoperator>>cho chuỗi có khoảng trắng. - Với file nhị phân, dùng
read()/write()thay vì<</>>.