【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…

HOW - 面试技巧系列 - 全英文面试

自我介绍 “can you tell me a little bit about yourself?” “please introduce yourself.” 工作经验 “can you describe your most recent job experience?” “how does your experience make you a good fit for this position?” 职业规划 “what are your l…

C语言---指针part2

指针操作 一维 字符数组 1. 字符型数组 --- 存放字符串的 char s[] "hello"; [h ] <---0x1000 [e ] [l ] [l ] [o ] [\0] //谁能这块空间的地址 --- 数组名 s --->怎么能保存s所代表的地址值 //s数组名 --- 数组首元素的地址 &s[0] --->地…

谷歌浏览器使用--disable-web-security --user-data-dir解决跨域的解释

–disable-web-security 和 --user-data-dir 是Google Chrome&#xff08;及其开源版本Chromium&#xff09;浏览器在启动时可以使用的命令行参数。下面我将分别解释这两个参数的含义和用途&#xff1a; 1.–disable-web-security 含义&#xff1a;这个参数用于禁用Chrome浏览…

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

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

9. 媒体查询与响应式设计

随着移动设备和不同尺寸屏幕的普及&#xff0c;响应式设计成为前端开发的重要组成部分。响应式设计确保网页在不同设备上都有良好的用户体验。本章将详细介绍媒体查询的基础知识、语法与使用方法&#xff0c;以及如何运用CSS3实现响应式设计。 9.1 媒体查询基础 媒体查询是CS…

Flink协调器Coordinator及自定义Operator

Flink协调器Coordinator及自定义Operator 最近的项目开发过程中&#xff0c;使用到了Flink中的协调器以及自定义算子相关的内容&#xff0c;本篇文章主要介绍Flink中的协调器是什么&#xff0c;如何用&#xff0c;以及协调器与算子间的交互。 协调器Coordinator Flink中的协调…

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;你没想到的我们也都做了

企微自动化机器人的应用与前景

一、引言 随着信息技术的飞速发展&#xff0c;企业对于提高内部运营效率、降低人力成本的需求日益迫切。在这样的背景下&#xff0c;企微自动化机器人应运而生&#xff0c;以其高效、便捷的特点&#xff0c;迅速成为企业内部的得力助手。本文将深入探讨企微自动化机器人的应用现…

头歌易-算式运算的合法性

给定一个算式运算,算式由运算数、+、-、*、/、(、)组成,请编写程序判断该算式运算是否合法。如果合法,计算该算式的值。 输入描述: 第一行输入一个运算表达式 输出描述: 如果表达式合法则计算其值,结果保留两位小数,如果不合法则输出 表达式不合法! 输入样例: (5+3)…

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…