C語言中對(duì)文件的隨機(jī)存取
C語言中對(duì)文件的隨機(jī)存取
C語言中要實(shí)現(xiàn)對(duì)文件的隨機(jī)存 取,需要用到兩個(gè)函數(shù)fseek()、ftell()。下面通過 一個(gè)反轉(zhuǎn)顯示指定文件的程序來介紹這兩個(gè)函數(shù)的用法。
r eserve.c:
#include <
stdio.h>
#include <
stdlib.h>
#define CNTL_Z '\032' / /DOS 文本中的文件結(jié)尾標(biāo)記
#define SL EN 50
int main(int arg c, char *argv[])
{
c har file[SLEN];
char ch ;
FILE *fp;
long count, last;
p uts("Enter the name of the fil e to be processed: ");
gets(file);
if( (fp = f open(file, "rb")) == NULL ) //只讀和二進(jìn)制模式
{
printf("reverse can't open %s\n", file);
exit( 1);
}
f seek(fp, 0L, SEEK_SET);
//定位在文件開頭處
la st = ftell(fp);
printf( "fseek(fp, 0L, SEEK_SET) , fte el(p): %d\n", last);
fseek(fp, 0L, SEEK_END);
//定位在文件結(jié)尾處
last = ftell(fp);
printf("fseek(fp, 0L, SEEK_END ) , fteel(p): %d\n", last);
for(count = 1L;
c ount <
= last;
count++)
{
fseek(fp, -cou nt, SEEK_END);
ch = getc(fp);
if(ch != CNTL_Z &
&
ch != '\r')
{
putchar(ch);
}
}
putchar ('\n');
fclose(fp);
system("PAUSE");
return 0;
}
假定一個(gè)文 件test.txt內(nèi)容為:
1234567890
12345678 90
1234567890
1111111112
2222222223
3333333334
執(zhí)行reserve來進(jìn)行反轉(zhuǎn)顯示:
< br>
Enter the n ame of the file to be processe d:
test.txt
fseek(fp, 0L , SEEK_SET) , fteel(p): 0
f seek(fp, 0L, SEEK_END) , fteel (p): 72
4333333333
3222222222
2111111111
09 87654321
0987654321
0987 654321
下面,我們來解釋一下fseek ()和ftell()是如何工作的。
l fseek()函數(shù)
fseek(移動(dòng)文件流的讀寫位置)
相 關(guān)函數(shù)
rewind,ftell,fgetp os,fsetpos,lseek
表頭 文件
#include<
stdio.h >
定義函數(shù)
i nt fseek(FILE * stream,long of fset,int whence);
函 數(shù)說明
fseek()用來移動(dòng)文件流的讀寫位 置。參數(shù)stream為已打開的文件指針,參數(shù)offset為根 據(jù)參數(shù)whence來移動(dòng)讀寫位置的位移數(shù)。
< br>參數(shù)
whence為下列其中一種:SE EK_SET從距文件開頭offset位移量為新的讀寫位置。S EEK_CUR 以目前的讀寫位置往后增加offset個(gè)位移量 。SEEK_END將讀寫位置指向文件尾后再增加offset個(gè) 位移量。當(dāng)whence值為SEEK_CUR 或SEEK_EN D時(shí),參數(shù)offset允許負(fù)值的出現(xiàn)。下列是較特別的使用方式 :1) 欲將讀寫位置移動(dòng)到文件開頭時(shí):fseek(FILE *stream,0,SEEK_SET);
2) 欲將讀寫位置移 動(dòng)到文件尾時(shí):fseek(FILE *stream,0,0S EEK_END);
返回值
< br>當(dāng)調(diào)用成功時(shí)則返回0,若有錯(cuò)誤則返回-1,errno會(huì) 存放錯(cuò)誤代碼。
附加說明
fseek()不像lseek()會(huì)返回讀寫位置,因此必須 使用ftell()來取得目前讀寫的位置。
l ftell()函數(shù)
ftell(取得文件流的讀取位置)
< br>
相關(guān)函數(shù)
fseek,rewi nd,fgetpos,fsetpos
表頭文件
#include<
stdio .h>
定義函數(shù)
long ftell(FILE * stream);
函數(shù)說明
ftell()用 來取得文件流目前的讀寫位置。參數(shù)stream為已打開的文件指 針。
返回值
當(dāng)調(diào)用成 功時(shí)則返回目前的讀寫位置,若有錯(cuò)誤則返回-1,errno會(huì)存 放錯(cuò)誤代碼。
錯(cuò)誤代碼
EBADF 參數(shù)stream無效或可移動(dòng)讀寫位置的文件流。
范例
參考fseek ()。
通過fseek()、ftell()兩 個(gè)函數(shù),我們就可以隨意訪問文件的任何位置了,想了想好像操作文 件就這么easy,實(shí)在也沒有更多可說的了。對(duì)了,fseek( )和ftell()存在一個(gè)潛在的問題就是他們限制文件的大小只 能在long類型的表示范圍以內(nèi),也就是說通過這種方式,只能打 開2,000,000,000字節(jié)的文件,不過在絕大多數(shù)情況下 似乎也已經(jīng)夠用了。如果需要打開更大的文件,你需要用到fget pos()、fsetpos()函數(shù)了,那是另一個(gè)命題了。
from: http://www.aonet.cn/artical/26/2005045581.htm
C語言中要實(shí)現(xiàn)對(duì)文件的隨機(jī)存 取,需要用到兩個(gè)函數(shù)fseek()、ftell()。下面通過 一個(gè)反轉(zhuǎn)顯示指定文件的程序來介紹這兩個(gè)函數(shù)的用法。
r eserve.c:
#include <
stdio.h>
#include <
stdlib.h>
#define CNTL_Z '\032' / /DOS 文本中的文件結(jié)尾標(biāo)記
#define SL EN 50
int main(int arg c, char *argv[])
{
c har file[SLEN];
char ch ;
FILE *fp;
long count, last;
p uts("Enter the name of the fil e to be processed: ");
gets(file);
if( (fp = f open(file, "rb")) == NULL ) //只讀和二進(jìn)制模式
{
printf("reverse can't open %s\n", file);
exit( 1);
}
f seek(fp, 0L, SEEK_SET);
//定位在文件開頭處
la st = ftell(fp);
printf( "fseek(fp, 0L, SEEK_SET) , fte el(p): %d\n", last);
fseek(fp, 0L, SEEK_END);
//定位在文件結(jié)尾處
last = ftell(fp);
printf("fseek(fp, 0L, SEEK_END ) , fteel(p): %d\n", last);
for(count = 1L;
c ount <
= last;
count++)
{
fseek(fp, -cou nt, SEEK_END);
ch = getc(fp);
if(ch != CNTL_Z &
&
ch != '\r')
{
putchar(ch);
}
}
putchar ('\n');
fclose(fp);
system("PAUSE");
return 0;
}
假定一個(gè)文 件test.txt內(nèi)容為:
1234567890
12345678 90
1234567890
1111111112
2222222223
3333333334
執(zhí)行reserve來進(jìn)行反轉(zhuǎn)顯示:
< br>
Enter the n ame of the file to be processe d:
test.txt
fseek(fp, 0L , SEEK_SET) , fteel(p): 0
f seek(fp, 0L, SEEK_END) , fteel (p): 72
4333333333
3222222222
2111111111
09 87654321
0987654321
0987 654321
下面,我們來解釋一下fseek ()和ftell()是如何工作的。
l fseek()函數(shù)
fseek(移動(dòng)文件流的讀寫位置)
相 關(guān)函數(shù)
rewind,ftell,fgetp os,fsetpos,lseek
表頭 文件
#include<
stdio.h >
定義函數(shù)
i nt fseek(FILE * stream,long of fset,int whence);
函 數(shù)說明
fseek()用來移動(dòng)文件流的讀寫位 置。參數(shù)stream為已打開的文件指針,參數(shù)offset為根 據(jù)參數(shù)whence來移動(dòng)讀寫位置的位移數(shù)。
< br>參數(shù)
whence為下列其中一種:SE EK_SET從距文件開頭offset位移量為新的讀寫位置。S EEK_CUR 以目前的讀寫位置往后增加offset個(gè)位移量 。SEEK_END將讀寫位置指向文件尾后再增加offset個(gè) 位移量。當(dāng)whence值為SEEK_CUR 或SEEK_EN D時(shí),參數(shù)offset允許負(fù)值的出現(xiàn)。下列是較特別的使用方式 :1) 欲將讀寫位置移動(dòng)到文件開頭時(shí):fseek(FILE *stream,0,SEEK_SET);
2) 欲將讀寫位置移 動(dòng)到文件尾時(shí):fseek(FILE *stream,0,0S EEK_END);
返回值
< br>當(dāng)調(diào)用成功時(shí)則返回0,若有錯(cuò)誤則返回-1,errno會(huì) 存放錯(cuò)誤代碼。
附加說明
fseek()不像lseek()會(huì)返回讀寫位置,因此必須 使用ftell()來取得目前讀寫的位置。
l ftell()函數(shù)
ftell(取得文件流的讀取位置)
< br>
相關(guān)函數(shù)
fseek,rewi nd,fgetpos,fsetpos
表頭文件
#include<
stdio .h>
定義函數(shù)
long ftell(FILE * stream);
函數(shù)說明
ftell()用 來取得文件流目前的讀寫位置。參數(shù)stream為已打開的文件指 針。
返回值
當(dāng)調(diào)用成 功時(shí)則返回目前的讀寫位置,若有錯(cuò)誤則返回-1,errno會(huì)存 放錯(cuò)誤代碼。
錯(cuò)誤代碼
EBADF 參數(shù)stream無效或可移動(dòng)讀寫位置的文件流。
范例
參考fseek ()。
通過fseek()、ftell()兩 個(gè)函數(shù),我們就可以隨意訪問文件的任何位置了,想了想好像操作文 件就這么easy,實(shí)在也沒有更多可說的了。對(duì)了,fseek( )和ftell()存在一個(gè)潛在的問題就是他們限制文件的大小只 能在long類型的表示范圍以內(nèi),也就是說通過這種方式,只能打 開2,000,000,000字節(jié)的文件,不過在絕大多數(shù)情況下 似乎也已經(jīng)夠用了。如果需要打開更大的文件,你需要用到fget pos()、fsetpos()函數(shù)了,那是另一個(gè)命題了。
from: http://www.aonet.cn/artical/26/2005045581.htm
posted on 2007-01-05 10:49 weidagang2046 閱讀(1869) 評(píng)論(0) 編輯 收藏 所屬分類: C/C++