ftell函数和rwind函数详解

举报
芒果_Mango 发表于 2022/03/28 10:29:04 2022/03/28
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

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

image-20220310224646765


使用上方的fseek为例子

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","r");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    //读文件
    //随机读写
    //如果想要第一次读取就读到字符c
    fseek(pf,2,SEEK_SET);	//定位文件指针的位置,c相对于字符a,偏移量为2
    char ch = fgetc(pf);
    printf("%c\n",ch);//c
    //读取字符之后,文件指针向后偏移,指向d
        //此时文件指针指向d,相对于起始位置a的偏移量为3
    printf("%d\n",ftell(pf));	//3
    
    //假设现在想读取字符b
    fseek(pf,-2,SEEK_CUR);//字符b相对于字符d,偏移量为-2
    ch = fgetc(pf);
    printf("%c\n",ch);//b
	//读完b之后,文件指针向后偏移,指向c
    
    //此时文件指针指向c,相对于起始位置a的偏移量为2
    printf("%d\n",ftell(pf));	//2
    //3.关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

rewind - 使文件指针回到起始位置

image-20220310224653048


例子1

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","r");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    //读文件
    //假设想读e
    fseek(pf,4,SEEK_SET);	//e相对于a的偏移量为4
    char ch = fgetc(pf);
    printf("%c\n",ch);//e
    //让文件指针回到最初位置->即指向a
    rewind(pf);
     ch = fgetc(pf);
    printf("%c\n",ch);//a
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

11.文本文件和二进制文件

概念

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如何存储

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
    
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
    
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

例子:整数10000以ASCII存储和以二进制形式存储

image-20220310224701723

以ascii码形式存储时,占用5个字节(因为每一个数都占一个字节),而用二进制形式存储时,占用4个字节(整形)


验证:把10000写到文件中再读取出来

int main()
{
    //打开文件
    FILE* pf = fopen("data.txt","wb");//以二进制形式写入打开
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    //以二进制形式写文件,把10000以二进制形式写到文件中
    int a =10000;
    fwrite(&a,sizeof(int),1,pf);
    //第一个参数:要写入数据的地址 
    //第二个参数:要写入数据的每一个的大小
    //第三个参数:要写入多少个数据
    //第四个参数:文件指针
    
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

执行后data.txt的结果

image-20220310224708213

看不懂

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。