C语言:文件操作2(又一万字?)

关于文件操作这章内容,因为知道内容较多所以我分两篇发了,但是还是没料到第二篇还是这么多,达到了一万多字!!!作者本人真的将知识点进行了超级详解分析并且举了很多例子来帮助读者理解,本文章较长,请耐心阅读体会,如果读完对你有用的话,请给作者留下你的:

在这里插入图片描述


5.文件的顺序读写

顺序读写函数介绍

在这里插入图片描述

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流);

1.fputc函数

在这里插入图片描述
运行完之后中,打开data.txt文件,里面放的就是xyz。

在这里插入图片描述
我们也可以用循环来写文件。

在这里插入图片描述
在这里插入图片描述

这就是fputc函数,一次只能写入一个字符,但是我们可以调用它写入多个字符,在开始写文件时,有一个光标在起始位置,随着fputc一次一次的写入,光标会按照顺序往下走,这样的话你就是按照顺序写进去的。

如果该函数指定为标准输出流,就是回打印到屏幕上

在这里插入图片描述

在这里插入图片描述
所以fputc适用于所有输出流:如:文件,stdout。

2.fgetc函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上面打印结果可得它是顺序读的方式。

我们也可以写一个循环来读文件

在这里插入图片描述

它适用于所有输入流如:文件,stdin这是从键盘输入的,当我们按下crtrol z它会返回一个EOF循环停止。

在这里插入图片描述

上面是一个字符的读写,我们来看一行字符的读写。

写文件

3.fputs函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

想要换到两行上,可以加上\n。

在这里插入图片描述
在这里插入图片描述

读文件

4.fgets函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们只读到前4个字符,所以当我们写n个字符的时候,只会读n-1的字符,最后一位留给\0。

在这里插入图片描述
在这里插入图片描述

打印的时候不用加换行符,因为写文件的时候字符串里面有\n,所以打印的时候会自动换行。

再次读文件得时候,读的是第二行的信息

在这里插入图片描述
同样也把末尾的\n也读走了,来看打印结果

在这里插入图片描述

我们同样也可以用循环来读文件,fgets函数若读取失败的话,会返回空指针,根据该特性,我们可以这样写代码

在这里插入图片描述

我们来直接多加几行。

在这里插入图片描述

在这里插入图片描述

我们再来看fscanf函数和fprintf函数。

5.fprintf函数

在这里插入图片描述
在这里插入图片描述

运行完之后,看是否这些带有格式的数据被放在文件中。

在这里插入图片描述

记住我们将带有格式的数据,以格式写入文件中。

6.fscanf函数

在这里插入图片描述
在这里插入图片描述

结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我们这样写代码的时候一个可以代替printf函数,一个可以代替scanf函数。

我们再来看两个函数sprintf和sscanf。

7.sprintf函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.sscanf函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们来将上面内容稍微总结一下
在这里插入图片描述

fread和fwrite函数

9.fwrite函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我们来运行一下,看看到底能不能写到文件中去。

在这里插入图片描述

我们打开data.txt文件,看不懂里面的内容因为它是二进制的。

在这里插入图片描述

我们可以这样操作:添加现有项,把data.txt文件添加进来,再以二进制形式打开它(在打开方式里面找),我们以二进制形式来看文件的内容。

在这里插入图片描述

fread是可以读取二进制的信息的。

10.fread函数

在这里插入图片描述

在这里插入图片描述

我们来运行看打印结果

在这里插入图片描述

我们同样也可以写个循环来读文件

在这里插入图片描述

在这里插入图片描述
但是当我们不知道文件中有几个元素该怎么读呢?我们来看fread函数的返回值

在这里插入图片描述

fread函数它的返回值是成功读取的个数,若没有成功读取就返回0,所以我们可以这样写代码

在这里插入图片描述
在这里插入图片描述

fread函数的返回值如果小于要求读取的个数,就意味着这是最后一次读取了。


6.文件的随机读写

1.fseek

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

1   int fseek ( FILE* stream, long int offset, int orgin );

在这里插入图片描述
在这里插入图片描述

假设我们有一个文件data.txt里面是abcdef,我们用fread函数,写第二个参数时,要根据第三个参数来写,先确定光标位置,再给出偏移量。

在这里插入图片描述

在这里插入图片描述

这个时候我们就跳过了b和c字符,读取到了d。

另外两个写法,就是看你的起始地址从哪里开始记,改变偏移量实现读取。

在这里插入图片描述
在这里插入图片描述

最后一个方法因为光标是从后往前偏移,所以偏移量为-3。

2.ftell

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

1   long int ftell ( FILE * stream );

根据我上面所举的例子,当我们上面读完d之后,光标指向了e,我们可以用ftell函数来计算当前光标相对起始地址的偏移量。

在这里插入图片描述
在这里插入图片描述

3.rewind

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

1   void rewind ( FILE * stream );

在这里插入图片描述
在这里插入图片描述


7.文件读取结束的判定

1.被错误使用的 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。feof 的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL (fgets)例如:
fgetc 判断是否为EOF.
fgets 判断返回值是否为NULL
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。

在这里插入图片描述

2.文本文件的例子

#include <stdio.h>
#include <stdlib.h>int main (void)
{int c; //注意:int,非char,要求处理EOFFILE* fp = fopen("data.txt","r");if(!fp){perror("File opening failed");return EXIT_FAILIRE;};//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile((c = fgetc(fp) != EOF )// 标准C I/O读取文件循环{  putchar(c);}//判断是什么原因结束的if(ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("EOF of file reached successfully");fclose(fp);
}

