C语言 | 文件操作(下)【必收藏】

文件操作(下)

    • 5、文件的顺序读写
      • 5.1 顺序读写函数介绍
        • 5.1.1 fputc与fgetc
        • 5.1.2 fputs与fgets
        • 5.1.3 fprintf与fscanf
        • 5.1.4 fread与fwrite
      • 5.2 对比一组函数
    • 6. 文件的随机读写
      • 6.1 fseek
      • 6.2 ftell
      • 6.3 rewind
    • 7. 文件读取结束的判定
      • 7.1 被错误使用的feof
    • 8. 文件缓冲区

5、文件的顺序读写

5.1 顺序读写函数介绍

5.1.1 fputc与fgetc

请看:
文件操作(上)

5.1.2 fputs与fgets

fputs: 文本行输出函数

int fputs ( const char * str, FILE * stream );
//          字符串指针         文件指针

代码:

int main()
{//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//2.写文件fputs("I am a student.\n", pf);//\n换行fputs("are you ok???\n", pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

程序执行结果:文件中写入两行字符串,换行后有一个空行!
在这里插入图片描述
fgets:

char * fgets ( char * str, int num, FILE * stream );
//            字符串指针   读取的字符个数  文件指针

举例1:
往文件中放入以下内容
在这里插入图片描述
代码:

int main()
{//1.打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//2.读文件char arr[20] = "xxxxxxxxxxxxxxxxxxxx";fgets(arr, 5, pf);//要读5个字符printf("%s\n", arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

调试观察:
通过观察发现,我们要读取5个字符,但实际只读取了4个有效字符"abcd",末尾自动添加一个"\0",也就是只读取了n-1个字符
在这里插入图片描述

运行结果:打印"abcd"

在这里插入图片描述

举例2: 文本行输入函数
往文件中放入以下内容
在这里插入图片描述
代码:

int main()
{//1.打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//2.读文件char arr[20] = "xxxxxxxxxxxxxxxxxxxx";fgets(arr, 10, pf);//要读10个字符printf("%s\n", arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

调试观察:
可以观察到只读取了5个有效字符,还有一个"\n"和一个"\0",也就是说当遇到换行时,后标的字符都不会再读取,当然末尾是依旧要补"\0"的
在这里插入图片描述
运行结果:打印"abcde"
在这里插入图片描述

5.1.3 fprintf与fscanf

首先要明白一个概念
什么是可变参数列表?
例如:printf

//printf
int printf ( const char * format, ... );
//                                可变参数列表

举例:参数的数量是可变的

int main()
{printf("abcde\n");//一个参数printf("%d\n", 100);//两个参数printf("%d %c\n", 100, 'a');//三个参数return 0;
}

进入正题:

fprintf: 格式化输出函数

//fprintf
int fprintf ( FILE * stream, const char * format, ... );
//            文件指针                             可变参数列表

代码:

struct S
{char name[20];int age;float score;
};int main()
{struct S s = { "xiaoming", 18, 99.0f };//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//2.写文件fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//格式化的输出函数//3.关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:结构体中的内容被写到了文件中

在这里插入图片描述

fscanf: 格式化输入函数

int fscanf ( FILE * stream, const char * format, ... );//从文件中读

用上文中fprintf向文件中输出的结果为例
代码:

struct S
{char name[20];int age;float score;
};int main()
{struct S s = { 0 };//1.打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//2.读文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//格式化的输入函数//将读取的结果打印出来fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

程序执行结果:成功读取到了文件中的内容,并打印在了屏幕上

在这里插入图片描述

5.1.4 fread与fwrite

fwrite: 将ptr指向的空间中count个大小为size的数据写到文件中

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
//              ptr指向的空间      大小            个数         文件指针

代码:

struct S
{char name[20];int age;float score;
};int main()
{struct S s = { "wangwu",18,66.6f };//1. 打开文件FILE* pf = fopen("test.txt", "wb");//二进制的写if (pf == NULL){perror("fopen");return 1;}//2. 写文件fwrite(&s, sizeof(struct S), 1, pf);//将s所指向空间中大小为sizeof(struct S)的1个数据写到pf所指向的文件中//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:因为写入的是二进制的信息,所以人是看不懂的

在这里插入图片描述

fread: 从文件中读取count个大小为size的数据存放到ptr指向的空间中

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
//            ptr指向的空间     大小       个数         文件指针

代码:

//fread
struct S
{char name[20];int age;float score;
};int main()
{struct S s = { 0 };//1. 打开文件FILE* pf = fopen("test.txt", "rb");//二进制的读if (pf == NULL){perror("fopen");return 1;}//2. 写文件fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.name, s.age, s.score);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:
在这里插入图片描述

5.2 对比一组函数

scanf/printf: 针对标准输入流/标准输出流的 格式化 输入/输出函数
fscanf/fprintf: 针对所有输入流/所有输出流的 格式化 输入/输出函数
sscanf/sprintf:

  1. sprintf: 将格式化的数据写到字符串中,可以理解为将格式化的数据转换成字符串
int sprintf ( char * str, const char * format, ... );

代码举例:

struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "lisi",18,80.0f };char arr[20] = { 0 };sprintf(arr, "%s %d %f", s.name, s.age, s.score);//将结构体变量s中的内容转换成字符串printf("%s\n", arr);return 0;
}

执行结果:
在这里插入图片描述

  1. sscanf: 从字符串中提取格式化的数据,也可以理解为将字符串转换为格式化的数据
int sscanf ( const char * s, const char * format, ...);

代码举例:

struct S
{char name[20];int age;float score;
};
int main()
{char arr[100] = { 0 };struct S s = { "lisi",18,80.0f };//临时变量struct S tmp = {0};//将s中的各个数据转化成字符串,存放在arr中sprintf(arr, "%s %d %f", s.name, s.age, s.score);//从arr中提取格式化的数据存放在tmp中sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));printf("%s %d %f", tmp.name, tmp.age, tmp.score);return 0;
}

执行结果:
在这里插入图片描述

6. 文件的随机读写

6.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

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

代码:

int main()
{FILE* pFile;pFile = fopen("test.txt", "wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs(" sam", pFile);//This is a sample.fclose(pFile);pFile = NULL;return 0;
}

执行结果:
在这里插入图片描述

6.2 ftell

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

long int ftell  ( FILE * stream );

代码:

int main()
{FILE* pFile;long size;pFile = fopen("test.txt", "rb");if (pFile == NULL)perror("fopen");else{fseek(pFile, 0, SEEK_END); size = ftell(pFile);fclose(pFile);printf("Size of test.txt: %ld bytes.\n", size);}return 0;
}

运行结果:
在这里插入图片描述

6.3 rewind

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

void rewind ( FILE * stream );

代码:

int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("myfile.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);rewind(pFile);fread(buffer, 1, 26, pFile);fclose(pFile);pFile = NULL;buffer[26] = '\0';printf(buffer);return 0;
}

7. 文件读取结束的判定

7.1 被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

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

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

  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    • fread判断返回值是否小于实际要读的个数。

8. 文件缓冲区

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/361098.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 备份恢复以及数据迁移

昨晚老板突然在群里发了一张图片&#xff0c;说昨天才用的&#xff0c;怎么今天还要登录&#xff1f;相关人赶紧看看。 我心想让你登录就登录呗&#xff0c;哪来那么多事&#xff1f;本想洗洗睡了。老大突然微信问我说&#xff0c;是不是 Redis 出问题了&#xff1f;怎么用户…

筑梦未来:高考后,专业与学校的天秤两端

前言 2024 年高考落幕&#xff0c;几人欢喜几人愁&#xff0c;作为一个过来人&#xff0c;希望每一个努力的悻悻学子都能得偿所愿&#xff0c;不负年华&#xff0c;报的心仪的志愿。 接下来我将从三个方向进行一些分析建议&#xff0c;在专业与大学排名间做出适当的权衡。 专…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

【深度学习】基于因果表示学习的CITRIS模型原理和实验

1.引言 1.1.本文的主要内容 理解动态系统中的潜在因果因素&#xff0c;对于智能代理在复杂环境中进行有效推理至关重要。本文将深入介绍CITRIS&#xff0c;这是一种基于变分自编码器&#xff08;VAE&#xff09;的框架&#xff0c;它能够从时间序列图像中提取并学习因果表示&…

Kafka入门-基础概念及参数

一、Kafka术语 Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与订阅解决方案。可以为每个业务、每个应用甚至是每类数据都创建专属的主题。 Kafka的服务器端由被称为Broker的服务进程构成&#xff0c;即一个Kafka集群由多个Broker组成&#…

薄冰英语语法学习--名词2-格

名词后面 s&#xff0c;代表后面这个东西属于前面的。 比如toms book&#xff0c;汤姆的书。 末尾是s&#xff0c;那么直接在最后加就行了。比如boys&#xff0c;男孩们的 表示几个词共同 的所有关系在最后一个词的词尾加 sMary and Toms books 玛丽和汤姆共有的书表示几个词…

Android简介-历史、API等级与体系结构

1. Android简介 Android是一种基于Linux内核的自由及开放源代码的操作系统。最初是由安迪鲁宾(Andy Rubin)开发的一款相机操作系统。2005年8月被Google收购。2007年11月&#xff0c;Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。…

TCP: 传输控制协议

TCP: 传输控制协议 TCP的服务TCP 的首部小结 本系列文章旨在巩固网络编程理论知识&#xff0c;后续将结合实际开展深入理解的文章。 TCP的服务 T C P和U D P都使用相同的网络层&#xff08;I P&#xff09;&#xff0c;T C P却向应用层提供与U D P完全不同的服务。 T C P提供一…

51单片机STC89C52RC——8.2 8*8 LED点阵模块(动态图像)

目的/效果 在《51单片机STC89C52RC——8.1 8*8 LED点阵模块&#xff08;点亮一个LED&#xff09;》我们点亮一个LED&#xff0c;接下来我们将在8*8的矩阵中展示动态的图像。 1&#xff1a;单列展示&#xff1a; 2&#xff1a;单行展示 3&#xff1a;笑脸 4&#xff1a;右移…

JavaScript的学习之文档的加载

目录 一、onload的运用 浏览器在加载一个页面时&#xff0c;是按照自上而下的顺序加载的&#xff0c;读取到一行就执行一行&#xff0c; 如果script标签写到页面的上方&#xff0c;在代码执行时&#xff0c;页面还没有加载&#xff0c;所以要将JS代码写道页面下面 一、onload的…

Python使用attr库打造数据类,你还在手写构造函数吗?

1、attr库基础介绍 🛠️ 1.1 attr安装与导入 在Python中,attr库是一个简化创建数据类的工具 ,它通过简洁的语法自动添加属性和方法 ,如getter、setter等。要开始使用attr,首先需要通过pip安装这个库。打开终端或命令提示符,运行以下命令进行安装: pip install attrs…

2024软件设计师笔记之考点版(一考就过):11-25

软件设计师之一考就过:成绩版 考点11:防火墙、入侵检测 真题1:(专家系统、模型检测、简单匹配)属于入侵检测;而漏洞扫描不属于。 真题2:防火墙特性包括(控制进出网络的数据包和数据流向、提供流量信息的日志和审计、隐藏内部IP以及网络结构细节),但不包括提供漏洞扫…

「6.25更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

AttributeError: module ‘numpy‘ has no attribute ‘long‘

我使用的numpy版本是1.26.4。numpy.long在numpy 1.20就不维护了&#xff0c;numpy 1.24就移除掉了&#xff0c;因此解决方案之一就是重新安装numpy 或者&#xff0c;ctrl鼠标左键定位到报错的地方&#xff0c;将numpy.long改为numpy.longlong。 https://numpy.org/devdocs/rele…

NetSuite Account Merge 科目合并功能分析

最近项目中&#xff0c;客户有提到过能否将不用的Account与新建的Account进行合并&#xff0c;即我们所说的Merge功能&#xff5e;可以&#xff0c;但是该功能有使用的限制&#xff0c;比如最直接的一点需要注意&#xff0c;不同类型的Account是不可以使用Merge功能的&#xff…

mysql数据库中使用存储过程带来的好处和示例(存储过程的概念、定义、作用等详解)

目录 一、概述 二、存储过程的作用 1、代码重用 2、简化复杂操作 3、提高性能 4、安全性和数据完整性 三、相对于sql操纵语句&#xff08;select、insert等&#xff09;存储过程的好处 1、代码重用和封装 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;举…

红酒舞动,运动风采,品味力与美

当夜幕降临&#xff0c;城市的灯火渐次亮起&#xff0c;忙碌了一天的人们开始寻找那份属于自己的宁静与愉悦。在这个时刻&#xff0c;红酒与运动&#xff0c;这两个看似截然不同的元素&#xff0c;却能以它们不同的魅力&#xff0c;为我们带来一场视觉与感官的盛宴。 红酒&…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中&#xff0c;会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求&#xff0c;提供个性化服务&#xff0c;进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

四川赤橙宏海商务信息咨询有限公司一站式抖音电商服务

在数字化浪潮汹涌的当下&#xff0c;电商行业正以前所未有的速度发展&#xff0c;而抖音电商作为其中的佼佼者&#xff0c;更是吸引了无数商家和消费者的目光。在这个充满机遇与挑战的市场中&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的服务和丰富的经验&#xf…

免费资源推荐丨维普OA期刊服务:OA传播 可在线阅读,可下载PDF

《OA传播(Communication based on Open Access,CBOA)》数据库 产品介绍 OA传播(Communication based on Open Access,CBOA)由重庆非晓数据科技有限公司(重庆维普资讯有限公司子公司)出品&#xff0c;是以服务全球科学研究与技术创新为宗旨的OA学术文献一站式免费检索、下载、传…