Cùng tìm hiểu về fstream, ifstream và ofstream trong C++. Đây là các class mới được thêm vào trong C++ giúp việc thao tác với file trong C++ trở nên dễ dàng hơn so với các phương pháp truyền thống được kế thừa từ ngôn ngữ C.
Bài viết này sẽ chú trọng về các class giúp xử lý file mới được thêm vào trong C++. Về các phương pháp xử lý file được kế thừa từ ngôn ngữ C, bạn có thể tham khảo tại bài viết sau:
- Xem thêm: Xử lý file trong C++
Phương pháp xử lý file mới trong C++
Ngoài việc sử dụng thư viện chuẩn nhập xuất file được kế thừa từ ngôn ngữ C thì trong C++ có thêm 3 class phục vụ cho việc nhập xuất file là ifstream ,ofstream và fstream.
Trong đó:
- ifstream dùng để nhập file trong C++
- ofstream dùng để xuất file trong C++
- fstream được gộp lại từ 2 class trên, dùng để nhập xuất file trong C++
Để dùng được 3 class này, chúng ta cần phải include các header file tương ứng có cùng tên là ifstream ,ofstream và fstream vào đầu chương trình.
Để xử lý file trong C++ bằng 3 class này, trước hết chúng ta dùng 3 class này để tạo ra stream : luồng chứa thông tin về file, sau đó sử dụng các hàm và phương thức được tích hợp trong các class để thực hiện thao tác file.
Tương ứng với từng loại stream được tạo ra từ các class trên mà chúng ta chỉ có thể đọc, hoặc chỉ có thể ghi, hoặc có thể vừa đọc vừa ghi file chỉ định
Và chúng ta sẽ cùng làm rõ về các class này dưới đây.
fstream trong C++
fstream là một class có chức năng nhập xuất file trong C++. fstream được viết tắt từ các cụm từ file và stream trong tiếng Anh, dịch sang tiếng Việt có nghĩa là luồng file.
fstream được gộp lại từ 2 class là ofstream và ifstream, do vậy bằng cách sử dụngfstream, chúng ta có thể sử dụng tất cả các chức năng của 2 class ofstream và ifstream mà Kiyoshi sẽ hướng dẫn ở phần sau.
Điều đó có nghĩa là với fstream , chúng ta có thể xử lý đồng thời việc đọc và file trong C++.
Lưu ý là để sử dụng được fstream trong C++, chúng ta cần include header file fstream vào đầu chương trình.
ofstream trong C++
ofstream trong C++ là gì
ofstream là một class cung cấp chức năng của một luồng file đầu ra. ofstream được viết tắt từ các cụm từ out, file và stream trong tiếng Anh, dịch sang tiếng Việt có nghĩa là luồng file đầu ra.
Giống như trong C chúng ta mở file bằng cách tạo ra một cấu trúc FILE để chứa thông tin của file cần đọc, thì trong C++ chúng ta dùng class ofstream để tạo ra một thực thể stream (instance) chứa thông tin về file cần mở, và sau đó thao tác với file thông qua stream này.
Và stream tạo ra bởi ofstream sẽ có tác dụng ghi file trong C++.
Lưu ý là để sử dụng được fstream trong C++, chúng ta cần include header file fstream hoặc là ofstream vào đầu chương trình.
Mở file để ghi bằng ofstream
Để sử dụng ofstream, trước hết chúng ta cần thêm header file fstream vào chương trình, sau đó thì sử dụng cú pháp sau đây để mở file để ghi bằng ofstream trong C++,
std::ofstream ofs(filepath);
Trong đó filepath
là đường dẫn của file cần mở và ofs
là stream được tạo ra nếu mở file thành công.
Nếu mở file thành công bằng ofstream thì ofs
sẽ được trả về. Tuy nhiên nếu mở file thất bại thì ofs
sẽ không tồn tại.
Chúng ta cần phải ghi tên namespace chứa ofstream là std vào trước tên class. Tuy nhiên chúng ta cũng có thể rút gọn tên của namespace này bằng cách chỉ định namespace đầu chương trình:
using namespace std; |
Ví dụ:
|
Xử lý lỗi khi mở file thất bại bằng ofstream
Trong chương trình không phải lúc nào chúng ta cũng có thể mở được file, ví dụ như khi file đó đang được mở bởi một chương trình khác, và đang bị hệ điều hành khóa chẳng hạn. Khi đó chúng ta cần phải tạo ra các xử lý để tránh lỗi.
Nếu mở file thành công bằng ofstream thì ofs
sẽ được trả về. Tuy nhiên nếu mở file thất bại thì ofs
sẽ không tồn tại. Ứng dụng điều này, chúng ta có thể viết xử lý tránh lỗi như sau:
if (ofs) //Mở file thành công |
Mở và đóng file trong C++ bằng ofstream
Ngoài việc thao tác trực tiếp với file bằng ofstream thì chúng ta cũng có thể sử dụng các hàm thành viên trong ofstream để mở và đóng file. Hai hàm được sử dụng là open() và close() tương ứng với việc mở và đóng file bằng ofstream.
Lưu ý nếu mở file bằng ofstream thì do trong class ofstream có hàm tự đóng file, nên chúng ta cũng không nhất thiết phải dùng hàm close để đóng file sau khi sử dụng. Do vậy bạn chỉ cần biết có hàm thành viên close() trong ofstream dùng để đóng file là được.
Để mở file bằng hàm open trong ofstream, trước hết chúng ta cần khai báo một stream bằng ofstream, sau đó thì truyền giá trị của đường dẫn file vào hàm như sau:
std::ofstream ofs;
ofs.open(filepath);
Và để đóng file được mở bởi hàm open, chúng ta đơn giản viết như sau:
ofs.close();
Ví dụ:
|
Mode mở file trong ofstream
Cũng giống như khi sử dụng hàm fopen() để mở file, thì trong ofstream cũng chuẩn bị sẵn các mode để mở file bằng hàm thành viên open() như sau:
mode | Cách dùng |
---|---|
std::ios::out | Mở để ghi(chế độ mặc định) Khi viết, nội dung cũ bị xóa |
std::ios::in | Mở để đọc |
std::ios::app | Mở để ghi chèn |
std::ios::ate | Sau khi mở thì di chuyển về vị trí cuối file |
std::ios::trunc | Mở để ghi, tương tự mode out |
std::ios::binary | Mở file nhị phân |
Lưu ý các mode này không tồn tại trong namespace std::ios nên chúng ta cần viết tên namespace này trước tên các mode.
Do ofstream mở file để ghi, nên chúng ta có thể dùng bất kỳ mode nào ở trên khi muốn ghi file bằng ofsstream trong C++.
Ghi file trong C++ bằng ofstream
Kết hợp các kiến thức ở trên, chúng ta mở file bằng cách tạo stream từ ofstream, sau đó tiến hành ghi file và đóng file như ví dụ sau đây:
|
Kết quả, file test.txt được tạo ra với nội dung như sau:
I am a big big girl! |
Chi tiết về cách ghi file bằng ofstream, hãy xem tại bài:
- Xem thêm: Ghi file trong C++ bằng fstream
Lấy và thay đổi vị trí đọc file trong C++
Để lấy và thay đổi vị trí đang đọc và ghi file hiện tại, chúng ta sử dụng tới hàm thành viên seekp() trong class ofstream. Hàm này cũng có chức năng tương tự như hàm fseek() trong C.
Dưới đây là các mode có thể sử dụng trong hàm này để thay đổi vị trí đang đọc và ghi file hiện tại bằng hàm thành viên seekp().
mode | Cách dùng |
---|---|
std::ios::beg | Di chuyển tới đầu file |
std::ios::cur | Lấy vị trí hiện tại trong file |
std::ios::end | Di chuyển tới cuối file |
Lại nữa, để lấy vị trí hiện tại đang đọc hoặc ghi trong file, chúng ta cũng có thể sử dụng tới hàm thành viên tellp(). Hàm này cũng có chức năng tương tự như hàm ftell() trong C.
Sau đây, hãy cùng xem ví dụ lấy và thay đổi vị trí đọc và ghi file hiện tại trong ofstream bằng các hàm seekp và tellp.
Giả sử chúng ta có file hello.txt có nội dung sau đây:
Hello
Hãy lấy vị trí cuối file, sau đó thêm nội dung vào file và kiểm tra lại vị trí này như sau:
|
Kết quả, các vị trí đang đọc và ghi file sẽ được lấy cũng như là dịch chuyển như sau:
Vi tri hien tai: 5 |
Và nội dung file cũng được ghi thêm như sau:
Hello |
ifstream trong C++
ifstream trong C++ là gì
ifstream là một class cung cấp chức năng của một luồng file đầu vào. ifstream được viết tắt từ các cụm từ in, file và stream trong tiếng Anh, dịch sang tiếng Việt có nghĩa là luồng file đầu vào.
Giống như trong C chúng ta mở file bằng cách tạo ra một cấu trúc FILE để chứa thông tin của file cần đọc, thì trong C++ chúng ta dùng class ifstream để tạo ra một thực thể stream (instance) chứa thông tin về file cần mở, và sau đó thao tác với file thông qua stream này.
Và stream tạo ra bởi ifstream sẽ có tác dụng đọc file trong C++.
Lưu ý là sử dụng được fstream trong C++, chúng ta cần include header file fstream hoặc là ifstream vào đầu chương trình.
Mở file để đọc bằng ifstream
Để sử dụng ifstream, trước hết chúng ta cần thêm header file fstream vào chương trình, sau đó thì sử dụng cú pháp sau đây để mở file để đọc bằng ifstream trong C++,
std::ifstream ifs(filepath);
Trong đó filepath
là đường dẫn của file cần mở và ifs
là stream được tạo ra nếu mở file thành công.
Nếu mở file thành công bằng ifstream thì ifs
sẽ được trả về. Tuy nhiên nếu mở file thất bại thì ifs
sẽ không tồn tại.
Chúng ta cần phải đọc tên namespace chứa ifstream là std vào trước tên class. Tuy nhiên chúng ta cũng có thể rút gọn tên của namespace này bằng cách chỉ định namespace đầu chương trình:
using namespace std; std::ifstream ifs(filepath);
Ví dụ:
|
Ghi file trong C++ bằng fstream
Ví dụ cụ thể, chúng ta có file sample.txt
với nội dung sau đây:
1234567 89abc def
Kết hợp các kiến thức ở trên, chúng ta mở file này bằng cách tạo stream từ ifstream, sau đó tiến hành đọc file và đóng file như ví dụ sau đây:
|
Kết quả đọc file
1234567 |
Chi tiết về cách đọc file bằng ifstream, hãy xem tại bài:
- Xem thêm: Đọc file trong C++ bằng fstream
Kiểm tra đã đọc tới vị trí cuối cùng trong file.
Bằng cách sử dụng hàm thành viên eof(), chúng ta có thể kiểm tra vị trí đọc hiện tại đã tới cuối file hay chưa.
Bằng cách sử dụng eof(), chúng ta có thể xác định vị trí đang đọc đã tới cuối file chưa, và kết thúc việc đọc khi kết quả xác định đã đến vị trí cuối cùng rồi.
Ví dụ cụ thể, chúng ta có thể đọc lại file sample.txt ở trên với cách lặp lại quá trình đọc cho tới khi hàm eof() đã báo tới vị trí cuối file như sau:
|
Tổng kết
Trên đây Kiyoshi đã hướng dẫn các bạn về fstream, ifstream và ofstream trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.
Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.
URL Link
HOME › lập trình c++ cơ bản dành cho người mới học lập trình>>27. file trong c++