Trang chủ » Bài 19 – File (Phần 2)
Lập trình C/C++

Bài 19 – File (Phần 2)

cplusplus

Xin chào mọi người!

Ở phần trước, mình đã giới thiệu qua về những thao tác trong file thô. Tuy nhiên trong thực tế, ta không chỉ thao tác với những file .txt đó. Bạn muốn tạo 1 phần mềm chỉnh sửa ảnh? Tất nhiên phần mềm phải biết đọc file định dạng .jpeg, .png, .tiff, .gif,… Bạn muốn tạo 1 phần mềm chỉnh sửa âm thanh? File bạn cần đọc dĩ nhiên phải là .mp3, .wav, .flac,… Tất cả những file không phải là định dạng văn bản đều phải được đọc như 1 file nhị phân (file binary).

1. Khái niệm

File binary là file được mã hoá dưới dạng nhị phân, bao gồm 1 chuỗi các byte (các bạn cứ tưởng tượng file binary giống như 1 chuỗi string dài vậy, và ta đang thao tác với 1 chuỗi dài đó).

Thao tác với file giống như mọi thao tác chuẩn I/O khác

INPUT -> XỬ LÝ -> OUTPUT

(Chuẩn I/O rất nhiều ở thực tế, giống như khi ta đưa cây mía vào máy xay nước mía (input), máy sẽ xay nát cây nước mía (process) và sau đó cho ra những ly nước mía ngọt lịm (output). Nói tới cái thèm nước mía quá 😛 ).

2. Thao tác với file binary

Giả sử file loichao.bin có nội dung như sau:

Xin chao moi nguoi, minh ten la Vo Hoai Son. Han hanh duoc lam quen!

Để mở 1 file nhị phân ta vẫn sử dụng phương thức open:

fstream fio;
// Đây là cú pháp mở file thô thông thường
fio.open("loichao.txt");
// Tuy nhiên nếu muốn mở file binary, ta cần phải thêm 1 tham số là flag binary
fio.open("loichao.bin", ios::binary);

Rõ ràng cách mở file vẫn không có gì khác biệt, ngoại trừ thêm 1 tham số flag (các flag có trong phương thức open() các bạn có thể xem ở đây).

Tuy nhiên, việc đọc và ghi file binary không giống như file thô. Bởi vì ta thao tác với từng byte, cho nên ta phải sử dụng 2 phương thức read() và write():

// Phương thức read sẽ đọc file binary theo số lượng byte truyền vào. 1 byte = 1 ký tự
string data;
fio.read(data, 5); // data chỉ lấy 5 kí tự = "Xin c"
// Để lấy toàn bộ nội dung file binary
fio.seekg(0, fio.end); // Di chuyển con trỏ từ đầu file đến cuối file
int size = fio.tellg(); // Đếm số byte từ đầu file -> con trỏ hiện hành. Ở đây là đếm tới cuối file
fio.seekg(0, fio.beg); // Sau khi đếm, ta phải di chuyển con trỏ về lại chỗ cũ để thao tác với file
fio.read(data, size);

Tất nhiên, việc ghi ra file cũng tương tự như việc đọc

// Phương thức write cũng ghi file theo số lượng byte truyền vào.
// Biến data lúc này đã có nội dung là nội dung của file loichao.bin
fio.write(data, 5); // File sẽ có nội dung "Xin c"
// Để ghi ra toàn bộ nội dung
fio.write(data, data.length()); // Sử dụng phương thức length() trong string để lấy ra chiều dài chuỗi.

Người ta bảo “học ăn học nói học gói học mở”. Có mở thì phải có đóng:

fio.close();

Việc đọc file binary thật sự không có gì khác biệt so với file thô, nếu các bạn nắm kĩ căn bản sẽ thấy rõ 🙂

Có nhiều bạn đến đây sẽ thắc mắc: “Sao bài hướng dẫn về File mà ngắn dữ vậy? Bộ thằng tác giả không biết viết nhiều lên sao?”. Thực tế, để thao tác với file chỉ cần mở nó ra, ghi/đọc file và đóng lại là hoàn tất. Quan trọng là bạn ghi những gì vào file/đọc những gì từ file, đó chính là tư duy lập trình của chính bạn. Thao tác với file đơn giản là mở nó ra, xử lý và đóng lại.

Trên đây là bài viết về File trong C++. Cảm ơn mọi người đã chú ý, và hẹn gặp lại ở những bài viết tiếp theo!

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment