C++ 寫入二進制檔用法與範例

本篇 ShengYu 介紹 C++ 寫入二進制檔的用法與範例,

以下 C++ 寫入二進制檔的用法介紹將分為這幾部份,

  • C++ std::ofstream 寫入二進制檔
  • C++ 將 C-Style 字元陣列的資料寫入二進制檔
  • C++ 將 vector<char> 的資料寫入二進制檔
  • C++ 將 string 的資料寫入二進制檔
  • C++ 將 struct 資料寫入二進制檔

那我們開始吧!

C++ std::ofstream 寫入二進制檔

這邊示範用 C++ std::ofstream 來寫入二進制檔案(binary),建立完 ofstream 後使用 ofstream::open() 來開檔並指定 std::ios::binary 二進制模式,如果開檔成功的話,就將資料放進 ofstream 流寫入二進制檔,
假如只寫入單純一筆 int 的資料的話,範例如下,

cpp-binary-write.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// g++ cpp-binary-write.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

int main() {
std::ofstream ofs;

ofs.open("output.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

int num = 3;
ofs.write((char *)&num, sizeof(int));
ofs.close();
return 0;
}

hexdump output.bin 輸出如下,

1
2
3
$ hexdump output.bin
0000000 03 00 00 00
0000004

假如要寫入字元的資料的話,範例如下,

cpp-binary-write2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// g++ cpp-binary-write2.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

int main() {
std::ofstream ofs;

ofs.open("output.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

ofs << 'a';
ofs << 'b';
ofs << 'c';
ofs << 'd';
ofs << 'e';
ofs.close();
return 0;
}

hexdump output.bin 輸出如下,

1
2
3
$ hexdump output.bin
0000000 61 62 63 64 65
0000005

要用 ifstream 讀取二進制檔的資料的話可以看看這篇

C++ 將 C-Style 字元陣列的資料寫入二進制檔

這邊介紹 C++ std::ofstream 寫入二進制檔到 C-Style 字元陣列裡,開檔跟上個範例不同的是這次我們在 ofstream 建構時一併開檔,

cpp-binary-write3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// g++ cpp-binary-write3.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

int main() {
char buffer[5] = {0x61, 0x62, 0x63, 0x64, 0x65};
// or
//char buffer[5] = {'a', 'b', 'c', 'd', 'e'};

std::ofstream ofs("output.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

ofs.write(buffer, sizeof(buffer));
// or
/*for (int i = 0; i < sizeof(buffer); i++) {
ofs << buffer[i];
}*/
// or
//ofs << buffer;
ofs.close();
return 0;
}

結果輸出同上。

C++ 將 vector<char> 的資料寫入二進制檔

這邊示範經常使用到的 std::vector 容器,將 std::vector 容器裡的元素(這邊示範 char) 寫入到二進制檔裡,

cpp-binary-write4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-binary-write4.cpp -o a.out -std=c++11
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
std::vector<char> buffer;
buffer.push_back('a');
buffer.push_back('b');
buffer.push_back('c');
buffer.push_back('d');
buffer.push_back('e');

std::ofstream ofs("output.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

//ofs.write(&buffer.front(), buffer.size());
// or
for (auto &b : buffer) {
ofs << b;
}
// or
//ofs << &buffer.front();
ofs.close();
return 0;
}

結果輸出同上。

C++ 將 string 的資料寫入二進制檔

這邊示範經常使用到的 std::string 容器,將 std::string 容器裡的元素寫入到二進制檔裡,

cpp-binary-write5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// g++ cpp-binary-write5.cpp -o a.out -std=c++11
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
string str = "abcde";
//string str = {1,2,3,4};

std::ofstream ofs("input.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

ofs.write(&str.front(), str.size());
//ofs.write(&str[0], str.size());
// or
/*for (auto &b : str) {
ofs << b;
}*/
// or
//ofs << &str.front(); // 遇到 '\0' 就停止
ofs.close();
return 0;
}

結果輸出同上。

C++ 將 struct 資料寫入二進制檔

這邊示範 C++ 用 ofstream 將 struct 資料寫入二進制檔,寫入 struct 資料前先寫入 struct 的筆數,這樣在讀取二進制檔案時可以方便先知道要讀取幾筆 struct 資料,

cpp-binary-write6.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// g++ cpp-binary-write6.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

struct Student {
int id;
char name[4];
int age;
};

int main() {
struct Student st[3] = {
{1, "ab", 18},
{2, "cd", 19},
{3, "ef", 20},
};
int count = 3;

std::ofstream ofs("output.bin", std::ios::out | std::ios::binary);
if (!ofs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

ofs.write((char *)&count, sizeof(int)); // 寫入筆數
for (int i = 0; i < count; i++) {
ofs.write((char *)&st[i], sizeof(struct Student));
}
ofs.close();
return 0;
}

hexdump output.bin 輸出如下,

1
2
3
4
5
$ hexdump output.bin
0000000 03 00 00 00 01 00 00 00 61 62 00 00 12 00 00 00
0000010 02 00 00 00 63 64 00 00 13 00 00 00 03 00 00 00
0000020 65 66 00 00 14 00 00 00
0000028

要用 ifstream 將二進制檔的資料讀取到 struct 裡的話可以看看這篇

以上就是 C++ 寫入二進制檔的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C++ 讀取二進制檔用法與範例
C++ 讀取文字檔用法與範例
C++ 寫入文字檔用法與範例