【【萌新的c语言学习13】】

萌新的c语言学习13

(对于上次c语言文件叙述的小型补充)
后续更新一个总结性质的文案
二进制输入 二进制输出
fread fwrite 二进制输出 文件

struct s
{
    char name[20];
    int age;
    double score;
};


int main()
{
    struct s s = { "张三",20,50.6 };
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
    {
        return 0;
    }
    //二进制形式
    fwrite(&s, sizeof(struct s), 1, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

为什么这后面是乱码 因为我们是以二进制的形式存进去的

struct s
{
    char name[20];
    int age;
    double score;
};


int main()
{
    struct s tmp = { 0};
    FILE* pf = fopen("test.txt", "rb");
    if (pf == NULL)
    {
        return 0;
    }
    //二进制形式
    fread(&tmp, sizeof(struct s), 1, pf);
    printf("%s %d %lf\n", tmp.name, tmp.age, tmp.score);
    fclose(pf);
    pf = NULL;
    return 0;
}

这样就能读出二进制的数据了

我们来考虑对通讯录的变种的考量
通讯录的内存文件是否也可以再次进行优化
我们写文件是按照顺序读取
那么我们文件其实还有随机读取的用法
fseek
移动文件指针到特定的位置
int fseek(指针, 偏移量, 文件指针的当前位置)
调整指针 在起始位置 偏移多少
关于起始位置有3个选项 seek_cur文件指针的当前位置
seek_end 以文件的末尾位置
seek_set 文件的起始位置
比如说结尾的位置 abcdef那么其实指向的是f后面的位置 我们要想指到e就要偏移-2

int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //定位文件指针
    fseek(pf,-2,SEEK_END);
    //2.读取文件
    int ch=fgetc(pf);
    printf("%c\n", ch);//打印出了c
    //1.定位文件指针
    //2.读取文件
    fclose(pf);
    pf = NULL;
    return 0;
}

ftell 返回文件指针相对于起始位置的偏移量

int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //定位文件指针
    fseek(pf,-2,SEEK_END);
    int pos = ftell(pf);
    printf("%d\n", pos);
    //2.读取文件
    int ch=fgetc(pf);
    printf("%c\n", ch);//打印出了c
    //1.定位文件指针
    //2.读取文件
    fclose(pf);
    pf = NULL;
    return 0;
}

rewind 让文件指针的位置回到起始位置

int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //定位文件指针
    fseek(pf,-2,SEEK_END);
    int pos = ftell(pf);
    printf("%d\n", pos);
    //2.读取文件
    int ch=fgetc(pf);
    printf("%c\n", ch);//打印出了c
    rewind(pf);
    int cd = fgetc(pf);
    printf("%c\n", cd);
    //1.定位文件指针
    //2.读取文件
    fclose(pf);
    pf = NULL;
    return 0;
}

关于文件结束的判定
feof默认下是-1
牢记feof并不是判断是否结束
而是用在这个文件已经结束了 我们通过feof得知文件究竟是为何而结束的
判断是因为读取失败结束 还是遇到文件尾结束
二进制文件读取结束的标志是判断返回值是否小于实际要读取的个数
fgetc当读取失败的时候或者遇到文件结束时都会返回EOF
ferror 是因为遇到错误再结束的
feof 是因为eof而结束的

if ferror(fp)
{
puts("I/o error when reading:)
}

这里他会最后输出I/o error when reading:再加上 错误码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值