ferror(fp)如果返回是非零值,说明在读取过程中发生错误,并没有读到文件末尾。

feof(fp)返回值为非零值,说明读到文件末尾停止了。

在这里插入图片描述

3.二进制文件的例子

#include <stdio.h>enum { SIZE = 5 };int main(void)
{double a[SIZE] = {1,2,3,4,5};FILE* fp = fopen("data.bin","wb");//必须用二进制模式fwrite(a,sizeof *a,SIZE,fp); //写 double 的数组fclose(fp);double b[SIZE];fp = fopen("data.bin","rb");size_t ret_code = fread(b,sizeof *b, SIZE,fp); //读 double 的数组if(ret_code == SIZE){puts("Array read successfully, contents: ");for(int n = 0; n<SIZE; ++n)printf("%f ", b[n]);putchar('\n');}else{//error handingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if(ferror(fp)){perror("Error reading test.bin");}}fclose(fp);return 0;
}

8.文件缓冲区

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

在这里插入图片描述
完结!!!

在这里插入图片描述

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

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

相关文章

STM32标准库-待机模式

1.1 STM32待机模式简介 STM32单片机具有低功耗模式&#xff0c;包括睡眠、停止和待机三种。 运行状态下&#xff0c;HCLK为CPU提供时钟。HCLK由AHB预分频器分频后直接输出得到。 低功耗模式选择需考虑电源消耗、启动时间和唤醒源。 睡眠模式停CPU不停外设时钟&#xff1b; 停止…

C++内存分区

内存分区 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 全局区&#xff1a;存放全局变量和静态变量以及常量&#xff08;不包括局部常量&#xff09; 栈区&#xff1a;由编译器自动分配释…

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程&#xff1f; 在消息发送过程中涉及到两个线程&#xff1a;一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列&#xff0c;sender 线程不断从双端队列 RecordAccumulator 中拉取…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

LeetCode:485.最大连续1的个数——简单题简单做

目录 题目——485.最大连续1的个数 题目分析&#xff1a; 图解如下&#xff1a; 代码如下 题目——485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解…

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…

web——sqliabs靶场——第二关

今天来搞第二关&#xff0c;来看看是什么咸蛋 1.判断是否存在sql注入漏洞 输入1 存在sql注入&#xff0c;报错语句为 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 0,1 …

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器&#xff0c;命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口&#xff0c;注…

ClickHouse创建账号和连接测试

在之前搭建ClickHouse的时候&#xff0c;把账户相关的去掉了&#xff0c;所以登录和连接的时候是不需要账号密码的&#xff0c;但是实际项目中&#xff0c;肯定是需要根据需要创建账号。 一&#xff0c;创建账号 1&#xff0c;进入到 /etc/clickhouse-server&#xff0c; 编辑…

基于微信小程序实现个人健康管理系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析

摘要 本项目旨在基于Python对20个城市的天气数据进行采集与可视化分析&#xff0c;以评估天气的适宜出行度。该分析通过四个主要指标进行量化&#xff0c;这些指标分别是天气状况良好率、空气质量优良率、气温适宜率和安全天气率。通过这些指标&#xff0c;我们能够有效地判断…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

Halcon LED灯带检测分享

目录 原图 检出图 示例代码 函数说明 代码 原图 检出图 示例代码 函数说明 LEDSensitivity : 0.6 LEDMinSize : 35 LEDMaxSize : 400 LEDMethod : 1 LEDType :1 LED (Image, LEDDefectTrans, LEDSensitivity, LEDMethod, LEDType, LEDMinSize, LEDMaxSize, R, G, B,…

Pytest-Bdd-Playwright 系列教程(7):使用测试代码生成辅助工具

Pytest-Bdd-Playwright 系列教程&#xff08;7&#xff09;&#xff1a;测试代码生成辅助工具的使用 前言一、代码生成辅助工具的设计思路1.1 功能概览1.2 适用人群 二、如何使用 pytest-bdd 代码生成器三、代码生成器的实际应用场景3.1 初学者的学习和实践3.2 大规模功能测试3…

【每日刷题】Day152

【每日刷题】Day152 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 176. 判断是否为平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 2. 最大子矩阵_牛客题霸…

【Linux】vmlinux、vmlinuz、zImage、bzImage 的区别

vmlinux vmlinux 是静态链接的可执行文件&#xff0c;但是无法直接加载启动&#xff0c;并且是非压缩的。 zImage and bzImage zImage 和 bzImage 都是 linux 的镜像&#xff08;image &#xff09;&#xff0c;前者用于老系统&#xff0c;后者用于新系统&#xff0c;都采用了…

MaxK B:基于 LLM 大语言模型的知识库问答系统!

推荐一个基于大模型的企业级知识库问答系统&#xff0c;支持管理企业知识库、对话问答、RAG 等功能。 企业知识管理的智能化革新在数字化时代&#xff0c;知识管理对于企业的重要性不言而喻。 MaxK B是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;正是为了解决这一挑…

Spring Boot 集成JWT实现Token验证详解

文章目录 Spring Boot 集成JWT实现Token验证详解一、引言二、JWT和Token基础1、什么是Token2、什么是JWT3、JWT的结构4、JWT的工作原理 三、集成JWT1、引入JWT依赖2、创建Token工具类3、创建拦截器4、注册拦截器 四、总结 Spring Boot 集成JWT实现Token验证详解 一、引言 在现…