【C语言】文件操作(下卷)

前言

在上一卷中,我们知道了文件指针、文件的打开和关闭(打开其他位置的文件)、文件的顺序读写(其中的fputc()、fgetc()),这一卷中,将继续讲解文件操作未讲到的地方。

内容有点多,写不完的部分再开一个文件操作(终卷)。

之前我们讲过的fputc与fgetc是一个一个字符地从文件中读或写入文件,那么我们现在来看看fgets和fputs:

fputs函数

 前一个参数是一个字符指针,指向一个字符串。第二个参数是文件指针,关联到一个文件。返回类型是int。

功能:往流上写一个字符串。(把ptr指向的字符串写到流上。)

使用演示:

在正式写我们的fputs之前,需要的准备有这些:

#include<stdio.h>
int main()
{//1.先得打开文件,才有文件指针FILE* pf = fopen("test.txt", "w");//得判断打开文件是否成功if (pf == NULL){perror("fopen");return 1;}//2.写文件//3。关闭文件fclose(pf);pf = NULL;//避免成为空指针return 0;
}

然后我们就可以写fputs了:

可见运行没有问题,我们就看看这个文件:

这个字符串就被我们成功写入指定文件了。 

那么现在有一个问题,如果我们再写一句,会在两行上还是一行?

 

可以看到, 放在了同一行上。因为我们没有换行。

换行的写法:

在字符串末尾加'\n'就行。

我们再来讲一下返回值int代表什么:

成功的话,非负整数被返回;发生错误,返回EOF并且设置错误指示器。

如果不想接受返回值,就可以像我们上面写的那样使用。

fgets函数

第一个参数是指向字符数组的指针,第二个是整型变量,第三个参数是流,返回值是char*类型的指针。

功能是从流里读一个字符串,读完放到str指向的字符数组中。

num是最多往str中拷贝几个字符(包括用来结束的无效字符)。

使用演示:

现在我们文件里放的是:

然后我们写出这样的代码: 

我们在调试启用后的监视窗口可以观察:

可以看到,我们确实是读了5个字符,但其中最后一个是'\0'。再看打印结果,确实只读了4个有效字符:

 再回去看刚才的函数参数介绍:num是最多往str中拷贝几个字符(包括用来结束的无效字符)。就是这个意思。

在这一句中也有提到:

换行情况

还有一种情况,如果一行的字符数少于我们的num,会换行读吗?

为了演示这种情况,我们先把文件改成这样:

再把代码改成这样(改为读10个字符):

然后看看:

可以看到,我们想读10个字符,却只读到4个有效字符,而在监视窗口中,我们可以看到我们读取到'\n'之后就加上了'\0',读取结束。 

所以fgets在一行字符数充足情况下,读到的有效字符数为num-1;如果一行字符数不够,不会换行读取。  无论是哪种情况,最后都会补上'\0'

所以,fputs fgets的功能是文本行输出/输入函数。

与fputc fgetc相同,这两个函数也是适用于所有输出/输入流,也就是说stdout stdin(屏幕)也适用,那么可以测试一下:

fputs fgets的标准流使用:

注意,返回值可以使用,也可以不接收(不使用)。

fgets读取失败会返回空指针。

fgetc fputc fgets fputs都是针对字符的,但是数据还有整型、浮点型等。

这时我们来看格式化输出、输入函数。fscanf fprintf。可以和scanf printf进行对比。

fprintf函数

 

可以看到二者区别在于第一个参数。fprintf第一个参数是要操作的流,而printf默认操作的流就是stdout。…的参数叫作可变参数列表。在C语言中有这种参数的不多,常见的就是scanf和printf。

比如,下面的例子我们可以看出printf的参数个数确实是可变的:

 而fprintf的使用就是在使用printf的基础上多了第一个参数。演示:

fscanf函数

 

可以看到,和scanf也就差第一个参数。

演示:  

同样的,fprintf fscanf也可以针对标准输出/输入流(屏幕),演示(fprintf针对stdout):

(将printf改为fprintf,前面加上stdout)

 所以我们可以说fprintf fscanf的功能各自包含了printf scanf的功能。

对比一组函数

scanf/printf  针对标准输入/输出流的格式化输入/输出函数

fscanf/ fprintf  针对所有输入/输出流的格式化输入/输出函数(功能更强,可以针对文件和屏幕)

sscanf/sprintf  是干什么的函数?

sprintf函数

可以与printf fprintf进行比较,然后会发现,第二个参数是一样的,而第一个参数不是流,是字符指针。根据其以str为名,其实是指向一个字符数组的指针。

可以在解释中看到其功能是往字符串(数组)中写格式化数据。

