本篇介紹 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 參數就會以當前的位置再開始移動,最後兩個範例分別是移到檔尾跟移到檔頭,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
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
6position: 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 動態配置記憶體時需要知道總大小是多少的情況會使用到,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
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 裡,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
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 用法與範例