Nội dung bài viết
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 hay game, 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

Với phần mềm, dường như không có phần mềm nào không thao tác 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

Bài viết này ra đời vì mục đích thêm 1 trường phái xử lý file sử dụng C++ thay vì C cho các bài viết của STDIO.

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

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

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

Các đối tượng, hàm dùng trong bài này được viết và thực thi tốt với Visual Studio 2015 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.

Đọc dữ liệu từ file

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

C++ la ngon ngu lap trinh co the tao ra hieu suat cao cho chuong trinh neu co 1 nen tang lap trinh tot.

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 <fstream>
#include <string>

using namespace std;

int main()
{
	fstream f;
	f.open("input.txt", ios::in);

	string data;
	getline(f, data);

	f.close();

	cout << data;
}

Như code trên ta cần thực hiện các bước như mở file, đọc dữ liệu, đóng file sau đó sử dụng dữ liệu tùy vào từng trường hợp (trong trường hợp này chỉ là in dữ liệu ra màn hình).

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 code (dòng 1, 2, 3).
  2. Mở file (dòng 10 và 11), lưu ý rằng có mở file thì phải có đóng file (dòng 15) sau khi đọc dữ liệu xong với input.txt là tên file cần đọc, ios::in là mục đích đọc file.
  3. Sau khi mở file ta sẽ đọc dữ liệu từ file vào string data (dòng 12, 13). Lưu ý 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 xem phần dưới của bài.
  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 15).

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

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
	fstream f;
	f.open("input.txt", ios::in);

	string data;

	string line;
	while (!f.eof())
	{
		getline(f, line);
		data += line;
	}

	f.close();

	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();
}

Với những lệnh 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