文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof

这篇具有很好参考价值的文章主要介绍了文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰文件操作

🌸 fwrite

🌸fread

🌸fseek

🌸fteel

🌸rwind

🌸文本文件和二进制文件

🌸文件结束的判定

🌸文件缓冲区

🌸 实现拷贝一个文件


🐰文件操作

🌸 fwrite

fwrite向文件写入二进制数据

fwrite的原型:

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

const void * ptr:指向要写出数据的内存首地址

size_t size:要写出数据的基本单元的字节大小

size_t count:要写数据基本单元的个数

FILE * stream:与文件相关联的文件指针

例如:

#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
    char name[20];
    int age;
    float score;
}S;
int main()
{
    S s1={"zhangsan",23,99.2};
    FILE*pf=fopen("test.txt","wb");//wb是以二进制形式写入
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //写文件
    fwrite(&s1,sizeof(s1),1,pf);
    //关闭文件
    fclose(pf);
    pf=NULL;
    return 0;
}

🌸fread

fread用于向文件中读取二进制数据

fread的原型:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

void * ptr:指向要写入数据的内存首地址

size_t size:要写入数据的基本单元的字节大小

size_t count:要写数据基本单元的个数

FILE * stream:与文件相关联的指针

例如:

#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
    char name[20];
    int age;
    float score;
}S;
int main()
{
    S s1={0};
    FILE*pf=fopen("test.txt","rb");//以二进制数据读出
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //读文件
    fread(&s1,sizeof(s1),1,pf);
    printf("%s %d %f",s1.name,s1.age,s1.score);
    printf("\n");
    //关闭文件
    fclose(pf);
    pf=NULL;
    return 0;
}

🌸fseek

fseek用于改变文件指针指向的位置

fseek的原型:

int fseek ( FILE * stream, long int offset, int origin );

FILE * stream:与文件相关联的文件

long int offset:偏移量

int origin:起始位置

起始位置有三种选择:

SEEK_SET:文件开头

SEEK_CUR:文件的当前位置

SEEK_END;文件的末尾

🌸fteel

fteel计算文件指针指向的位置与文件开始的位置的偏移量

fteel的原型:

long int ftell ( FILE * stream );

FILE * stream :与文件相关联的指针

🌸rwind

rewind使文件指针回到文件的开始

rwind的原型:

void rewind ( FILE * stream );

FILE * stream :与文件相关联的指针

例如:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //文件里保存的是:abcdefg
    //文件末尾应该'\0'
    FILE* pf=fopen("test_1.txt","r");
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //读文件
    int ch=fgetc(pf);//ch=a pf指向b
    printf("%c\n",ch);
    ch=fgetc(pf);//ch=b pf指向c
    printf("%c\n",ch);
    ch=fgetc(pf);//ch=c pf指向d
    printf("%c\n",ch);
    fseek(pf,-3,SEEK_CUR);//从当前位置,向左偏移3位置
    ch=fgetc(pf);//ch=a pf指向b
    printf("%c\n",ch);
    fseek(pf,3,SEEK_SET);//从开始位置,向右偏移3位置
    ch=fgetc(pf);//ch=d pf指向e
    printf("%c\n",ch);
    fseek(pf,-3,SEEK_END);//从末尾位置,向左偏移3位置
    ch=fgetc(pf);//ch=e pf指向f
    printf("%c\n",ch);
    printf("%ld\n",ftell(pf));//计算文件指针指向的位置与文件开始的位置的偏移量,这里是5

    rewind(pf);//文件指针指向文件开始位置
    ch=fgetc(pf);//ch=a pf指向b
    printf("%c\n",ch);
    return 0;
}

结果:
a
b
c
a
d
e
5
a

🌸文本文件和二进制文件

文本文件:如果要求在外存上以ASCII码形式存储,以ASCII字符的形式存储的文件就是文本文件(我们能够读懂)

二进制文件:数据在内存以二进制的形式存储,如果不转换输出到外存中,就是二进制文件(二进制信息,我们还看不懂)

一个数据在内存是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据即可以用ASCII形式存储,也可以使用二进制形式存储

例如:

如果整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节

例如:

#include<stdio.h>
int main()
{
    FILE* pf=fopen("test_1.txt", "wb");
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //写文件
    int ch=10000;
    fwrite(&ch, sizeof(ch), 1, pf);
    fclose(pf);
    pf=NULL;
    return 0;
}

🌸文件结束的判定

feof的作用是:当文件读取结束的时候,判断是文件结束的原因是否是遇到文件尾结束

(1)文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

(2)二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

fread判断返回值是否小于实际要读的个数

fgetc函数返回值的分析:读取失败返回EOF

1.遇到文件末尾,返回EOF,同时设置一个状态,遇到文件末尾了,用feof来检测这个状态

2.遇到错误,返回EOF,同时设置一个状态,遇到错误,用ferror来检测这个状态。

feof的原型:

int feof ( FILE * stream );

FILE * stream:与文件相关的指针

返回类型为整形:如果是文件正常结束,则返回非0数,否则,返回0

例如:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //test.txt里面是:abcdefg
    FILE* pf=fopen("test.txt", "r");
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //读文件
    int ch=0;
    while(ch=fgetc(pf)!=EOF)
    {
        printf("%d\n",ch);
    }
   printf("%d\n",feof(pf));
    ferror(pf);
    return 0;
}
结果:
1
1
1
1
1
1
1
1

🌸文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲区文件系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。缓冲区的大小根据C编译系统决定的。

文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof

文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof 

