Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Tìm hiểu, cách sử dụng fstream để xử lý file đơn giản trong C++. Trong các sản phẩm phần mềm, games, dường như không có phần mềm nào không xử lý với file, file là cách thức ta lưu trữ trạng thái của phần mềm trước khi ứng dụng được đóng.

Giới thiệu

Trong các sản phẩm phần mềm (game), dường như không có phần mềm nào không xử lý với file. Trong bài viết này, tôi sẽ hướng dẫn nhanh việc thao tác lưu trữ và lấy dữ liệu từ file thông qua thư viện C++ fstream.

Tiền đề bài viết

Xử lý file không khó, và mặc dù tôi vẫn thích sử dụng C để làm việc này hơn với thư viện stdio.h. Qua thời gian làm việc lâu dài với Vũ Quang Huy tôi biết thêm phương pháp đào tạo một con người từ mức trừu tượng cao nhất xuống đến chi tiết hóa vấn đề sẽ giúp họ hào hứng hơn. Nên tôi sử dụng fstream cho bài viết này.

Đối tượng hướng đến

Bài viết sẽ hướng dẫn bạn lưu trữ được dữ liệu từ ứng dụng xuống file và lấy dữ liệu từ file vào các biến (bộ nhớ) để thao tác. Các bạn phải biết các vấn đề cơ bản trong lập trình như khai báo biến và một ít kiến thức về hướng đối tượng.

Môi trường và thư viện fstream

Codes dùng để ví dụ cho bài viết này được viết và thực thi tốt với Visual Studio 2013 Community, các thư viện C++ bao gồm fstream, iostreamstring.

Để thao tác với file trong C++, ta có thể dùng ifstream cho việc đọc file, ofstream cho việc ghi file hoặc fstream cho cả 2 mục đích, trong trường hợp này tôi dùng fstream vì tính tiện lợi.

Đọc dữ liệu từ file

Giả sử ta có file input.txt với nội dung như sau

C++ la chuong trinh co ban. Cac tac gia da rat no luc de tao ra chuong trinh nay. Cam on cac ban da doc cac bai viet cua chung toi. Hay theo doi chung toi neu ban that su yeu thich.

Chương trình sau sẽ đọc dữ liệu trong file input.txt và thể hiện ra màn hình

#include <iostream>
#include <string>

// 1. Thêm thư viện fstream xử lý file vào
#include <fstream>

using namespace std;

int main()
{
	// 2. Mở file
	fstream f;
	f.open("input.txt", ios::in);

	// 3. Đọc dữ liệu từ file vào string data
	string data;
	getline(f, data);

	// 4. Đóng file
	f.close();

	// Thể hiện data ra màn hình
	cout << data;
}

Như codes trên ta cần thực hiện bước 1. 2. và 4. như một thủ tục, giai đoạn 3. là giai đoạn chính ta sẽ đọc dữ liệu từ file. Việc đọc dữ liệu từ file sẽ còn gặp rất nhiều vấn đề, trong trường hợp codes trên là trường hợp lý tưởng, việc xử lý nhập dữ liệu từ file chúng ta sẽ khảo sát kỹ sau.

Tóm tắt các bước thực hiện

  1. Chèn thư viện cần thiết để xử lý file vào codes (dòng 5).
  2. Mở file (dòng 12 và 13), lưu ý rằng có mở file thì phải có đóng file. input.txt là tên file ta sẽ lấy dữ liệu, ios::in là diễn đạt mục đích ta mở file là đọc file.
  3. Sau khi mở file ta sẽ đọc dữ liệu từ file vào string data (dòng 17). Lưu ý rằng, sẽ có nhiều vấn đề nảy sinh ở giai đoạn này, getline chỉ lấy 1 dòng trên file, nếu file có nhiều dòng ta cần nâng cấp mã nguồn.
  4. Đóng file, điều này cần lưu ý vì sẽ rất nhiều bạn chưa có kinh nghiệm sẽ dễ quên (dòng 20).

Đọc file nếu input.txt có nhiều dòng

#include <iostream>
#include <string>

// 1. Thêm thư viện fstream xử lý file vào
#include <fstream>

using namespace std;

int main()
{
	// 2. Mở file
	fstream f;
	f.open("input.txt", ios::in);

	// 3. Đọc dữ liệu từ file vào string data
	string data;

	// *** Đọc từng dòng và nối vào data
	string line;
	while (!f.eof())
	{
		getline(f, line);
		data += line;
	}

	// 4. Đóng file
	f.close();

	// Thể hiện data ra màn hình
	cout << data;
}

f.eof() sẽ kiểm tra xem đã kết thúc file chưa? Nếu chưa, ta tiếp tục lấy dữ liệu từ file vào line.

Ghi dữ liệu vào file

#include <iostream>
#include <string>

// 1. Thêm thư viện fstream xử lý file vào
#include <fstream>

using namespace std;

int main()
{
	// 2. Mở file
	fstream f;
	f.open("output.txt", ios::out);

	// 3. Ghi dữ liệu vào file, trường hợp này ta có data là dữ liệu
	string data = "Site: www.stdio.vn\nHo Ten: La Kien Vinh\nCong Viec: Dao Tao Lap Trinh Vien";
	f << data;

	// 4. Đóng file
	f.close();
}

Như codes trên ta cần thực hiện bước 1. 2. và 4. như một thủ tục, giai đoạn 3. là giai đoạn chính ta sẽ lưu dữ liệu mà ta có vào file.

Tóm tắt các bước thực hiện

  1. Chèn thư viện cần thiết để xử lý file vào codes (dòng 5).
  2. Mở file (dòng 12 và 13), lưu ý rằng có mở file thì phải có đóng file. output.txt là tên file ta sẽ lưu dữ liệu vào ios::out là diễn đạt mục đích ta mở file là muốn ghi file.
  3. Sau khi mở file ta sẽ ghi dữ liệu vào file một cách đơn giản (dòng 17). Lưu ý hướng của << nó mang ý nghĩa rằng, luồng dữ liệu sẽ đi từ string data vào file f.
  4. Đóng file, điều này cần lưu ý vì sẽ rất nhiều bạn chưa có kinh nghiệm sẽ dễ quên (dòng 20).

Một số vấn đề cần lưu ý

File được lưu ở đâu?

Với đường dẫn tuyệt đối, thì bạn có thể đặt file hoặc tìm file tại đường dẫn tuyệt đối đó.

Với đường dẫn tương đối (trường hợp này chúng ta sử dụng nhiều)

  • Nếu bạn thực thi chương trình thông qua Visual Studio file sẽ tại đường dẫn tương đối tính từ thư mục chứa project (*.vcxproj), hoặc Working Directory do bạn tùy chỉnh. Trong trường hợp bài viết này dành cho người mới học lập trình, tôi khuyên bạn không nên tìm hiểu sâu vấn đề này lúc này.
  • Nếu bạn thực thi chương trình thông qua việc tự gọi thực thi chương trình .exe của bạn thông qua click chuột hoặc enter thì sẽ là đường dẫn tương đối tính từ thư mục chứa file .exe.

Có thể dùng kiểu char, short, int, float, double thay vì string?

Có thể được, bạn có thể thay thế các kiểu dữ liệu cần thiết để đọc ghi thay vì chỉ dùng string. Ví dụ trong trường hợp ghi vào file 1 giá trị kiểu int.

int data = 6; // Thay vì string data = "chuoi du lieu"
f << data;

Xử lý file sẽ còn nhiều vấn đề phức tạp, bạn hãy làm quen với điều này trước.

Tham khảo

THẢO LUẬN
ĐÓNG