C語言隨機讀寫資料檔案(二)
阿新 • • 發佈:2019-01-02
int fseek(FILE * fp, long offset, int fromWhere):設定檔案位置標記,方法引數說明:
fp:FILE型別指標,該指標對應的檔案即是檔案位置標記所標記的檔案;
offset:偏移量;
fromWhere:偏移起始點,其值可以為SEEK_SET、SEEK_CUR和SEEK_END;
SEEK_SET:從檔案開頭處開始偏移
#include <stdio.h> #include <stdlib.h> int main(){ FILE * file = fopen("D:\\chars.dat","wb+"); if(file == NULL){ printf("無法開啟檔案"); exit(0); } char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; fwrite(letters,sizeof(char),26,file); rewind(file);//fwrite方法執行過,檔案位置標記在檔案的末尾,如果不將檔案位置標記重新指向檔案開頭,則執行下面fread方法沒有結果;rewind方法等效於fseek(file,0L,SEEK_SET); char letter; fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出A fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出B rewind(file); fseek(file,sizeof(char),SEEK_SET);//檔案位置標記移到距離檔案開頭1個字元之後,即跳過字元A fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出B fseek(file,2*sizeof(char),SEEK_SET);//檔案位置標記移到距離檔案開頭2個字元之後,即跳過字元AB fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出C fclose(file); return 0; }
SEEK_CUR:從當前檔案位置標記處開始偏移
#include <stdio.h> #include <stdlib.h> int main(){ FILE * file = fopen("D:\\chars.dat","wb+"); if(file == NULL){ printf("無法開啟檔案"); exit(0); } char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; fwrite(letters,sizeof(char),26,file); rewind(file);//fwrite方法執行過,檔案位置標記在檔案的末尾,如果不將檔案位置標記重新指向檔案開頭,則執行下面fread方法沒有結果;rewind方法等效於fseek(file,0L,SEEK_SET); char letter; fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出A fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出B fseek(file,0L,SEEK_SET);//將檔案位置標記重新指向檔案開頭,等效於rewind(file); fseek(file,sizeof(char),SEEK_CUR);//檔案位置標記移到距離檔案開頭1個字元之後,即跳過字元A fread(&letter,sizeof(char),1,file);//該行程式碼執行後文件位置標記指向B printf("%c\n", letter);//輸出B fseek(file,2*sizeof(char),SEEK_CUR);//檔案位置標記移到距離B 2個字元之後的位置,即跳過字元CD fread(&letter,sizeof(char),1,file); printf("%c\n", letter);//輸出E fclose(file); return 0; }
【例題】已知D盤根目錄stud.dat檔案存有10條學生資訊,請將第1、3、5、7、9學生資訊顯示在螢幕上。
#include <stdio.h> #include <stdlib.h> int main(){ struct Student{ char name [10]; int num; int age; char addr [30]; } stud [5]; FILE * input = fopen("D:\\stud.dat","rb"); if(input == NULL){ printf("無法開啟檔案"); exit(0); } for(int i=0;i<10;i=i+2){ fread(&stud[i],sizeof(struct Student),1,input); printf("%s %d %d %s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr); fseek(input,sizeof(struct Student),SEEK_CUR); } fclose(input); return 0; }
SEEK_END:從檔案末尾處開始偏移
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE * file = fopen("D:\\chars.dat","wb+");
if(file == NULL){
printf("無法開啟檔案");
exit(0);
}
char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fwrite(letters,sizeof(char),26,file);
rewind(file);//fwrite方法執行過,檔案位置標記在檔案的末尾,如果不將檔案位置標記重新指向檔案開頭,則執行下面fread方法沒有結果;rewind方法等效於fseek(file,0L,SEEK_SET);
char letter;
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//輸出A
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//輸出B
rewind(file);//將檔案位置標記重新指向檔案開頭
fseek(file,-sizeof(char),SEEK_END);//檔案位置標記移到檔案末尾前1個字元,即跳過檔案結束符
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//輸出Z,此時檔案位置標記指向B
fseek(file,-2*sizeof(char),SEEK_END);//檔案位置標記移到檔案末尾前2個字元,即跳過檔案結束符和Z字元
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//輸出Y
fclose(file);
return 0;
}