Ghi file trong C++ bằng fstream | Laptrinhcanban.com

Ghi file trong C++ bằng fstream

Cùng tìm hiểu về cách ghi file trong C++. Ngoài cách dùng các hàm được kế thừa từ ngôn ngữ C thì chúng ta cũng có thể ghi file trong C++ bằng các phương pháp mới được tích hợp trong header file fstream, ví dụ như sử dụng toán tử >>, hoặc là hàm write() trong C++, và bạn sẽ làm chủ được chúng sau bài học này.

Chúng ta có 2 phương pháp ghi file trong C++ bằng cách sử dụng header file fstream như sau:

  • Ghi file trong C++ bằng toán tử <<
  • Ghi file trong C++ bằng hàm write

Ứng dụng các phương pháp này, chúng ta cũng có thể:

  • Ghi ký tự vào file trong C++
  • Ghi chuỗi vào file trong C++
  • Ghi mảng vào file trong C++
  • Ghi cấu trúc vào file trong C++
  • Ghi file CSV trong C++

Lại nữa, ngoài cách sử dụng header file fstream thì bạn cũng có thể sử dụng các hàm kế thừa từ ngôn ngữ C để ghi file trong C++.

Trước khi đọc file trong C++

Để đọc file trong C++, bạn cần phải tạo ra một stream chứa thông tin file bằng cách sử dụng class fstream hoặc ofstream mà Kiyoshi đã hướng dẫn trong bài fstream, ifstream và ofstream trong C++.

Tuy nhiên do class fstream bao gồm cả class ofstream và có khả năng vừa đọc vừa ghi file, nên thông thường chúng ta sẽ chọn class này để tạo ra stream chứa thông tin file cần đọc.

Ví dụ cụ thể, chúng ta include header file fstream và mở file trong C++ bằng ofstream như sau:

#include <iostream>
#include <fstream>

using namespace std;

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

Sau khi đã mở file thành công bằng ifstream, một stream ofs chứa thông tin file đã được tạo ra, và lúc này chúng ta đã có thể tiến hành đọc dữ liệu từ file trong C++ bằng cách thao tác với stream này với các phương pháp sau đây:

Ghi file trong C++ bằng toán tử << trong ofstream

Toán tử << trong ofstream

Toán tử << trong ofstream được sử dụng để ghi dữ liệu vào file trong C++.
Cú pháp sử dụng toán tử << để ghi file trong C++ như sau:

ofs << data;

Trong đó ofs là luồng chứa file được tạo ra khi mở file bằng ofstream , và data là dữ liệu cần ghi vào file. Dữ liệu này có thể là một ký tự, hoặc một chuỗi trong C++.

Lưu ý, toán tử << trong ofstream chỉ có thể ghi từng ký tự hoặc từng chuỗi vào file trong C++, do đó chúng ta cần sử dụng toán tử này kết hợp với một vòng lặp để có thể ghi dữ liệu nhiều lần vào file.

Ghi từng ký tự vào file bằng toán tử <<

Chúng ta chỉ định data là một ký tự để ghi từng ký tự vào file bằng toán tử <<.

Ví dụ cụ thể, chúng ta muốn tạo file sample.txt và ghi vào file với nội dung sau đây:

123abc  

Chúng ta sẽ ghi từng ký tự vào file này bằng cách sử dụng toán tử << trong C++ như sau:

#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 lần lượt các ký tự vào file
ofs << 'H';
ofs << 'e';
ofs << 'l';
ofs << 'l';
ofs << 'o';
ofs << endl;

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

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

Hello

Ghi từng dòng vào file trong C++ bằng toán tử <<

Chúng ta chỉ định data là một chuỗi ký tự để ghi từng dòng vào file trong C++ bằng toán tử <<.

Ví dụ cụ thể, chúng ta muốn tạo file sample.txt và ghi vào file với nội dung sau đây:

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

Chúng ta sẽ ghi từng dòng vào file này bằng cách sử dụng toán tử << trong C++ như sau. Lưu ý là để xuống dòng thì chúng ta cần phải ghi thêm ký tự xuống dòng vào cuối mỗi chuỗi ký tự.

#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

Ghi file trong C++ bằng hàm write trong fstream

Hàm write() trong C++

Hàm write() trong C++ là một hàm có sẵn trong thư viện chuẩn, có tác dụng ghi chuỗi vào file trong C++. Hàm write nhận địa chỉ của một chuỗi tại bộ nhớ, và ghi n ký tự được chỉ định từ chuỗi này vào trong file.

Chúng ta sử dụng hàm write trong C++ với cú pháp sau đây:

std::write (const char* s, streamsize n);

Trong đó:

  • s là con trỏ tới một chuỗi có ít nhất n ký tự.
  • n là số lượng ký tự cần lấy từ chuỗi để ghi vào file

Hàm write sẽ trả về luồng, và trong trường hợp ghi file thất bại thì hàm sẽ trả về các flags nhằm thông báo lỗi.

Cũng giống như các hàm trong thư viện chuẩn khác thì để sử dụng hàm write, chúng ta thường phải viết kèm namespace là std vào trước tên hàm như sau:

std::write();

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

Lưu ý, hàm write chỉ có thể ghi từng dòng file trong C++, do đó chúng ta cần sử dụng hàm này nhiều lần nếu muốn ghi nhiều dòng, và đừng quên ghi thêm cả ký tự xuống dòng ở cuối chuỗi để xuống dòng trong file.

Ghi chuỗi vào file trong C bằng hàm write

