C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解
前面介紹的文件讀寫函數(shù)都是順序讀寫,即讀寫文件只能從頭開始,依次讀寫各個(gè)數(shù)據(jù)。但在實(shí)際開發(fā)中經(jīng)常需要讀寫文件的中間部分,要解決這個(gè)問題,就得先移動(dòng)文件內(nèi)部的位置指針,再進(jìn)行讀寫。這種讀寫方式稱為隨機(jī)讀寫,也就是說從文件的任意位置開始讀寫。
實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動(dòng)位置指針,這稱為文件的定位。
文件定位函數(shù)rewind和fseek
移動(dòng)文件內(nèi)部位置指針的函數(shù)主要有兩個(gè),即 rewind() 和 fseek()。
rewind() 用來將位置指針移動(dòng)到文件開頭,前面已經(jīng)多次使用過,它的原型為:
void rewind ( FILE *fp );
fseek() 用來將位置指針移動(dòng)到任意位置,它的原型為:
int fseek ( FILE *fp, long offset, int origin );
參數(shù)說明:
1) fp 為文件指針,也就是被移動(dòng)的文件。
2) offset 為偏移量,也就是要移動(dòng)的字節(jié)數(shù)。之所以為 long 類型,是希望移動(dòng)的范圍更大,能處理的文件更大。offset 為正時(shí),向后移動(dòng);offset 為負(fù)時(shí),向前移動(dòng)。
3) origin 為起始位置,也就是從何處開始計(jì)算偏移量。C語言規(guī)定的起始位置有三種,分別為文件開頭、當(dāng)前位置和文件末尾,每個(gè)位置都用對應(yīng)的常量來表示:
| 起始點(diǎn) | 常量名 | 常量值 |
|---|---|---|
| 文件開頭 | SEEK_SET | 0 |
| 當(dāng)前位置 | SEEK_CUR | 1 |
| 文件末尾 | SEEK_END | 2 |
fseek(fp, 100, 0);
值得說明的是,fseek() 一般用于二進(jìn)制文件,在文本文件中由于要進(jìn)行轉(zhuǎn)換,計(jì)算的位置有時(shí)會(huì)出錯(cuò)。
文件的隨機(jī)讀寫
在移動(dòng)位置指針之后,就可以用前面介紹的任何一種讀寫函數(shù)進(jìn)行讀寫了。由于是二進(jìn)制文件,因此常用 fread() 和 fwrite() 讀寫。
【示例】從鍵盤輸入三組學(xué)生信息,保存到文件中,然后讀取第二個(gè)學(xué)生的信息。
#include<stdio.h>
#define N 3
struct stu{
char name[10]; //姓名
int num; //學(xué)號(hào)
int age; //年齡
float score; //成績
}boys[N], boy, *pboys;
int main(){
FILE *fp;
int i;
pboys = boys;
if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
printf("Cannot open file, press any key to exit!\n");
getch();
exit(1);
}
printf("Input data:\n");
for(i=0; i<N; i++,pboys++){
scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
}
fwrite(boys, sizeof(struct stu), N, fp); //寫入三條學(xué)生信息
fseek(fp, sizeof(struct stu), SEEK_SET); //移動(dòng)位置指針
fread(&boy, sizeof(struct stu), 1, fp); //讀取一條學(xué)生信息
printf("%s %d %d %f\n", boy.name, boy.num, boy.age, boy.score);
fclose(fp);
return 0;
}
運(yùn)行結(jié)果:
Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Zhao 10 16 95.5↙
Hua 1 14 99.000000
到此這篇關(guān)于C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解的文章就介紹到這了,更多相關(guān)C語言rewind與fseek函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中g(shù)etchar()函數(shù)的用法小結(jié)
這篇文章主要介紹了C語言中g(shù)etchar()函數(shù)的用法,getchar是輸入函數(shù),輸入的過程是什么呢,本文給大家詳細(xì)講解,對C語言getchar()函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-10-10
C++類成員構(gòu)造函數(shù)和析構(gòu)函數(shù)順序示例詳細(xì)講解
這篇文章主要介紹了C++類成員構(gòu)造和析構(gòu)順序示例,看了這個(gè)例子大家就可以明白c++構(gòu)造析構(gòu)的奧秘2013-11-11
C語言的getc()函數(shù)和gets()函數(shù)的使用對比
這篇文章主要介紹了C語言的getc()函數(shù)和gets()函數(shù)的使用對比,從數(shù)據(jù)流中一個(gè)是讀取字符一個(gè)是讀取字符串,需要的朋友可以參考下2015-08-08

