fstream, ifstream và ofstream trong C++ | Laptrinhcanban.com

fstream, ifstream và ofstream trong C++

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:

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ừ filestream 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, filestream 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;

int main(){
ofstream ofs(filepath);
}

Ví dụ:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
//Mở file bằng ofstream
ofstream ofs("test.txt");
}

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
{
//Viết xử lý khi mở file thành công
}
if (!ofs) //Mở file thất bại
{
//Viết xử lý khi mở file thất bại
}

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ụ:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
std::ofstream ofs; //Khai báo stream
ofs.open(test.txt);//Mở file bằng stream
ofs << "abc" << std::endl; //Ghi vào file
ofs.close();//Đóng file

}

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:

modeCách dùng
std::ios::outMở để ghi(chế độ mặc định)
Khi viết, nội dung cũ bị xóa
std::ios::inMở để đọc
std::ios::appMở để ghi chèn
std::ios::ateSau khi mở thì di chuyển về vị trí cuối file
std::ios::truncMở để ghi, tương tự mode out
std::ios::binaryMở 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:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
//Mở file bằng ofstream
ofstream ofs("test.txt");
//Kiểm tra file đã mở thành công hay chưa
if(!ofs){
cerr << "Error: file not opened." << endl;
return 1;
}

//ghi và in lần lượt các ký tự vào file
ofs << "I am a big big girl!"<< endl;
ofs << "in a big big World";


//Đóng file
ofs.close();
return 0;
}

Kết quả, file test.txt được tạo ra với nội dung như sau:

I am a big big girl!
in a big big World

Chi tiết về cách ghi file bằng ofstream, hãy xem tại bài:

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().

modeCách dùng
std::ios::begDi chuyển tới đầu file
std::ios::curLấy vị trí hiện tại trong file
std::ios::endDi 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:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
//Mở file và di chuyển tới cuối file
std::ofstream ofs("hello.txt", std::ios::in | std::ios::ate);
if (!ofs)
{
cout << "Cant open file" << std::endl;

return 0;
}

//Hiển thị vị trí hiện tại trong file
cout << "Vi tri hien tai: " << ofs.tellp() << std::endl;

//Ghi chèn dòng abcde vào file
ofs << "\nVietnam" << std::endl;
cout << "Vi tri hien tai: " << ofs.tellp() << std::endl;

//Dịch chuyển vị trí hiện tại về đầu file 2 ký tự
ofs.seekp(-2, std::ios::cur);

cout << "Vi tri hien tai: " << ofs.tellp() << std::endl;

return 0;
}

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
Vi tri hien tai: 16
Vi tri hien tai: 14

Và nội dung file cũng được ghi thêm như sau:

Hello
Vietnam

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, filestream 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ụ:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
//Mở file bằng ifstream
ifstream ifs("test.txt");
}

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:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{

string filename("sample.txt");
// Khai báo vector để lưu các dòng đọc được
vector<string> lines;
string line;

//Mở file bằng ifstream
ifstream input_file(filename);
//Kiểm tra file đã mở thành công chưa
if (!input_file.is_open()) {
cerr << "Could not open the file - '"
<< filename << "'" << endl;
return EXIT_FAILURE;
}

//Đọc từng dòng trong
while (getline(input_file, line)){
lines.push_back(line);//Lưu từng dòng như một phần tử vào vector lines.
}

//Xuất từng dòng từ lines và in ra màn hình
for (const auto &i : lines)
cout << i << endl;

//Đóng file
input_file.close();
return 0;
}

Kết quả đọc file

1234567
89abc
def

Chi tiết về cách đọc file bằng ifstream, hãy xem tại bài:

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:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
//Mở file bằng ifstream
ifstream ifs("sample.txt");
//Kiểm tra file đã mở thành công hay chưa
if(!ifs){
cerr << "Error: file not opened." << endl;
return 1;
}

//Khai báo biến kiểu char để lưu ký tự đọc được
string buf;
string data;

//Đọc và in lần lượt các ký tự trong file
while (!ifs.eof())
{
std::getline(ifs, buf);
data += buf + "\n";
}
cout << data;

//Đóng file
ifs.close();
return 0;
}

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.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.