3.文件的隨機讀寫
有時用戶想直接讀取文件中間某處的信息,若用文件的順序讀寫必須從文件頭開始直到要求的文件位置再讀,這顯然不方便。Turbo C2.0提供了一組文件的隨機讀寫函數,即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
文件的隨機讀寫函數如下:
int fseek (FILE *stream, long offset, int fromwhere);
int fread(void *buf, int size, int count, FILE *stream);
int fwrite(void *buf, int size, int count, FILE *stream);
long ftell(FILE *stream);
fseek()函數的作用是將文件的位置指針設置到從fromwhere開始的第offset字節的位置上,其中fromwhere是下列幾個宏定義之一:
文件位置指針起始計算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
───────────────────────────
SEEK_SET 0 從文件開頭
SEEK_CUR 1 從文件指針的現行位置
SEEK_END 2 從文件末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字節數。它是一個長整型量,以支持大於64K字節的文件。fseek()函數一般用於對二進制文件進行操作。
當fseek()函數返回0時表明操作成功, 返回非0表示失敗。下面程序從二進制文件test_b.dat中讀取第8個字節。
例13:
#include<stdio.h>
main()
{
FILE *fp;
if((fp=fopen("test_b.dat", "rb"))==NULL)
{
printf("Can't open file");
exit(1);
}
fseek(fp, 8. 1, SEEK_SET);
fgetc(fp);
fclose(fp);
}
fread()函數是從文件中讀count個字段,每個字段長度為size個字節,並把它們存放到buf指針所指的緩沖器中。
fwrite()函數是把buf指針所指的緩沖器中,長度為size個字節的count個字段寫到stream指向的文件中去。
隨著讀和寫字節數的增大,文件位置指示器也增大,讀多少個字節,文件位置指示器相應也跳過多少個字節。讀寫完畢函數返回所讀和所寫的字段個數。
ftell()函數返回文件位置指示器的當前值,這個值是指示器從文件頭開始算起的字節數,返回的數為長整型數,當返回-1時,表明出現錯誤。