3. 文件的隨機讀寫
有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機讀寫函數(shù), 即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
文件的隨機讀寫函數(shù)如下:
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()函數(shù)的作用是將文件的位置指針設置到從fromwhere開始的第offset
字節(jié)的位置上, 其中fromwhere是下列幾個宏定義之一:
文件位置指針起始計算位置fromwhere
符號常數(shù) 數(shù)值 含義
SEEK_SET 0 從文件開頭
SEEK_CUR 1 從文件指針的現(xiàn)行位置
SEEK_END 2 從文件末尾
offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
節(jié)數(shù)。它是一個長整型量, 以支持大于64K字節(jié)的文件。fseek()函數(shù)一般用于對
二進制文件進行操作。
當fseek()函數(shù)返回0時表明操作成功, 返回非0表示失敗。
下面程序從二進制文件test_b.dat中讀取第8個字節(jié)。
例13:
#include
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()函數(shù)是從文件中讀count個字段, 每個字段長度為size個字節(jié), 并把
它們存放到buf指針所指的緩沖器中。
fwrite()函數(shù)是把buf指針所指的緩沖器中, 長度為size個字節(jié)的count個字
段寫到stream指向的文件中去。
隨著讀和寫字節(jié)數(shù)的增大, 文件位置指示器也增大, 讀多少個字節(jié), 文件位
置指示器相應也跳過多少個字節(jié)。讀寫完畢函數(shù)返回所讀和所寫的字段個數(shù)。
ftell()函數(shù)返回文件位置指示器的當前值, 這個值是指示器從文件頭開始
算起的字節(jié)數(shù), 返回的數(shù)為長整型數(shù), 當返回-1時, 表明出現(xiàn)錯誤。
下面程序把一個浮點數(shù)組以二進制方式寫入文件test_b.dat中。
例14:
#include
main()
{
float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
/*定義浮點數(shù)組并初始化*/
int i;
FILE *fp;
fp=fopen("test_b.dat", "wb"); /*創(chuàng)建一個二進制文件只寫*/
fwrite(f, sizeof(float), 6, fp);/*將6個浮點數(shù)寫入文件中*/
fclose(fp); /*關閉文件*/
}
下面例子從test_b.dat文件中讀100個整型數(shù), 并把它們放到dat數(shù)組中。
例15:
#include
main()
{
FILE *fp;
int dat[100];
fp=fopen("test_b.dat", "rb");/*打開一個二進制文件只讀*/
if(fread(dat, sizeof(int), 100, fp)!=100)
/*判斷是否讀了100個數(shù)*/
{
if(feof(fp))
printf("End of file"); /*不到100個數(shù)文件結束*/
else
printf("Read error"); /*讀數(shù)錯誤*/
fclose(fp); /*關閉文件*/
}
有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機讀寫函數(shù), 即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
文件的隨機讀寫函數(shù)如下:
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()函數(shù)的作用是將文件的位置指針設置到從fromwhere開始的第offset
字節(jié)的位置上, 其中fromwhere是下列幾個宏定義之一:
文件位置指針起始計算位置fromwhere
符號常數(shù) 數(shù)值 含義
SEEK_SET 0 從文件開頭
SEEK_CUR 1 從文件指針的現(xiàn)行位置
SEEK_END 2 從文件末尾
offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
節(jié)數(shù)。它是一個長整型量, 以支持大于64K字節(jié)的文件。fseek()函數(shù)一般用于對
二進制文件進行操作。
當fseek()函數(shù)返回0時表明操作成功, 返回非0表示失敗。
下面程序從二進制文件test_b.dat中讀取第8個字節(jié)。
例13:
#include
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()函數(shù)是從文件中讀count個字段, 每個字段長度為size個字節(jié), 并把
它們存放到buf指針所指的緩沖器中。
fwrite()函數(shù)是把buf指針所指的緩沖器中, 長度為size個字節(jié)的count個字
段寫到stream指向的文件中去。
隨著讀和寫字節(jié)數(shù)的增大, 文件位置指示器也增大, 讀多少個字節(jié), 文件位
置指示器相應也跳過多少個字節(jié)。讀寫完畢函數(shù)返回所讀和所寫的字段個數(shù)。
ftell()函數(shù)返回文件位置指示器的當前值, 這個值是指示器從文件頭開始
算起的字節(jié)數(shù), 返回的數(shù)為長整型數(shù), 當返回-1時, 表明出現(xiàn)錯誤。
下面程序把一個浮點數(shù)組以二進制方式寫入文件test_b.dat中。
例14:
#include
main()
{
float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
/*定義浮點數(shù)組并初始化*/
int i;
FILE *fp;
fp=fopen("test_b.dat", "wb"); /*創(chuàng)建一個二進制文件只寫*/
fwrite(f, sizeof(float), 6, fp);/*將6個浮點數(shù)寫入文件中*/
fclose(fp); /*關閉文件*/
}
下面例子從test_b.dat文件中讀100個整型數(shù), 并把它們放到dat數(shù)組中。
例15:
#include
main()
{
FILE *fp;
int dat[100];
fp=fopen("test_b.dat", "rb");/*打開一個二進制文件只讀*/
if(fread(dat, sizeof(int), 100, fp)!=100)
/*判斷是否讀了100個數(shù)*/
{
if(feof(fp))
printf("End of file"); /*不到100個數(shù)文件結束*/
else
printf("Read error"); /*讀數(shù)錯誤*/
fclose(fp); /*關閉文件*/
}

