文件操作(3)

fseek函数
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,请小心使用。
第二个参数负数代表向前移动,整数代表向后移动。
第一个参数stream为文件指针
第二个参数offset为偏移量,单位:字节,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾

fseek(fp, 3, SEEK_SET);

ftell函数

函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。

long len = ftell(fp)

fgetpos,fsetpos函数
fseek与ftell返回的是long类型,如果文件很大,超过long的范围,那么该函数会有问题,fgetpos与fsetpos函数可以处理更大的文件类型
返回值:成功返回0,否则返回非0

fflush函数
fflush函数可以将缓冲区中任何未写入的数据写入文件中。
修改配置文件,希望修改实时生效,那么每次修改完成之后我们fflush一次

这里写图片描述

fread和fwrite函数

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入或读取的数据块数目
只要读取到文件最后,没有完整的读取一个数据块出来,fread就返回0
第一个参数代表void *,写入或者读取的缓冲区
第二个参数是代表写入或读取的时候一个单位的大小
第三个参数是代表写入或读取几个单位
第四个参数是FILE *

fread与feof
这里写图片描述

注意以下两段代码的区别
while (!feof(p))
    {
        fread(&buf, 1, sizeof(buf), p);
    }

while (fread(&buf, 1, sizeof(buf), p))
代码示例:

#define SEC 0x1234678

// 文件加密.
void file_encode()
{
    FILE *p1 = fopen("a.txt", "r");
    if (p1 == NULL) {
        return ;
    }

    FILE *p2 = fopen("a.dat", "wb");
    if (p2 == NULL) {
        return ;
    }

    char buf[1024] = {0};
    while (fgets(buf, p1) != NULL) {
        size_t len = strlen(buf);
        int i;
        for (i = 0; i < len; i++) {
            int temp = buf[i] + SEC;
        }
        fwrite(&temp, sizeof(int), 1, p2);
    }

    fclose(p1);
    fclose(p2);
}

// 文件解密.
void file_decode()
{
    FILE *p1 = fopen("a.dat", "rb");
    if (p1 == NULL) {
        return ;
    }

    FILE *p2 = fopen("b.txt", "w");
    if (p2 == NULL) {
        return ;
    }

    int buf = 0;
    while (fread(&buf, 1, sizeof(buf), p1)) {
        char temp = buf - SEC;
        putc(temp, p2);
    }

    fclose(p1);
    fclose(p2);
}

int main()
{
    return 0;
}
// 结构体和二进制文件.

struct student {
unsigned int ID;
char name[32];
};
// 将结构体写入二进制文件.
int main()
{
    struct student sts[10] = {{1, "赵一"},{2, "钱二"},{3, "孙三"},
    {4, "李四"},{5, "王五"},{6, "周六"},{7, "吴七"}{8, "郑八"}{9, "冯九"}, {10, "陈十"}};

    FILE *p1 = fopen("a.txt", "wb");
    if (p1 == NULL) {
        return 0;
    }
    // 将结构体数组写入文件.
    fwrite(sts, sizeof(struct student), 10, p1);
    fclose(p1);

    // 读取文件中的结构体数据.
    FILE *p2 = fopen("a.txt", "rb");
    if (p2 == NULL) {
        return 0;
    }
    struct student st;
    while(fread(&st, sizeof(st), 1, p2)) {
        printf("ID = %u, name = %s\n", st.ID, st.name);
    }
    fclose(p2);


    // 修改文件中的结构体数据(修改ID=3的数据).
    student student st2 = {3, "杨老师"};
    FILE *p3 = fopen("a.txt", "rb+");

    // 将文件指针移位.
    fseek(p3, sizeof(st2) * 2, SEEK_SET);
    fwrite(&st2, sizeof(st2), 1, p3);
    fclose(p3);

    return 0;
}
struct student {
    unsigned int ID;
    char name[20];
};

int main() {
    //system("gedit main.c");
    //printf("Hello, World!\n");

    struct student sts[10] = {
            {1, "111"},
            {2, "222"},
            {3, "333"},
            {4, "444"},
            {5, "555"},
            {6, "666"},
            {7, "777"},
            {8, "888"},
            {9, "999"},
            {10, "1010"},
    };

    FILE *p1 = fopen("a.txt", "w");
    fwrite(sts, sizeof(struct student), 10, p1);
    fclose(p1);

    // 将文件中的所有结构体数据全部读出.
    FILE *p2 = fopen("a.txt", "r");
    struct student *pst = calloc(10, sizeof(struct student));
    int index = 0;
    while (fread(&pst[index], sizeof(struct student), 1, p2)) {
        index++;
    }

    int i;
    for (i = 0; i <index ; i++) {
        printf("ID = %u name = %s\n", pst[i].ID, pst[i].name);
    }
    fclose(p2);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值