注意,因为写到字符数组中去,所以其实是把格式化的数据转换为了字符串。

演示:

所以未来当我们有一些各种类型的数据,想把它们整合为一个字符串时,就可以使用这个函数。 

sscanf函数

这个函数与我们的sprintf就是相反的。 

刚才我们将s中的各个数据转换为了字符串存入了str中,那么现在我们现在从字符串str中提取格式化的数据,还原成一个结构体变量tmp

此时我们可以再与scanf的原型对比,发现就是多出来第一个参数,这个参数是指向一个字符串(数组)的指针。 

此时我们再次观察sprintf sscanf之间的相反性

 

 演示:

  

上面我们说sprintf可以理解为将格式化的数据转换成字符串,那么我们的sscanf也可以理解为将字符串转换成格式化的数据

fwrite函数 

 可以看到这个函数的参数是比较多的。4个参数。

可以看到功能是写数据块到流(文件)中:

将ptr指向空间的内存里count个大小为size字节的元素写到文件中。

比如ptr指向的可能是个数组,数组中放着10个元素,每个元素4个字节,可以一个一个元素写,也可以十个十个元素写。

演示:

 

因为写进文件的是二进制的信息,用文本编辑器是看不懂的。

fread函数

和fwrite的参数是一样的。甚至顺序都没有变化。

和fwrite相反,fread从文件中读取count个大小为size字节的数据,存放在ptr指向的空间中。fwrite是将ptr中count个大小为size字节的数据写到文件中。 

演示:

 这里的88.8变为88.800003是因为浮点数在内存中无法精确保存,会有误差。

(这里还能写成循环。)

fread返回值是什么?

 成功读取几个元素,就返回几。也就是返回实际读取到的个数。

假如8个元素,一次读3个,最后一次只能读到2个。当最后一次返回值比期望的小时明已经是最后一次读取了。

到此为止讲到的这些函数,都是文件的顺序读写。

那么在文件操作(终卷)中,我们再继续看文件的随机读写和其他内容。

到此本文结束,祝阅读愉快^_^

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

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

相关文章

人大金仓数据库报sys_user表字段不存在的问题

目录 一.问题&#xff1a; 二.原因 三.解决方法&#xff1a; 一.问题&#xff1a; 公司的一个项目从oracle切换到人大金仓之后&#xff0c;突然报了一个sys_user里面的字段不存在。 二.原因 检查了很多次确信sys_user表没问题&#xff0c;查了相应的文档之后发现原来人大金…

企业自建邮件系统的优势,安全性更高,功能更灵活,维护更便捷

在当今企业信息管理的浪潮中&#xff0c;企业邮件系统显得尤为关键&#xff0c;它不仅加强了内部的沟通效率&#xff0c;还对外展示了企业的专业形象。然而&#xff0c;传统租用企业邮箱服务存在一些不足&#xff0c;如缺乏灵活性、数据管理混乱和难以实现个性化需求&#xff0…

Wireshark 如何查找包含特定数据的数据帧

1、查找包含特定 string 的数据帧 使用如下指令&#xff1a; 双引号中所要查找的字符串 frame contains "xxx" 查找字符串 “heartbeat” 示例&#xff1a; 2、查找包含特定16进制的数据帧 使用如下指令&#xff1a; TCP&#xff1a;在TCP流中查找 tcp contai…

服务器数据恢复—raid5阵列上层XFS文件系统数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌CX4-480型号服务器存储&#xff0c;该服务器存储内有一组由20块硬盘组建的raid5磁盘阵列&#xff1b;存储空间分配了1个lun。 服务器存储故障&#xff1a; 工作人员将服务器重装操作系统后&#xff0c;未知原因导致服务器操作系统层…

LlamaIndex 一 简单文档查询

前言 在学习LangChain的时候&#xff0c;我接触到了LlamaIndex。它犹如我在开发vue时用到的axios&#xff0c;主要负责数据打理。别问我为什么打这个比方&#xff0c;前端老狗&#xff0c;重走AI路&#xff0c;闭关一年能否学的妥当&#xff1f; LlamaIndex 是一个用于 LLM 应…

前端项目打包、部署的基础 (vue)

详细请看B站视频 BV19n4y1d7Gr 《禹神&#xff1a;前端项目部署指南&#xff0c;前端项目打包上线》&#xff0c;本博客为自用视频笔记。 目录 项目打包vue打包打包前分析项目请求 本地服务器部署问题 & 解决问题1&#xff1a;刷新页面404问题问题2&#xff1a;ajax请求废…

【人工智能】第六部分:ChatGPT的进一步发展和研究方向

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

秀肌肉-海外短剧系统的案例展示

