Xem thêm

Đọc/ghi File trong C++ | fstream trong C++

Huy Erick
Giới thiệu Việc đọc và ghi file trong ngôn ngữ lập trình C++ không phải là điều đáng sợ. Bài viết này sẽ cung cấp cho bạn những kiến thức cần biết về cách xử...

Giới thiệu

Việc đọc và ghi file trong ngôn ngữ lập trình C++ không phải là điều đáng sợ. Bài viết này sẽ cung cấp cho bạn những kiến thức cần biết về cách xử lý file trong C++ một cách chi tiết.

Xử lý file trong C++ là gì?

File là một đối tượng cơ bản dùng để lưu trữ dữ liệu liên quan của người dùng. Có nhiều loại file khác nhau được mô tả bằng các phần mở rộng tương ứng. Ví dụ: .txt (file văn bản), .cpp (file nguồn C++), .exe (file thực thi), .pdf (file tài liệu di động) và nhiều loại file khác.

Xử lý file là quá trình thao tác với file dữ liệu liên quan bằng một ngôn ngữ lập trình, và trong trường hợp này là C++. Điều này cho phép bạn lưu trữ dữ liệu trong một kho lưu trữ vĩnh viễn, ngay cả sau khi chương trình kết thúc thực thi của nó. Trong C++, thư viện fstream được cung cấp để xử lý file.

Trong bài viết này, chúng ta sẽ thảo luận về các class có thể triển khai thao tác đọc/ghi trên file. Tương tự như việc lấy input từ bàn phím và in dữ liệu ra màn hình console, bạn có thể sử dụng cin (character input stream) và cout (character output stream) của class istream và ostream. Tuy nhiên, file stream (fstream) hoạt động tương tự, chỉ khác là console được thay thế bằng một tập tin.

Thư viện fstream là gì?

Thư viện fstream cung cấp 3 class cho ngôn ngữ lập trình C++ để thực hiện các hoạt động đọc/ghi dữ liệu trên file. Các class này bao gồm:

  • Ofstream: Đại diện cho stream đầu ra, dùng để tạo và ghi thông tin vào file.
  • Ifstream: Đại diện cho stream đầu vào, dùng để đọc thông tin từ file dữ liệu.
  • Fstream: Đại diện cho một stream file, có tính năng của cả ofstream và ifstream. Vì vậy, nó có khả năng tạo, ghi và đọc dữ liệu trong file.

Để sử dụng tính năng xử lý file trong C++, bạn cần bao gồm hai header file là vào source file của chương trình C++.

Mở một File trong C++

Trước khi bạn có thể đọc hoặc ghi thông tin vào file, bạn phải mở file đó. Đối tượng ofstream hoặc fstream được sử dụng để mở file với mục đích ghi, trong khi đối tượng ifstream được sử dụng để mở file với mục đích đọc.

Dưới đây là cú pháp chuẩn cho hàm open(), một thành viên của các đối tượng fstream, ifstream và ofstream trong C++:

void open(const char *ten_file, ios::che_do);

Ở đây, tham số đầu tiên xác định tên và vị trí của file muốn mở, và tham số thứ hai của hàm open() định nghĩa chế độ mà file nên được mở.

Chế độ Miêu tả
ios::app Chế độ Append. Tất cả output được ghi thêm vào cuối file.
ios::ate Mở file và di chuyển con trỏ đọc/ghi tới cuối file.
ios::in Mở file để đọc.
ios::out Mở file để ghi.
ios::trunc Nếu file đã tồn tại, nội dung của nó sẽ bị cắt (truncate) trước khi mở file.

Bạn có thể kết hợp hai hoặc nhiều giá trị chế độ bằng cách sử dụng toán tử | (OR). Ví dụ, nếu bạn muốn mở file với mục đích ghi và muốn cắt nội dung của file nếu file đã tồn tại, bạn có thể sử dụng cú pháp như sau:

ofstream outfile;
outfile.open("ten_file.dat", ios::out | ios::trunc );

Tương tự, bạn cũng có thể mở file với mục đích đọc và ghi như sau:

fstream QTM;
QTM.open("ten_file.dat", ios::out | ios::in );

Đóng một File trong C++

Khi một chương trình C++ kết thúc, nó sẽ tự động đóng tất cả các stream, giải phóng tất cả bộ nhớ đã cấp phát và đóng tất cả các file đã mở. Tuy nhiên, đóng tất cả các file trước khi kết thúc chương trình là một thói quen tốt mà mọi lập trình viên nên tuân thủ.

