1. 程式人生 > >C語言隨機讀寫資料檔案(二)

C語言隨機讀寫資料檔案(二)

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;
}