文件的隨機(jī)讀寫
前面介紹的對文件的讀寫方式都是順序讀寫, 即讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。 但在實(shí)際問題中常要求只讀寫文件中某一指定的部分。 為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫,這種讀寫稱為隨機(jī)讀寫。 實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個, 即 rewind 函數(shù)和fseek函數(shù)。
rewind函數(shù)前面已多次使用過,其調(diào)用形式為: rewind(文件指針); 它的功能是把文件內(nèi)部的位置指針移到文件首。 下面主要介紹
fseek函數(shù)。
fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為: fseek(文件指針,位移量,起始點(diǎn)); 其中:“文件指針”指向被移動的文件。 “位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB 時不會出錯。當(dāng)用常量表示位移量時,要求加后綴“L”?!捌鹗键c(diǎn)”表示從何處開始計算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。
其表示方法如表10.2。
起始點(diǎn) 表示符號 數(shù)字表示
──────────────────────────
文件首 SEEK—SET 0
當(dāng)前位置 SEEK—CUR 1
文件末尾 SEEK—END 2
例如:
fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。還要說明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計算的位置會出現(xiàn)錯誤。文件的隨機(jī)讀寫在移動位置指針之后, 即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。下面用例題來說明文件的隨機(jī)讀寫。
[例10.8]在學(xué)生文件stu list中讀出第二個學(xué)生的數(shù)據(jù)。
#inClude
struCt stu
{
Char name[10];
int num;
int age;
Char addr[15];
}boy,*qq;
main()
{
FILE *fp;
Char Ch;
int i=1;
qq=&boy;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("Cannot open file strike any key exit!");
getCh();
exit(1);
}
rewind(fp);
fseek(fp,i*sizeof(struCt stu),0);
fread(qq,sizeof(struCt stu),1,fp);
printf("\n\nname\tnumber age addr\n");
printf("%s\t] } %s\n",qq->name,qq->num,qq->age,
qq->addr);
} 來源:www.examda.com
文件stu_list已由例10.6的程序建立,本程序用隨機(jī)讀出的方法讀出第二個學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進(jìn)制文件方式打開文件,程序第22行移動文件位置指針。其中的i值為1,表示從文件頭開始,移動一個stu類型的長度, 然后再讀出的數(shù)據(jù)即為第二個學(xué)生的數(shù)據(jù)。
前面介紹的對文件的讀寫方式都是順序讀寫, 即讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。 但在實(shí)際問題中常要求只讀寫文件中某一指定的部分。 為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫,這種讀寫稱為隨機(jī)讀寫。 實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個, 即 rewind 函數(shù)和fseek函數(shù)。
rewind函數(shù)前面已多次使用過,其調(diào)用形式為: rewind(文件指針); 它的功能是把文件內(nèi)部的位置指針移到文件首。 下面主要介紹
fseek函數(shù)。
fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為: fseek(文件指針,位移量,起始點(diǎn)); 其中:“文件指針”指向被移動的文件。 “位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB 時不會出錯。當(dāng)用常量表示位移量時,要求加后綴“L”?!捌鹗键c(diǎn)”表示從何處開始計算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。
其表示方法如表10.2。
起始點(diǎn) 表示符號 數(shù)字表示
──────────────────────────
文件首 SEEK—SET 0
當(dāng)前位置 SEEK—CUR 1
文件末尾 SEEK—END 2
例如:
fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。還要說明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計算的位置會出現(xiàn)錯誤。文件的隨機(jī)讀寫在移動位置指針之后, 即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。下面用例題來說明文件的隨機(jī)讀寫。
[例10.8]在學(xué)生文件stu list中讀出第二個學(xué)生的數(shù)據(jù)。
#inClude
struCt stu
{
Char name[10];
int num;
int age;
Char addr[15];
}boy,*qq;
main()
{
FILE *fp;
Char Ch;
int i=1;
qq=&boy;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("Cannot open file strike any key exit!");
getCh();
exit(1);
}
rewind(fp);
fseek(fp,i*sizeof(struCt stu),0);
fread(qq,sizeof(struCt stu),1,fp);
printf("\n\nname\tnumber age addr\n");
printf("%s\t] } %s\n",qq->name,qq->num,qq->age,
qq->addr);
} 來源:www.examda.com
文件stu_list已由例10.6的程序建立,本程序用隨機(jī)讀出的方法讀出第二個學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進(jìn)制文件方式打開文件,程序第22行移動文件位置指針。其中的i值為1,表示從文件頭開始,移動一個stu類型的長度, 然后再讀出的數(shù)據(jù)即為第二個學(xué)生的數(shù)據(jù)。