Chúng ta mở file cần ghi bằng ofstream, sau đó ghi từng dòng vào file trong C++ bằng hàm write như ví dụ sau đây:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{

string text1("I am a big big girl!\n");
string text2( "in a big big World");

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

//Ghi từng dòng vào file bằng hàm write
ofs.write(text1.data(), text1.size());
ofs.write(text2.data(), text2.size());

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

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

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

Ghi mảng vào file trong C++

Ứng dụng một trong hai phương pháp ở trên, chúng ta có thể thực hiện việc ghi mảng vào file trong C++.

Ví dụ chúng ta sử dụng vòng lặp để lấy giá trị từng phần tử, sau đó ghi vào file bằng toán tử << như sau:

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

//Tạo macro tìm số phần tử trong mảng
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int main()
{

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

int num[] = {10, 20, 44, 60, 82};

//Ghi từng phần tử từ mảng vào file
for (int i =0; i < SIZE_OF_ARRAY(num); i++)
ofs << num[i] << ' ';

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

Kết quả, nội dung mảng sẽ được ghi vào file như sau:

10 20 44 60 82 

Một cách tương tự thì chúng ta cũng có thể ghi các mảng 2 chiều vào file trong C++. Khi đó mỗi mảng con 1 chiều trong mảng 2 chiều sẽ được coi như một dòng để ghi vào file, và chúng ta cần phải thêm ký tự xuống dòng \n khi ghi từng mảng dòng vào file như sau:

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

//Tạo macro tìm số phần tử trong mảng
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int main()
{

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

int bangdiem[][3] = {
{7, 9, 8} ,
{8, 6, 7} ,
{5, 7, 6} ,
{4, 9, 5} ,
{5, 8, 7} ,
{6, 9, 3}
} ;

//Lấy độ dài của mảng 2 chiều
int y = sizeof(bangdiem) / sizeof(bangdiem[0]);
int x = sizeof(bangdiem[0]) / sizeof(bangdiem[0][0]);

for (int i =0; i < y; i++){
for (int j =0; j < x; j++){
ofs << bangdiem[i][j] << ' ';

}
ofs << endl;
}


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

Kết quả, từng dòng sẽ được ghi vào file như sau:

7 9 8 
8 6 7
5 7 6
4 9 5
5 8 7
6 9 3

Ghi cấu trúc vào file trong C++

Một cách tương tự thì chúng ta cũng có thể thực hiện ghi cấu trúc vào file trong C++.

Do các thành viên trong cấu trúc C++ có thể có kiểu dữ liệu khác nhau, nên chúng ta cần chỉ định kiểu định dạng phù hợp cho từng thành viên để ghi giá trị của chúng từ mảng vào file bằng hàm hàm fprintf.

Ví dụ chúng ta ghi dữ liệu từ mảng cấu trúc vào file trong C++ bằng hàm fprintf như sau:

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

#define PERSON_NUM 5

//Khai báo kiểu struct
typedef struct {
char name[20];
char sex;
int age;
double height;
double weight;
} person_t;

int main()
{
//Khởi tạo thực thể struct là một mảng struct
person_t p[PERSON_NUM] = {{"Bob", 'M', 19, 165.4, 72.5},
{"Alice", 'F', 19, 161.7, 44.2},
{"Tom", 'M', 20, 175.2, 66.3},
{"Stefany", 'F', 18, 159.3, 48.5},
{"Leonardo", 'M', 19, 172.8, 67.2}};

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


// Ghi từng thực thể của cấu trúc như một dòng vào file

for (short i = 0; i < PERSON_NUM; i++) {
ofs << p[i].name << ' ' << p[i].sex<< ' ' << p[i].age<< ' '
<< p[i].height<< ' ' << p[i].weight << endl;
}


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

Kết quả, nội dung mảng cấu trúc sẽ được ghi vào file như sau:

Bob M 19 165.4 72.5
Alice F 19 161.7 44.2
Tom M 20 175.2 66.3
Stefany F 18 159.3 48.5
Leonardo M 19 172.8 67.2

Ghi file CSV trong C++

Ở phần trên, chúng ta đã tiến hành ghi nội dung các kiểu dữ liệu phức tạp như mảng hay cấu trúc vào file dưới dạng file txt rồi. Tuy nhiên chúng ta cũng có thể ghi dữ liệu trên vào file CSV trong C++, đơn giản bằng cách thay đổi đuôi file từ .txt sang .csv là xong.

Ví dụ cụ thể, chúng ta ghi dữ liệu từ mảng cấu trúc vào file CSV trong C++ bằng hàm fprintf như sau. Lưu ý là chúng ta cần viết định dạng các dữ liệu cách nhau bởi dấu phẩy để có thể ghi từng dữ liệu vào từng ô vào file CSV.

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

#define PERSON_NUM 5

//Khai báo kiểu struct
typedef struct {
char name[20];
char sex;
int age;
double height;
double weight;
} person_t;

int main()
{
//Khởi tạo thực thể struct là một mảng struct
person_t p[PERSON_NUM] = {{"Bob", 'M', 19, 165.4, 72.5},
{"Alice", 'F', 19, 161.7, 44.2},
{"Tom", 'M', 20, 175.2, 66.3},
{"Stefany", 'F', 18, 159.3, 48.5},
{"Leonardo", 'M', 19, 172.8, 67.2}};

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


// Ghi từng thực thể của cấu trúc như một dòng vào file

for (short i = 0; i < PERSON_NUM; i++) {
ofs << p[i].name << ',' << p[i].sex<< ',' << p[i].age<< ','
<< p[i].height<< ',' << p[i].weight << endl;
}


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

Kết quả, nội dung mảng cấu trúc sẽ được ghi vào file people.csv như sau:
Ghi vào file CSV trong C++

Tổng kết

Trên đây Kiyoshi đã hướng dẫn các bạn về cách ghi file 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.