thao-tac-voi-tep-tin-trong-cpp.png (206 KB)

Trong thư viện fstream có ba lớp, được sử dụng để tạo, ghi hoặc đọc:

  1. ofstream: tạo tệp tin và ghi dữ liệu vào tệp tin
  2. ifstream: đọc dữ liệu từ tệp tin
  3. fstream: là sự kết hợp giữa ofstream và ifstream tạo, ghiđọ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 tin danh_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;
    thao-tac-voi-tep-tin-trong-cpp-2.png (9 KB)

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\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ó.