與例10.6相比,本程序中fscanf和fprintf函數(shù)每次只能讀寫(xiě)一個(gè)結(jié)構(gòu)數(shù)組元素,因此采用了循環(huán)語(yǔ)句來(lái)讀寫(xiě)全部數(shù)組元素。 還要注意指針變量pp,qq由于循環(huán)改變了它們的值,因此在程序的25和32行分別對(duì)它們重新賦予了數(shù)組的首地址。
文件的隨機(jī)讀寫(xiě)
前面介紹的對(duì)文件的讀寫(xiě)方式都是順序讀寫(xiě), 即讀寫(xiě)文件只能從頭開(kāi)始,順序讀寫(xiě)各個(gè)數(shù)據(jù)。 但在實(shí)際問(wèn)題中常要求只讀寫(xiě)文件中某一指定的部分。 為了解決這個(gè)問(wèn)題可移動(dòng)文件內(nèi)部的位置指針到需要讀寫(xiě)的位置,再進(jìn)行讀寫(xiě),這種讀寫(xiě)稱(chēng)為隨機(jī)讀寫(xiě)。 實(shí)現(xiàn)隨機(jī)讀寫(xiě)的關(guān)鍵是要按要求移動(dòng)位置指針,這稱(chēng)為文件的定位。文件定位移動(dòng)文件內(nèi)部位置指針的函數(shù)主要有兩個(gè), 即 rewind 函數(shù)和fseek函數(shù)。
rewind函數(shù)前面已多次使用過(guò),其調(diào)用形式為: rewind(文件指針); 它的功能是把文件內(nèi)部的位置指針移到文件首。 下面主要介紹
fseek函數(shù)。
fseek函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,其調(diào)用形式為: fseek(文件指針,位移量,起始點(diǎn)); 其中:“文件指針”指向被移動(dòng)的文件。 “位移量”表示移動(dòng)的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長(zhǎng)度大于64KB 時(shí)不會(huì)出錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴“L”。“起始點(diǎn)”表示從何處開(kāi)始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。
其表示方法如表10.2。
起始點(diǎn) 表示符號(hào) 數(shù)字表示
──────────────────────────
文件首 SEEK—SET 0
當(dāng)前位置 SEEK—CUR 1
文件末尾 SEEK—END 2
例如:
fseek(fp,100L,0);其意義是把位置指針移到離文件首100個(gè)字節(jié)處。還要說(shuō)明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。文件的隨機(jī)讀寫(xiě)在移動(dòng)位置指針之后, 即可用前面介紹的任一種讀寫(xiě)函數(shù)進(jìn)行讀寫(xiě)。由于一般是讀寫(xiě)一個(gè)數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。下面用例題來(lái)說(shuō)明文件的隨機(jī)讀寫(xiě)。
[例10.8]在學(xué)生文件stu list中讀出第二個(gè)學(xué)生的數(shù)據(jù)。
#include
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boy,*qq;
main()
{
FILE *fp;
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |