C/C++ fseek 用法與範例

本篇 ShengYu 介紹 C/C++ fseek 的用法與範例,C/C++ 可以使用 fseek 移動檔案指標到某個位置,例如在讀檔想要跳至某個位置讀取時就會用到 fseek,fseek 用法詳見本篇範例。

C/C++ 要使用 fseek 的話需要引入的標頭檔 <stdio.h>,如果要使用 C++ 的標頭檔則是引入 <cstdio>
fseek 函式原型為

1
int fseek(FILE * stream, long offset, int origin);

stream:指向 FILE 物件的指標
offset:從 origin 開始位移,以 byte 為單位
origin:可以是 SEEK_SET, SEEK_CUR, SEEK_END 其中一個

以下 C/C++ fseek 的用法介紹將分為這幾部份,

  • C/C++ fseek 基本用法
  • C/C++ fseek 計算檔案大小
  • C/C++ fseek 計算檔案全部文字再 malloc 配置記憶體

那我們開始吧!

C/C++ fseek 基本用法

這邊介紹 C/C++ fseek 基本用法,以下為 fseek 搭配 ftell 移動檔案指標的各種情況範例,了解這些情況更能幫助了解怎麼使用 fseek,剛開完檔後使用 ftell 會回傳 0,使用 fseek 與 SEEK_SET 參數移動 5 個 bytes 再用 tellg 會回傳 5,再次使用 fseek 與 SEEK_SET 參數移動 5 個 bytes 再用 tellg 還是會回傳 5,說明 SEEK_SET 參數這是移動到一個從檔頭開始的絕對位置而不是前一次的相對位置,移動相對位置的話則要 fseek 搭配 SEEK_CUR 參數就會以當前的位置再開始移動,最後兩個範例分別是移到檔尾跟移到檔頭,

cpp-fseek.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
// g++ cpp-fseek.cpp -o a.out
#include <stdio.h>

int main() {
FILE *fp = fopen("input.txt", "r");
if (fp == NULL) {
printf("failed to open the file.\n");
return 1; // EXIT_FAILURE
}

long pos = ftell(fp);
printf("position: %ld\n", pos);

fseek(fp, 5, SEEK_SET);
printf("position: %ld\n", ftell(fp));

fseek(fp, 5, SEEK_SET);
printf("position: %ld\n", ftell(fp));

fseek(fp, 5, SEEK_CUR);
printf("position: %ld\n", ftell(fp));

fseek(fp, 0, SEEK_END); // 移到檔尾
printf("position: %ld\n", ftell(fp));

fseek(fp, 0, SEEK_SET); // 移到檔頭
printf("position: %ld\n", ftell(fp));

fclose(fp);
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/C++ fseek 計算檔案大小

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

cpp-fseek2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ cpp-fseek2.cpp -o a.out
#include <stdio.h>

int main() {
FILE *fp = fopen("input.txt", "r");
if (fp == NULL) {
printf("failed to open the file.\n");
return 1; // EXIT_FAILURE
}

fseek(fp, 0, SEEK_END); // 移到檔尾
long fsize = ftell(fp);
printf("file size: %ld\n", fsize);
fclose(fp);
return 0;
}

結果輸出如下,

1
file size: 44

C/C++ fseek 計算檔案全部文字再 malloc 配置記憶體

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

cpp-fseek3.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-fseek3.cpp -o a.out
#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *fp = fopen("input.txt", "r");
if (fp == NULL) {
printf("failed to open the file.\n");
return 1; // EXIT_FAILURE
}

fseek(fp, 0, SEEK_END); // 移到檔尾
long size = ftell(fp);
printf("size: %ld\n", size);
fseek(fp, 0, SEEK_SET); // 移到檔頭

char *buffer = (char *) malloc(sizeof(char) * size);

fread(buffer, sizeof(char), size, fp);
fclose(fp);

printf("%s", buffer);

free(buffer);

return 0;
}

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

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ fopen 用法與範例
C/C++ fread 用法與範例
C/C++ fgets 用法與範例
C/C++ fputs 用法與範例
C/C++ fclose 用法與範例