C語(yǔ)言 文件的隨機(jī)讀寫(xiě)詳解及示例代碼
前面介紹的文件讀寫(xiě)函數(shù)都是順序讀寫(xiě),即讀寫(xiě)文件只能從頭開(kāi)始,依次讀寫(xiě)各個(gè)數(shù)據(jù)。但在實(shí)際開(kāi)發(fā)中經(jīng)常需要讀寫(xiě)文件的中間部分,要解決這個(gè)問(wèn)題,就得先移動(dòng)文件內(nèi)部的位置指針,再進(jìn)行讀寫(xiě)。這種讀寫(xiě)方式稱(chēng)為隨機(jī)讀寫(xiě),也就是說(shuō)從文件的任意位置開(kāi)始讀寫(xiě)。
實(shí)現(xiàn)隨機(jī)讀寫(xiě)的關(guān)鍵是要按要求移動(dòng)位置指針,這稱(chēng)為文件的定位。
文件定位函數(shù)rewind和fseek
移動(dòng)文件內(nèi)部位置指針的函數(shù)主要有兩個(gè),即 rewind() 和 fseek()。
rewind() 用來(lái)將位置指針移動(dòng)到文件開(kāi)頭,前面已經(jīng)多次使用過(guò),它的原型為:
void rewind ( FILE *fp );
fseek() 用來(lái)將位置指針移動(dòng)到任意位置,它的原型為:
int fseek ( FILE *fp, long offset, int origin );
參數(shù)說(shuō)明:
1) fp 為文件指針,也就是被移動(dòng)的文件。
2) offset 為偏移量,也就是要移動(dòng)的字節(jié)數(shù)。之所以為 long 類(lèi)型,是希望移動(dòng)的范圍更大,能處理的文件更大。
3) origin 為起始位置,也就是從何處開(kāi)始計(jì)算偏移量。C語(yǔ)言規(guī)定的起始位置有三種,分別為文件開(kāi)頭、當(dāng)前位置和文件末尾,
每個(gè)位置都用對(duì)應(yīng)的常量來(lái)表示:
起始點(diǎn) | 常量名 | 常量值 |
---|---|---|
文件開(kāi)頭 | SEEK_SET | 0 |
當(dāng)前位置 | SEEK_CUR | 1 |
文件末尾 | SEEK_END | 2 |
例如,把位置指針移動(dòng)到離文件開(kāi)頭100個(gè)字節(jié)處:
fseek(fp, 100, 0);
值得說(shuō)明的是,fseek() 一般用于二進(jìn)制文件,在文本文件中由于要進(jìn)行轉(zhuǎn)換,計(jì)算的位置有時(shí)會(huì)出錯(cuò)。
文件的隨機(jī)讀寫(xiě)
在移動(dòng)位置指針之后,就可以用前面介紹的任何一種讀寫(xiě)函數(shù)進(jìn)行讀寫(xiě)了。由于是二進(jìn)制文件,因此常用 fread() 和 fwrite() 讀寫(xiě)。
【示例】從鍵盤(pán)輸入三組學(xué)生信息,保存到文件中,然后讀取第二個(gè)學(xué)生的信息。
#include<stdio.h> #define N 3 struct stu{ char name[10]; //姓名 int num; //學(xué)號(hào) int age; //年齡 float score; //成績(jī) }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); //寫(xiě)入三條學(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
以上就是對(duì) C語(yǔ)言 文件隨機(jī)讀寫(xiě)的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)文件版通訊錄的代碼分享
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語(yǔ)句等等知識(shí),需要的可以參考一下2023-01-01C++詳細(xì)講解繼承與虛繼承實(shí)現(xiàn)
這篇文章主要介紹了Java中的繼承詳情,繼承是面向?qū)ο笕筇卣髦唬梢允沟米宇?lèi)具有父類(lèi)的屬性和方法,還可以在子類(lèi)中重新定義,以及追加屬性和方法,下文介紹需要的朋友可以參考下2022-04-04c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽
本文給大家介紹的是使用C語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽功能的代碼,非常的實(shí)用,其主要作用是清除字符串開(kāi)頭結(jié)尾除空白,有需要的小伙伴可以參考下。2016-01-01利用C語(yǔ)言實(shí)現(xiàn)2048小游戲的方法
2048是比較流行的一款數(shù)字游戲,相信對(duì)大家來(lái)說(shuō)都不陌生,這篇文章給大家分享了利用C語(yǔ)言實(shí)現(xiàn)2048小游戲的方法,對(duì)大家學(xué)習(xí)理解C語(yǔ)言具有一定的參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2016-10-10C語(yǔ)言數(shù)組棧實(shí)現(xiàn)模板
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組棧實(shí)現(xiàn)模板,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12