中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現隨機讀寫文件

發布時間:2023-03-31 15:25:13 來源:億速云 閱讀:101 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言如何實現隨機讀寫文件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言如何實現隨機讀寫文件”吧!

1.fseek

前面已經劇透過了,fseek可以改變記錄讀寫位置的指針的指向,從而實現文件的隨機讀寫。該函數的聲明如下:

int fseek ( FILE * stream, long int offset, int origin );

第一個參數大家都很熟悉了,就是一個文件指針,告訴fseek我現在操作的是哪個文件。

第二個參數,offset是偏移量的意思,大家先記住。第三個參數,origin,顧名思義,即“起始位置”。后面兩個參數讓人摸不著頭腦,但是配合起來就很有意思了。

舉個例子:假設一個文件中存有abcdefg,當你用fopen打開這個文件時,一個記錄讀寫位置的指針就指向了起始位置,也就是指向了a。如果我想讀取第5個字符,即e呢?那我就要讓這個指針指向e,這樣再fgetc就能讀到e了。

我可以這樣算:e相對于起始位置a,向右偏移了4個字符,因為相對于a,a自己的偏移量是0,b是1,c是2,d是3,e自然是4。那么,偏移量offset(fseek的第二個參數)就是4,這個4是相對于起始位置的,這個“相對于”哪里,也就是origin(fseek的第三個參數)的位置,此時origin就是“起始位置”,明白了吧。而fseek用一個宏SEEK_SET來表示“起始位置”,所以此時fseek的調用如下:

fseek(pf, 4, SEEK_SET);

下面我們來驗證一下。先在工程目錄下創建一個文件,文件名是test.txt,然后在里面輸入abcdefg。

C語言如何實現隨機讀寫文件

按照打開文件->讀文件->關閉文件的順序,寫代碼:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, 4, SEEK_SET);
	putchar(fgetc(pf));

	fclose(pf);
	pf = NULL;

	return 0;
}

打開文件后,使用fseek讓記錄讀寫位置的指針指向e,接著用fgetc讀取e并用putchar打印出來,輸出結果如下:

C語言如何實現隨機讀寫文件

我們就成功跳過了前面的abcd,直接讀取到e,實現了文件的隨機讀寫。

當然,讀取到e不止有這一種寫法。fseek的第三個參數origin有三種取值,分別是:

1.SEEK_SET,表示起始位置。

2.SEEK_CUR,表示當前指向的位置。

3.SEEK_END,表示文件末尾。

SEEK_SET和SEEK_CUR都很好理解,需要注意的是,SEEK_END不是指向最后一個字符,而是指向最后一個字符的下一個位置。比如,一個文件中存有abcdefg,SEEK_END不是指向g,而是指向g的下一個位置。所以同樣是讀到e,如果origin是SEEK_END,offset就應該是-3,因為g的偏移量是-1,f是-2,所以e是-3。把上面代碼中的fseek的調用方式改一下,其他不變:

fseek(pf, -3, SEEK_END);

也可以讀到e,因為在執行完上面這行代碼后,記錄讀寫位置的指針就指向了e,所以讀取時就跳過了前面的abcd,直接讀到e。說明一下,由于讀寫前該指針指向了e,調用fgetc讀完e后,該指針就指向了e后面的f,也就是說,此時SEEK_CUR就指向了f,如果我們想讀到b呢?可以數一下,abcdefg,b相對于SEEK_CUR(指向f)的偏移量就是-4,如果像下面的代碼這樣寫:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END); // 指向e
	putchar(fgetc(pf)); // 讀完e后指向f

	fseek(pf, -4, SEEK_CUR); // 指向b
	putchar(fgetc(pf)); // 讀完b后指向c

	fclose(pf);
	pf = NULL;

	return 0;
}

輸出結果如下:

C語言如何實現隨機讀寫文件

2.ftell

我如果想知道此時記錄讀寫位置的指針相對于起始位置的偏移量(即相對于SEEK_SET的偏移量)是多少,就可以問問ftell函數。該函數聲明如下:

long int ftell ( FILE * stream );

ftell會返回當前相對于起始位置的偏移量。比如前面的例子中調用:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END); // 指向e
	putchar(fgetc(pf)); // 讀完e后指向f

	fseek(pf, -4, SEEK_CUR); // 指向b
	putchar(fgetc(pf)); // 讀完b后指向c

	printf("\n%ld\n", ftell(pf));

	fclose(pf);
	pf = NULL;

	return 0;
}

由于此時記錄文件讀寫位置的指針指向了c,偏移量是2(a為0,b為1,c為2),所以會輸出2。

C語言如何實現隨機讀寫文件

3.rewind

rewind的作用是,讓指向文件讀寫位置的指針指向文件的起始位置。該函數聲明如下:

void rewind ( FILE * stream );

其實非常簡單,rewind(pf);和fseek(pf, 0, SEEK_SET);是等價的。

在前面的例子中,記錄文件讀寫位置的指針左右橫跳,最后指向了c,此時ftell也返回了2,這時如果我rewind一下,該指針就又指向了起始位置,即a,再ftell就能知道偏移量回到了0,如果再fgetc,就能重新讀取到a了。代碼如下:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END); // 指向e
	putchar(fgetc(pf)); // 讀完e后指向f

	fseek(pf, -4, SEEK_CUR); // 指向b
	putchar(fgetc(pf)); // 讀完b后指向c

	printf("\n%ld\n", ftell(pf));

	rewind(pf);
	printf("%ld\n", ftell(pf));
	putchar(fgetc(pf)); // a

	fclose(pf);
	pf = NULL;

	return 0;
}

輸出結果:

C語言如何實現隨機讀寫文件

當然,把上述代碼中的rewind(pf);換成fseek(pf, 0, SEEK_SET);的效果是一樣的。

感謝各位的閱讀,以上就是“C語言如何實現隨機讀寫文件”的內容了,經過本文的學習后,相信大家對C語言如何實現隨機讀寫文件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

弥勒县| 珠海市| 北海市| 河北省| 扬州市| 买车| 电白县| 金湖县| 施甸县| 江源县| 黄大仙区| 万年县| 彭阳县| 宣武区| 中方县| 桑日县| 宁安市| 广汉市| 蒙自县| 西贡区| 收藏| 兰坪| 徐水县| 昭苏县| 个旧市| 海丰县| 钦州市| 胶州市| 乌拉特前旗| 阿瓦提县| 安乡县| 闽清县| 霍林郭勒市| 邯郸市| 安化县| 农安县| 邵东县| 肥乡县| 文昌市| 正定县| 蒙阴县|