C/C++ ftell 用法與範例

本篇 ShengYu 介紹 C/C++ ftell 的用法與範例,C/C++ 可以使用 ftell 回傳從檔案頭到當前位置的 byte 數,例如在讀檔時想知道這個檔案裡面有多少個文字時就可以使用 ftell,ftell 用法詳見本篇範例。

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

1
long ftell(FILE * stream);

stream:指向 FILE 物件的指標

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

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

那我們開始吧!

C/C++ ftell 基本用法

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

cpp-ftell.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-ftell.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++ ftell 計算檔案大小

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

cpp-ftell2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ cpp-ftell2.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++ ftell 計算檔案全部文字再 malloc 配置記憶體

以下示範 C/C++ ftell 計算檔案全部文字後再 malloc 配置記憶體,

cpp-ftell3.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-ftell3.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++ ftell 的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

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