Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Xử lý tệp (File Handling) qua Class trong C++

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

ClassHeaderMụ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::inMở để đọc
ios::outMở để ghi (xóa nội dung cũ)
ios::appMở để ghi thêm vào cuối (append)
ios::ateMở và di chuyển con trỏ đến cuối file
ios::binaryChế độ nhị phân (binary mode)
ios::truncXó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)

  1. Luôn kiểm tra is_open() sau khi mở file.
  2. Sử dụng RAII: object stream tự đóng file khi ra khỏi scope (destructor gọi close()).
  3. Ưu tiên getline() cho đọc dòng, tránh operator>> cho chuỗi có khoảng trắng.
  4. Với file nhị phân, dùng read()/write() thay vì <</>>.