需求:有時候讀文件時,需要知道文件的字符總的個數,可能是為了提前定義緩沖區大小或者拷貝文件等等。也可以用於動態創建數組。
在進行這兩個問題之前,先來了解一下兩個函數,這兩個函數配合就能夠實現計算大小的功能。
函數 一:fseek
stdio中的庫函數:
函數原型:int fseek(FILE *stream, long int offset, int whence);
功能:設定文件指針的位置
參數:
stream: 需要讀取的文件流。
whence:文件源指針的位置,值可以是這三個中的一個:SEEK_SET、SEEK_CUR、SEEK_END分別表示文件開頭位置,文件當前位置,文件結尾位置。
offset:表示以 whence為基點的偏移量的大小。
所以這個函數的整體功能是:從任意位置比如最常用的SEEK_SET、SEEK_CUR、SEEK_END,移動文件指針,移動的大小為offset。函數執行之後,文件指針就移動到了whence + offset位置處。
返回值:執行成功返回0,執行失敗返回非零。
函數二:ftell
stdio中的庫函數:
函數原型: long int ftell(FILE *stream);
功能:當前文件讀寫位置。
返回值:是當前讀寫位置偏離文件頭部的字節數.
所以由fseek設定文件指針的位置,再由ftell計算從文件開頭到fseek獲取的位置的字節數。
實例代碼如下:
[html]
include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp;
fp = fopen("addoverflowDemo.c","r");
if(fp == NULL){
return -1;
}
//int fseek(FILE *stream, long int offset, int whence); 獲取起始位置
fseek(fp,0,SEEK_END);
//long int ftell(FILE *stream);計算開頭到fseek位置的字符數
int value;
value = ftell(fp);
printf("字符數為:%d\n",value);
return EXIT_SUCCESS;
}
include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp;
fp = fopen("addoverflowDemo.c","r");
if(fp == NULL){
return -1;
}
//int fseek(FILE *stream, long int offset, int whence); 獲取起始位置
fseek(fp,0,SEEK_END);
//long int ftell(FILE *stream);計算開頭到fseek位置的字符數
int value;
value = ftell(fp);
printf("字符數為:%d\n",value);
return EXIT_SUCCESS;
}
編譯連接運行結果如下:
[html]
[root@localhost program]# ./getsizeDemo
字符數為:309
[root@localhost program]# ./getsizeDemo
字符數為:309