Dưới đây là cú pháp chung cho hàm close() trong C++, một thành viên của các đối tượng fstream, ifstream và ofstream trong C++:

void close();

Ghi File trong C++

Trong quá trình lập trình C++, bạn có thể ghi thông tin vào một file từ chương trình của mình bằng cách sử dụng toán tử <<, tương tự như khi bạn sử dụng toán tử đó để in thông tin ra màn hình.

Tuy nhiên, điểm khác biệt duy nhất là bạn sử dụng đối tượng ofstream hoặc fstream trong C++ thay vì đối tượng cout trong C++.

Đọc một File trong C++

Bạn có thể đọc thông tin từ một file trong chương trình C++ của bạn bằng cách sử dụng toán tử >>, tương tự như khi bạn sử dụng toán tử đó để nhập thông tin từ bàn phím.

Điểm khác biệt là bạn sử dụng đối tượng ifstream hoặc fstream thay vì đối tượng cin trong C++.

Ví dụ về Đọc và Ghi file trong C++

Chương trình C++ dưới đây mở một file trong chế độ đọc và ghi. Sau khi ghi thông tin được nhập bởi người dùng vào file "qtm.dat", chương trình đọc thông tin từ file đó và hiển thị kết quả ra màn hình.

#include 
#include 
using namespace std;

int main () {
   char data[100];

   // Mở file trong chế độ ghi.
   ofstream outfile;
   outfile.open("qtm.dat");
   cout << "Ghi dữ liệu vào file!" << endl;
   cout << "Nhập tên của bạn: ";
   cin.getline(data, 100);

   // Ghi dữ liệu đã nhập vào file.
   outfile << data << endl;
   cout << "Nhập tuổi của bạn: ";
   cin >> data;
   cin.ignore(); // Bỏ qua các ký tự dư thừa từ lệnh đọc trước đó.

   // Ghi dữ liệu đã nhập vào file.
   outfile << data << endl;

   // Đóng file đã mở.
   outfile.close();

   // Mở file trong chế độ đọc.
   ifstream infile;
   infile.open("qtm.dat");
   cout << "============================" << endl;
   cout << "Đọc dữ liệu từ file!" << endl;

   // Đọc dữ liệu từ file và hiển thị lên màn hình.
   infile >> data;
   cout << data << endl;

   // Tiếp tục đọc và hiển thị dữ liệu.
   infile >> data;
   cout << data << endl;

   // Đóng file đã mở.
   infile.close();

   return 0;
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Kết quả sau khi đọc và Ghi file trong C++

Lưu ý: Ví dụ trên sử dụng các hàm bổ sung từ đối tượng cin, như hàm getline() để đọc một dòng từ bên ngoài và hàm ignore() để bỏ qua các ký tự dư thừa từ lệnh đọc trước đó.

Con trỏ vị trí File trong C++

Cả hai đối tượng istream và ostream cung cấp các hàm thành viên để xác định lại vị trí của con trỏ vị trí file. Các hàm thành viên này là seekg (viết tắt của seek get) cho istream và seekp (viết tắt của seek put) cho ostream trong C++.

Tham số cho seekg và seekp thường là một long int. Tham số thứ hai có thể được xác định để chỉ rõ hướng tìm kiếm. Hướng tìm kiếm có thể là ios::beg (mặc định) để xác định vị trí liên quan đến phần bắt đầu của một Stream, là ios::cur để xác định vị trí liên quan đến vị trí hiện tại của một Stream hoặc là ios::end để xác định vị trí liên quan đến phần kết thúc của một Stream trong C++.

Con trỏ vị trí file là một giá trị số nguyên xác định vị trí trong file, được tính toán bằng cách đếm số byte từ vị trí bắt đầu của file. Dưới đây là một số ví dụ về cách xác định vị trí của con trỏ vị trí file trong C++:

// Xác định vị trí byte thứ n trong file
doi_tuong_file.seekg( n );

// Xác định vị trí n byte sau vị trí hiện tại trong file
doi_tuong_file.seekg( n, ios::cur );

// Xác định vị trí n byte từ cuối file
doi_tuong_file.seekg( n, ios::end );

// Xác định vị trí tại cuối file
doi_tuong_file.seekg( 0, ios::end );

Theo Tutorialspoint

Bài trước: Interface trong C++ (Lớp trừu tượng)

Bài tiếp: Xử lý ngoại lệ (Exception Handling) trong C++

1