多语种可以选择&#xff0c;分销功能&#xff0c;多种海外支付方式&#xff0c;多种登录模式可供选择&#xff0c;总之你想到的我们都做了&#xff0c;你没想到的我们也都做了

Partially Spoofed Audio Detection论文介绍(ICASSP 2024)

An Efficient Temporary Deepfake Location Approach Based Embeddings for Partially Spoofed Audio Detection 论文翻译名&#xff1a;一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入 摘要&#xff1a; 部分伪造音频检测是一项具有挑战性的任务&#xff0…

NSSCTF-Web题目6

目录 [NISACTF 2022]checkin 1、题目 2、知识点 3、思路 [NISACTF 2022]babyupload 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]1z_unserialize 1、题目 2、知识点 3、思路 [NISACTF 2022]checkin 1、题目 2、知识点 010编辑器的使用、url编码 3、思路 打…

基于NANO 9K 开发板加载PICORV32软核,并建立交叉编译环境

目录 0. 环境准备 1. 安装交叉编译器 2. 理解makefile工作机理 3. 熟悉示例程序的代码结构&#xff0c;理解软核代码的底层驱动原理 4. 熟悉烧录环节的工作机理&#xff0c; 建立下载环境 5. 编写例子blink&#xff0c; printf等&#xff0c; 加载运行 6. 后续任务 0.…

2024年华为OD机试真题-多段线数据压缩-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集)​ 题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3…

Modbus TCP转CanOpen网关携手FANUC机器人助力新能源汽车

Modbus TCP转CanOpen网关与FANUC机器手臂的现场应用可以实现FANUC机器手臂与其他设备之间的数据交换和通信。CANopen是一种常见的网络协议&#xff0c;用于处理机器和设备之间的通信&#xff0c;并广泛应用于自动化领域。而Modbus TCP是一种基于TCP/IP协议的通信协议&#xff0…

智慧互联网医院系统开发指南:从源码到在线问诊APP

近期&#xff0c;互联网医院系统的热度非常高&#xff0c;很多人跟小编提问如何开发&#xff0c;今天小编将从零开始为大家详解互联网医院系统源码&#xff0c;以及在线问诊APP开发技术。 一、需求分析与系统设计 1.1 需求分析 用户管理 预约挂号 在线问诊 电子病历 药品…

定个小目标之每天刷LeetCode热题(11)

这是道简单题&#xff0c;只想到了暴力解法&#xff0c;就是用集合存储起来&#xff0c;然后找出其中的众数&#xff0c;看了一下题解&#xff0c;发现有多种解法&#xff0c;我觉得Boyer-Moore 投票算法是最优解&#xff0c;看了官方对这个算法的解释&#xff0c;我是这样理解…

手把手教你用Spring Boot搭建AI原生应用

作者 | 文心智能体平台 导读 本文以快速开发一个 AI 原生应用为目的&#xff0c;介绍了 Spring AI 的包括对话模型、提示词模板、Function Calling、结构化输出、图片生成、向量化、向量数据库等全部核心功能&#xff0c;并介绍了检索增强生成的技术。依赖 Spring AI 提供的功能…

进阶之格式化qDebug()输出

创作灵感 刚刚在看qt帮助手册时&#xff0c;无意间在<QtGlobal>中看见了这个函数void qSetMessagePattern(const QString &pattern)&#xff0c;该函数的精华在于&#xff0c;你可以直接重定义qDebug()的输出结果格式。以往打印调试内容&#xff0c;调试内容所在的行…

00-macOS和Linux安装和管理多个Python版本

在 Mac 上安装多个 Python 版本可通过几种不同方法实现。 1 Homebrew 1.1 安装 Homebrew 若安装过&#xff0c;跳过该步。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 1.2 安装 Python 如安装 Python …

计算机毕业设计 | SSM 校园线上订餐系统 外卖购物网站(附源码)

1&#xff0c; 概述 1.1 项目背景 传统的外卖方式就是打电话预定&#xff0c;然而&#xff0c;在这种方式中&#xff0c;顾客往往通过餐厅散发的传单来获取餐厅的相关信息&#xff0c;通过电话来传达自己的订单信息&#xff0c;餐厅方面通过电话接受订单后&#xff0c;一般通…

纷享销客集成平台(IPaaS)解决方案

针对传统对接方式中的痛点&#xff0c;集成平台提炼了一套成熟的解决方案和配套工具。 痛点&#xff11;&#xff1a;编码工作量大。 每个功能点&#xff0c;和众多的容错分支&#xff0c;都需要逐行编码实现。日志打少了影响问题排查&#xff0c;打多了浪费大量存储。 集成…