C++ 讀取二進制檔用法與範例

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

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

  • C++ std::ifstream 讀取二進制檔資料
  • C++ 讀取二進制檔到 C-Style 陣列裡
  • C++ 一次讀取全部二進制到 vector<char>
  • C++ 一次讀取全部二進制到 string 裡
  • C++ 讀取二進制檔資料到 struct 裡

那我們開始吧!

C++ std::ifstream 讀取二進制檔資料

這邊示範 C++ std::ifstream 讀取二進制檔資料(binary),ifstream 要讀取二進制檔案資料的話,開檔模式要用 std::ios::binary 表示二進制模式,假如只讀取單純一筆 int 的資料的話,範例如下,

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

int main() {
std::ifstream ifs;
int num;

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

ifs.read((char *)&num, sizeof(int));
cout << num;
ifs.close();
return 0;
}

結果輸出如下,

1
3

C++ 讀取二進制檔到 C-Style 陣列裡

這邊介紹 C++ std::ifstream 讀取二進制檔到 C-Style 陣列裡,建立完 ifstream 後使用 ifstream::open() 來開檔並指定 std::ios::binary 二進制模式,開檔跟上個範例不同的是這次我們在 ifstream 建構時一併開檔,如果開檔成功的話,就讀出內容並且印出來,

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

int main() {
char buffer[256] = {0};

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

ifs.read(buffer, sizeof(buffer));
cout << buffer;
ifs.close();
return 0;
}

假設我們的輸入的二進制內容是 abcde,結果輸出如下,

1
abcde

要用 ofstream 將資料寫入二進制檔的範例可以看這篇

C++ 一次讀取全部二進制到 vector<char>

這邊示範 C++ 一次讀取全部二進制到 vector<char> 裡,

cpp-binary-read3.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-read3.cpp -o a.out
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
std::ifstream ifs("input.bin", std::ios::in | std::ios::binary);
if (!ifs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

std::vector<char> buffer;
buffer.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());

for (int i = 0; i < buffer.size(); i++) {
cout << buffer[i] << " ";
}
ifs.close();
return 0;
}

結果輸出如下,

1
a b c d e

C++ 一次讀取全部二進制到 string 裡

這邊示範 C++ 一次讀取全部二進制到 string 裡,

cpp-binary-read4.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
// g++ cpp-binary-read4.cpp -o a.out
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
std::ifstream ifs("input.bin", std::ios::in | std::ios::binary);
if (!ifs.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}

string str;
str.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
// or
//ifs >> str;

for (int i = 0; i < str.size(); i++) {
cout << str[i] << " ";
//cout << (int)str[i] << " ";
}
ifs.close();
return 0;
}

結果輸出如下,

1
a b c d e

C++ 讀取二進制檔資料到 struct 裡

這邊示範 C++ 用 ifstream 將二進制檔的資料讀取到 struct 裡,先用 ifstream::read() 讀一個 int 知道有幾筆 struct 的資料後,之後再用 for 迴圈搭配 ifstream::read() 讀取 count 次 struct 的資料,

cpp-binary-read5.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
33
// g++ cpp-binary-read5.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[10] = {0};
int count;

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

ifs.read((char *)&count, sizeof(int)); // 讀取筆數
cout << "count: " << count << "\n";

for (int i = 0; i < count; i++) {
ifs.read((char *)&st[i], sizeof(struct Student));
cout << "id: " << st[i].id
<< ", name: " << st[i].name
<< ", age: " << st[i].age << "\n";
}
ifs.close();
return 0;
}

結果輸出如下,

1
2
3
4
count: 3
id: 1, name: ab, age: 18
id: 2, name: cd, age: 19
id: 3, name: ef, age: 20

更好的寫法是讀完筆數後,去 new 動態記憶體配置對應的 struct 筆數,如下所示,跟上例不同的地方還有這次我把 ifstream::read() 一次讀取 count 筆 struct 資料,

cpp-binary-read6.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
33
34
// g++ cpp-binary-read6.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

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

int main() {
int count;

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

ifs.read((char *)&count, sizeof(int)); // 讀取筆數
cout << "count: " << count << "\n";

struct Student *st = new Student[count];
ifs.read((char *)st, sizeof(struct Student) * count);

for (int i = 0; i < count; i++) {
cout << "id: " << st[i].id
<< ", name: " << st[i].name
<< ", age: " << st[i].age << "\n";
}
ifs.close();
return 0;
}

結果輸出同上。要如何用 ofstream 將 struct 寫入二進制檔的範例可以看這篇

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

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