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

Bài 18 – File (Phần 1)

cplusplus

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

Với những bài toán, ta cần sử dụng các giá trị mà khi thoát chương trình, giá trị vẫn không bị tiêu huỷ (như lưu lại username và password,…). Tất nhiên, ta không thể lưu như 1 biến thông thường, vì nó sẽ lưu vào RAM và bị huỷ sau khi kết thúc chương trình.

Ở trường học, các thầy cô có nhắc đến về Cơ sở dữ liệu, và hôm nay mình cùng tìm hiểu về 1 “Cơ sở dữ liệu” căn bản nhất – đó chính là Tập tin (File). Đây là 1 khái niệm hết sức quan trọng và dường như các app, game đều không thể không có những thao tác xử lý với File.

Trước khi đến với File, ta cùng tìm hiểu về Dòng (stream) trong C++ nhé

1. Stream

C++ sử dụng stream để tổ chức việc nhập/xuất (I/O). Stream (mà mình vẫn thường hay gọi là buffer – các bạn xem lại ở bài Cin/Cout trong C++ để hiểu rõ), là 1 dãy các byte, và chúng ta kiểm soát I/O thông qua nó.

Trước đây ta đã học về thư viện iostream, đó chính là chuẩn I/O trên bàn phím, tức là ta nhập dữ liệu từ bàn phím, và xuất kết quả ra màn hình. Vậy giả sử ta không muốn in kết quả ra màn hình, mà in ra máy in thì phải làm sao? Rất may, C++ cũng hỗ trợ 1 thư viện fstreamiostream và fstream kế thừa từ 1 lớp chuẩn ios.

input-output

2. Thao tác với File

File là tập hợp của các thông tin, được lưu trữ ở bộ nhớ máy tính. Về mặt kĩ thuật lập trình, file có 2 dạng: file thô và file nhị phân. Tuy nhiên phần hôm nay mình sẽ nói về file thô.

File thô gồm các kí tự có mã ASCII từ 0 đến 255, ngoài ra có những kí tự đặc biệt như \r\n hay EOF (End of file). File thô kết thúc bằng kí tự EOF, nếu có các kí tự đằng sau thì được xem là rác, và không tính vào nội dung file. Thông thường file thô được lưu trên đĩa dưới dạng *.txt.

Để thao tác với file, trước hết ta cần phải include thư viện ifstream (nếu dùng để nhập vào file), ofstream (nếu dùng để xuất từ file) hoặc fstream nếu muốn kết hợp cả 2. Mình sẽ include fstream cho tiện nhé!

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

Xin chao moi nguoi, minh la Vo Hoai Son, biet danh khoai lang. So thich cua minh la chem gio, chem chuoi, chem trai cay cac kieu, nhung minh khong thich an chuoi.

Muốn thao tác với 1 file, đầu tiên ta cần phải mở file đã:

// Mở file
fstream fio;
fio.open("loichao.txt");

// Đọc file
string data;
getline(fio, data);

// Ghi file. Quen thuộc đúng không nào?
fio << "Minh ten Son, va day la dong thu 1\n";
fio << "Cac ban da xuong hang roi, day la dong thu 2";

// Đóng file
// Cần phải đóng file lại khi xử lý xong để tránh tình trạng crash chương trình khi đang chạy
fio.close();

Ở trên, ta đang mở 1 file loichao.txt được lưu tại project của chương trình hiện hành. Ngoài ra, ta có thể khai báo địa chỉ tuyệt đối (ví dụ như “D:/project/baitap/loichao.txt”).

Có lẽ có nhiều bạn sẽ thắc mắc, tại sao khi ghi file thì mình sử dụng toán tử <<, mà đọc file lại không sử dụng toán tử >>?

Ở bài Cin/Cout trong C++, mình đã nói về getline. Khi đưa chuỗi vào buffer, C++ xem dấu space như là dấu kết thúc dữ liệu, vì vậy nếu ta muốn lấy 1 khối dữ liệu hoàn chỉnh bao gồm cả ký tự space, ta cần sử dụng hàm getline.

Tuy nhiên, getline nó chỉ lấy khối dữ liệu và kết thúc khi gặp ký tự \n. Vậy nếu ta cần đọc file nhiều dòng thì phải làm sao? Rất đơn giản:

string currLine;
// Phương thức eof() cho phép ta nhận biết kí tự EOF có trong file
while (!fio.eof())
{
  getline(fio, currLine);
  data += currLine;
}

Các bạn có thể tìm hiểu thêm về I/O trong File bằng cách truy cập vào cplusplus.

Trên đây là bài viết về File – Phần 1. Cảm ơn các bạn đã theo dõi, và xin hẹn gặp lại ở những bài viết sau!

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