C++ std::ifstream::seekg 用法與範例

本篇介紹 C/C++ std::ifstream::seekg 用法與範例,C/C++ 可以使用 seekg 移動檔案指標到某個位置,例如在讀檔想要跳至某個位置讀取時就會用到 seekg,接下來看看 seekg 用法範例。

以下 C++ std::ifstream::seekg 的用法介紹將分為這幾部份,

  • C++ std::ifstream::seekg 基本範例
  • C++ std::ifstream::seekg 計算檔案大小
  • C++ std::ifstream::seekg 計算檔案全部文字再 new 配置記憶體

那我們開始吧!

要使用 std::ifstream::seekg 的話,需要引入的標頭檔: <fstream>

C++ std::ifstream::seekg 基本範例

以下為 std::ifstream::seekg 移動檔案指標搭配 std::ifstream::tellg 的各種情況範例,了解這些情況更能幫助了解怎麼使用 std::ifstream::seekg,剛開完檔後使用 tellg 會回傳 0,使用 seekg 移動 5 個 bytes 再用 tellg 會回傳 5,再次使用 seekg 移動 5 個 bytes 再用 tellg 還是會回傳 5,說明 seekg 預設是移動到一個從檔頭開始的絕對位置而不是前一次的相對位置,移動相對位置的話則要 seekg 搭配 std::ifstream::cur 參數就會以當前的位置再開始移動,最後兩個範例分別是移到檔尾跟移到檔頭,

std-ifstream-seekg.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++ std-ifstream-seekg.cpp -o a.out
#include <iostream>
#include <fstream>
using namespace std;

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

size_t pos = ifs.tellg();
cout << "position: " << pos << "\n";

ifs.seekg(5);
cout << "position: " << ifs.tellg() << "\n";

ifs.seekg(5);
cout << "position: " << ifs.tellg() << "\n";

ifs.seekg(5, std::ifstream::cur);
cout << "position: " << ifs.tellg() << "\n";

ifs.seekg(0, std::ifstream::end); // 移到檔尾
cout << "position: " << ifs.tellg() << "\n";

ifs.seekg(0, std::ifstream::beg); // 移到檔頭
cout << "position: " << ifs.tellg() << "\n";

ifs.close();
return 0;
}

假設我的 input.txt 檔案大小是 44 bytes,程式執行結果輸出如下,

1
2
3
4
5
6
position: 0
position: 5
position: 5
position: 10
position: 44
position: 0

C++ std::ifstream::seekg 計算檔案大小

這邊介紹一下如何利用 std::ifstream::seekg 來計算檔案大小,
我們可以藉由 std::ifstream::seekg 移動到檔尾,然後 tellg 取得 size,藉此來知道檔案大小,這種情形通常是在使用 new 或 malloc 動態配置記憶體時需要知道總大小是多少的情況會使用到,

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

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

ifs.seekg(0, std::ifstream::end);
size_t fsize = ifs.tellg();
cout << "file size: " << fsize << "\n";
ifs.close();
return 0;
}

結果輸出如下,

1
file size: 44

C++ std::ifstream::seekg 計算檔案全部文字再 new 配置記憶體

以下示範 C++ std::ifstream::seekg 移動檔案指標到檔尾,然後計算檔案全部文字後 new 配置記憶體,再讀取檔案內容到預先配置好的 buffer 裡,

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

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

ifs.seekg(0, std::ifstream::end);
int size = ifs.tellg();
cout << "size: " << size << "\n";
ifs.seekg(0, std::ifstream::beg);

char *buffer = new char[size];

ifs.read(buffer, size);
ifs.close();

//std::cout << buffer;
std::cout.write(buffer, size);

delete[] buffer;

return 0;
}

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

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
std::vector 用法與範例
std::sort 用法與範例
std::map 用法與範例
std::set 用法與範例