证明缓冲区的存在:

#include<stdio.h>
#include <unistd.h>
int main()
{
    FILE* pf=fopen("test_2","w");
    printf("休息10秒\n");
    sleep(10);
    fputs("abcdefg",pf);
    fclose(pf);//关闭文件,会刷新缓冲区
    pf=NULL;
    return 0;
}

🌸 实现拷贝一个文件

#include<stdio.h>
int main()
{
    FILE*pf=fopen("test.txt", "r");
    if(pf==NULL)
    {
        perror("fopen");
        return 1;
    }
    //拷贝文件
    FILE*pc=fopen("test_1.txt", "w");
    if(pc==NULL)
    {
        fclose(pf);
        pf=NULL;
        perror("fopen");
        return 1;
    }
    //拷贝
    int ch;
    while((ch=fgetc(pf))!=EOF)
    {
        fputc(ch, pc);
    }
    fclose(pf);
    fclose(pc);
    pf=NULL;
    pc=NULL;
    return 0;
}

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

 文章来源地址https://www.toymoban.com/news/detail-440898.html

到了这里,关于文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明

    目录 Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明 一、简单介绍 二、安装文件相关说明 三、界面的简单说明 四、prompt 的一些语法简单说明 1、Prompt :正向提示词 ,用文字描述在图像中出现的内容 2、Negative prompt:负面提示词,用文字描述不想在图像中出现

    2024年02月09日
    浏览(28)
  • 【C++】STL 算法 ① ( STL 算法相关头文件 | 函数对象 / 仿函数 简介 | 函数调用操作符 | 重写函数调用操作符的类 | 函数对象 与 普通函数区别 )

    标准模板库 STL 算法 都定义在 algorithm , numeric 和 functional 三个头文件中 ; 使用 STL 标准模板库 算法时 , 导入上述 3 个头文件 , 导入时根据需求导入即可 , 不必都导入 ; algorithm 头文件 是 3 个 STL 算法头文件中 包含算法最多的一个 , 包含常用的 : 比较算法、交换算法、查找算法

    2024年01月16日
    浏览(44)
  • Node.js-fs模块文件创建、删除、重命名、文件内容的写入、读取以及文件夹的相关操作

    异步写入:writeFile() 同步写入:writeFileSync() 异步追加写入:appendFile() 同步追加写入:appendFileSync() 方式一(appendFile): 方式二(writeFile): fs.createWriteStream( path [, options ] ) 程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。 流式写入方式适用于

    2024年02月14日
    浏览(59)
  • 【Linux C】fseek函数使用小结

    演示使用的Linux版本( #cat /etc/issue ):Ubuntu 18.04.6 LTS n l 最后更新日期:2023.7.17 设置stream文件的位置指针偏移到指定位置 1 。 参数: stream :这是指向 FILE 对象的指针,该 FILE 对象标识了流。 offset :相对 origin 偏移的字节数。 origin :起始位置 。它为指定的下列值之一:

    2024年02月16日
    浏览(23)
  • Linux缓冲区续集——手撕fopen、fwrite、fflush、fclose等C库函数

    目录 头文件: 接下来就是设计这四个函数:Mystdio.c 重点讲一讲_fflush函数的底层实现原理: 所以数据内容的经过如下: 总结:        执行——测试写好的这4个函数: 运行结果: 修改测试代码: 运行结果:        回顾上文,我讲述了关于Linux文件系统中关于缓冲区的含义

    2024年02月10日
    浏览(27)
  • 互相关函数以及Matlab仿真

    互相关函数是用于衡量两个信号之间的相似程度的一种方法。在信号处理领域中,互相关函数被广泛应用于模式识别、语音处理等领域。它可以帮助我们分析两个信号之间的关系,从而找到它们之间的相似性。 互相关函数的计算方法 在信号处理中,互相关函数通常被表示为

    2024年02月09日
    浏览(29)
  • ElementUI简介以及相关操作

    ElementUI是一套基于Vue.js的桌面端组件库,提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。以下是ElementUI的简介以及相关操作: 简介:ElementUI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的桌面端组件库,旨在快速构建页面。它提供了丰富的组件

    2024年01月23日
    浏览(21)
  • ES语法以及ajax相关操作

    ajax一个前后台配合的技术,它可以让javascript发送http请求,与后台通信,获取数据和信息。ajax技术的原理是实例化xmlhttp对象,使用此对象与后台通信。jquery将它封装成了一个函数$.ajax(),我们可以直接用这个函数来执行ajax请求。 ajax需要在服务器环境下运行。 $.ajax使用方法

    2024年02月08日
    浏览(26)
  • Redis五大数据类型以及相关操作

    keys * 查看当前库的所有键 exists key 判断某个键是否存在 type key 查看键的类型 del key 删除某个键 expire key seconds 为键值设置过期时间,单位秒 ttl key 查看还有多久过期,-1表示永不过期,-2表示已过期 dbsize 查看当前数据库中key的数量 flushdb 清空当前库 Flushall 通杀全部库 String类型

    2024年02月02日
    浏览(29)
  • Ajax--》请求操作以及跨域相关讲解

    目录 jQuery中的Ajax 请求超时与网络异常处理 取消请求 Ajax请求—fetch() 跨域 jQuery中的Ajax 在jQuery中应该如何发送Ajax请求呢?看到这篇文章你就能大概了解到如何在jQuery中发送Ajax。 要想使用jQuery框架,肯定是需要引进jQuery资源的,有两种方式,一种是将资源下载到本地,另一

    2024年01月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包