C语言随机读写数据文件(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshuxuncom/article/details/84979136

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

猜你喜欢

转载自blog.csdn.net/wangshuxuncom/article/details/84979136
今日推荐