讀古今文學網 > C語言解惑 > 22.4 文件的定位 >

22.4 文件的定位

文件中有一個位置指針,指向當前讀寫的位置。如果順序讀寫一個文件,每次讀寫一個字符,則讀寫完一個字符後,該位置指針自動移動指向下一個字符位置。如果想改變這樣的規律,即強制使位置指針指向其他指定的位置,這可以用有關函數來實現。

1.rewind函數

rewind函數的作用是使位置指針重新返回文件的開頭。此函數沒有返回值,執行rewind函數


rewind 
(fp
);
  

使文件的位置指針重新定位於文件開頭,並使feof函數的值恢復為0(假)。

2.fseek函數和隨機讀寫

對流式文件可以進行順序讀寫,也可以進行隨機讀寫。用fseek函數可以實現改變文件的位置指針。函數的調用形式為


fseek
(文件類型指針,位移量,起始點)
  

「起始點」用0,1或2代替,0代表「文件開始」,1代表「當前位置」,2代表「文件末尾」。也可以使用符號定義,即SEEK_SET代表「文件開始」,SEEK_CUR代表「當前位置」,SEEK_END代表「文件末尾」。下面是幾個例子:


fseek
(fp
,100L
,0
);          //
把文件內部指針移動到離文件開頭100
字節處;
fseek
(fp
,100L
,1
);          //
把文件內部指針移動到離文件當前位置100
字節處;
fseek
(fp
,-100L
,2
);          //
把文件內部指針退回到離文件結尾100
字節處。
  

3.ftell函數

ftell函數的作用是得到流式文件中的當前位置,並將它用相對於文件開頭的位移量表示出來。假設n為整型變量,則


n=ftell
(fp
);
  

將獲取的fp指定文件的當前讀寫位置傳給變量n,n是當前讀寫位置偏離文件頭部的字節數。

用fseek函數把位置指針移到文件尾,再用ftell函數獲得這時位置指針距文件頭的字節偏移數,這個字節數+1就是文件的長度。

【例22.22】演示3個文件定位函數的程序。


#include <stdio.h>
int main
()
{
    char str[128]="How are you
? Fine
! thank you."
;
    char st[128]={'\0'}
;
    int length=0
;
    FILE *fp
;
    fp=fopen 
("t.txt"
,"w+"
);
    fputs
(str
, fp
);
    //
把文件的位置指針移到離文件頭4
字節處
    fseek
(fp
,4L
,SEEK_SET
);
    fgets
(st
,4
,fp
);          //
取are
    printf
("%s\n"
, st
);
    //
把文件的位置指針移到離當前文件指針6
字節處
    fseek
(fp
,6L
,SEEK_CUR
);
    fgets
(st
,7
,fp
);          //
取Fine
!
    printf
("%s\n"
, st
);
    if
(fp==NULL
)
           printf
("file not found
!\n"
);
    else
    {
           //
把文件的位置指針移到文件尾
            fseek
(fp
,0L
,SEEK_END
);
           //
獲取文件長度;
            length=ftell
(fp
)+1
;
            printf
("
該文件的長度為%d
字節\n"
,length
);
     }
     //
把文件的位置指針移到離文件尾16
字節處
     fseek
(fp
,-16L
,SEEK_END
);
     fgets
(st
,17
,fp
);          //
取Fine
! thank you.
     printf
("%s\n"
, st
);
     rewind
(fp
);               //
回起始點
     fgets
(st
,30
,fp
);          //
取整個字串
     printf
("%s\n"
, st
);
     fclose
(fp
);
     return 0
;
}
  

對照程序,很容易理解這3個函數的使用方法。程序運行結果如下:


are
Fine
!
該文件的長度為30
字節
Fine
! thank you.
How are you
? Fine
! thank you.