文件操作<C语言>

导言

        平时我们在写程序时,在运行时申请内存空间,运行完时内存空间被收回,如果想要持久化的保存,我们就可以使用文件,所以下文将要介绍一些在程序中完成一些文件操作。


目录

导言

文件流

文件指针

文件的打开与关闭

打开:

关闭:

文件操作

顺序读写:

单个字符:

fputc函数

 fgetc函数

字符串:

 fputs函数

  fgets函数

格式化:

  fprintf函数

fscanf函数

其他:

  sprintf函数

 

sscanf函数

随机读写:

fseek函数

 ftell函数

 rewind函数

 文件结束判定

feof函数

 ferror函数


文件流

        我们常使用的是标准流,它们在使用C语言编写程序时已经默认打开:

●stdin—标准输入流,大部分从键盘输入,比如scanf函数

●stdout—标准输出流,大部分从显示器输出,比如printf函数

●stderr—标准错误流,大部分从显示器输出

 这三种流,属于FILE*类型的指针,我们常常称为文件指针。


文件指针

        文件指针FILE*都指向了一个包含文件信息的结构体。

每个被使用的文件都会自动开辟一个文件信息区,这个文件信息区存放着文件的各种信息,他被存放在一个结构体中,结构体的类型是由系统命名的,命名为FILE。

vs2013这个文件类型声明
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
};
typedef struct _iobuf FILE;//typedef重命名struct _iobuf为FILE

这样我们在后面使用时创建一个FILE*型的指针,就可以指向任意一个文件信息区(结构体变量)了。

放一张bit课件的图:


文件的打开与关闭

        前面我们提到在C语言中默认打开的流只有标准流,那么我们想要完成文件操作时,那么我们就得先打开文件流,在完成操作后再关闭文件流。

打开:

使用函数fopen()打开文件

函数参数及其返回值

FILE* fopen(const char* filename,const char* made);
//filename:文件名(文件路径)
//made:打开方式
//返回值:FILE*,一个指向filename文件信息区的文件指针,执行失败返回NULL

注意点

●关于参数filename两种表达方式:

绝对路径:从根目录开始创建(C/D盘),任何文件都可访问,如:c:\code\test.txt

在C语言中地址是个字符串,\会被当做转义字符,那么我们可以使用\\或者/的方式来代替

相对路径:以当前路径为基础访问,“.”表示当前路径,“..”表示上一层路径。如:
假设我的当前路径为c:\cyuyan\code\test.txt
我的桌面路径:c:\cyuyan\code\desktop
我想用相对路径访问我的桌面:..\desktop\
相对路径在本目录访问文件时常常会省略.\,直接使用文件名+后缀的方式访问
●关于常用参数mode:
●为了输入(读)数据, mode为“r”,存在:打开,不存在:报错
●为了输出(写)数据,并将目标文件内容清空, mode为“w”,存在:打开,不存在:新建一个

使用举例:

文件运行程序前:

 运行程序:

 文件运行程序后:

关于文件打开值得注意的是:mode的参数决定了后续的文件操作的权限,以读的方式打开只能进行一些读的操作,以写的方式打开只能进行一些写的操作。


关闭:

使用函数fclose()关闭文件

函数参数及其返回值

int fclose(FILE* stream);
//stream:文件流
//返回值:成功:0,失败:EOF(-1)

文件打开后不关闭会造成内存泄漏,这与动态内存不free是一个道理,最后记得置NULL。

使用举例:


文件操作

顺序读写:

单个字符:

fputc函数

功能:写单个字符到流。(输出——写)

 函数参数及其返回值

int fputc(int character ,FILE* stream);
//character:单个字符
//stream:文件流
//返回值:成功:写入字符的ASCII码值,失败:EOF(-1)

使用举例:

当前目录下的test.txt文件内容:


 fgetc函数

功能:从流读单个字符。(输入——读)

 函数参数及其返回值

int fgettc(FILE* stream);
//stream:文件流
//返回值:成功:读取字符的ASCII码值,失败:EOF(-1)

使用举例:

我们先在当前目录创建一个test.txt文件,并写入字符b保存。

运行程序打印出fgetc的返回值(这个返回值就是文件内字符的ASCII码值):

 小写字母b的ASCII码值为98,说明我们读取成功。

值得注意的是fgetc和fputc函数只是针对单个字符的,所以文件存在多个字符时,读取时是第一个字符。


字符串:

 fputs函数

功能:写字符串到流。(输出——写)

 函数参数及其返回值

int fputs(const char* str,FILE* stream);
//str:要写入的字符串
//stream:文件流
//返回值:成功:非负整数,失败:EOF(-1),设置errorno

使用举例:

返回0,也是一个非负整数,且大部分编译器都返回0。

 test.txt文件的写入情况:


  fgets函数

功能:从流中读取字符串。(输入——读)

 函数参数及其返回值

char* fgets(const char* str, int num ,FILE* stream);
//str:从流中读取的字符放在这里面
//stream:文件流
//num:读取num-1个字符,最后一个放\0,
//返回值:成功:字符串str首地址,失败:NULL

注意点:

●遇到换行符停止读取,且这个换行符也会被读取到str中,所以在一些特定场景下,为了输出格式别忘了替换掉换行符\n。

●fgets函数还常常运用于标准输入流,因为它只有读取到\n时才停止,会读取空格,使用时,stream参数为stdin。

使用举例:

创建一个存放着两行数据的test.txt文件:

运行fgets程序:

 我们看到它的确读取成功了,打印时没有加\n,打印出来却自动换行了,说明读取了\n,验证了前面的注意点,我们可以看Debug看一下:

值得注意的是fgets还常常用于完成一些标准输入的操作,它会读取空白字符,且它比gets安全。


格式化:

  fprintf函数

功能:格式化数据到流。(输出——写)

 函数参数及其返回值

int fprintf(FILE* stream , const char* format,……);
//stream:文件流
//format:与printf函数中的“字符串”类似,可以放入占位符
//……:可变参数列表,与printf类似
//返回值:成功:写入字符数,失败:EOF(-1)

使用举例:

运行程序后:

fprintf函数与printf函数类似,只是在参数部分多出了文件流,其他参数不变,返回值也是。


fscanf函数

功能:从流中读取格式化数据。(输入——读)

 函数参数及其返回值

int fscanf(FILE* stream , const char* format ,……);
//stream:文件流
//format:"占位符"与scanf函数第一个参数类似
//……:可变列表(变量名)
//返回值:成功:读取个数,失败:EOF(-1)

使用举例:

创建一个test.txt文件,并写入数据:

 运行程序:

可以观察到,fscanf函数与scanf函数类似,只是多出文件流参数, 其他与scanf函数类似,且需要取地址&


其他:

  sprintf函数

功能:格式化数据到字符串。(输出)

 函数参数及其返回值

int sprintf(char* str, const char* format,……);
//str:要写入的字符串
//format:与printf函数中的“字符串”类似,可以放入占位符
//……:可变参数列表,与printf类似
//返回值:成功:写入字符数,失败:EOF(-1)

使用举例:


 
sscanf函数

功能:从字符串格式化数据。(输入)

 函数参数及其返回值

int sscanf(char* str, const char* format,……);
//str:要读取的字符串
//format:与scanf函数中的“字符串”类似,可以放入占位符
//……:可变参数列表,与scanf类似
//返回值:成功:读取项数,失败:EOF(-1)

使用举例:

 这两个函数可以简单理解为字符串与格式化数据的互换函数。


随机读写:

fseek函数

功能:改变光标位置

 函数参数及其返回值

int fseek(FILE* stream , long int offset ,int origin)
//stream:文件流
//offset:相对于参数origin的偏移量
//origin:三个选项:SEEK_SET:文件指针起始位置、SEEK_CUR:文件指针当前位置、SEEK_END:文件指针结束位置
//返回值:成功:0,失败:非0整数并设置errorno

使用举例:

我们先创建一个文件存放helloworld 18:

 运行程序:


 ftell函数

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

 函数参数及其返回值

long int ftell(FILE* stream);
//stream:文件流
//返回值:偏移量

使用举例:

 

 


 rewind函数

功能:使文件指针回到起始位置

 函数参数及其返回值

void rewind(FILE* stream);
//stream:文件流
//返回值:无

使用举例:


 文件结束判定

feof函数

功能:判断文件结束原因(返回值0:遇到错误,非0:遇到文件尾)

 函数参数及其返回值

int feof(FILE* stream);
//stream:文件流
//返回值:0:遇到错误,非0:遇到文件尾

使用举例:


 

 ferror函数

功能:判断文件错误状态

 函数参数及其返回值

int feof(FILE* stream);
//stream:文件流
//返回值:非零值(1):遇到错误,0:没错误

这应该是我所有博客中最长的一篇,因为是笔记的原因,然后也不太熟,所以前前后后几天花了6、7小时,最后也没来的及检查一遍,请佬们斧正,封面图是ai生成的。

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

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

相关文章

Android进程间通信 Messenger详解

//这里服务端Service是运行在单独的进程中的 android:process“:other” class MessengerService : Service() { private lateinit var mMessenger: Messenger override fun onBind(intent: Intent): IBinder { log(TAG, “onBind~”) //传入Handler实例化Messenger mMes…

Golang | Leetcode Golang题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; func calculateMinimumHP(dungeon [][]int) int {n, m : len(dungeon), len(dungeon[0])dp : make([][]int, n 1)for i : 0; i < len(dp); i {dp[i] make([]int, m 1)for j : 0; j < len(dp[i]); j {dp[i][j] math.MaxInt32}}dp[…

mysql数据库切换成kingbase(人大金仓)数据库时遇到的字段不存在问题

一、问题描述 mysql数据库切换成国产数据库人大金仓&#xff08;kingbase&#xff09;数据库的遇到的字段不存在的问题,根本原因其实是没有找到相对应的表&#xff0c;报错示例如下图所示&#xff1a; 二、问题解决 1、如果所有的表都发生上述的错误&#xff0c;kingbase的…

基于matlab的不同边缘检测算子的边缘检测

1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化&#xff0c;如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…

OSPF 2类LSA详解

概述 上图为2类LSA : Network LSA 的报文格式 , 我们重点关注3个报文字段即可 , 其他内容没有实际的信息 Link State ID : DR的接口IP地址 Network Mask : 该MA网络的掩码 Attached Router : 连接在该MA网络的所有路由器的Router ID 2类LSA一定是DR产生的 , 关于OSPF DR的细节…

数据结构之二叉树的超详细讲解(3)--(二叉树的遍历和操作)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(3)--(二叉树链式结构的实现) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在…

展讯-QMI8658和气压传感器驱动调试

1.调试QMI8658 参考demo&#xff0c;添加QMI8610相关内容 当前驱动路径位于&#xff1a;bsp/modules/input/misc/qmi8610/qmi8610.c 编译使用make sockoimage 用fastboot烧录 1.确定驱动被正常加载 代码添加之后&#xff0c;首先确定有没有进入当前驱动文件 dmesg |grep …

如何用GO语言实现冒泡排序算法?

本章教程,介绍一下如何用GO语言实现基础排序算法中的冒泡排序。 一、程序代码 package mainimport ("fmt""math/rand""time" )// bubbleSort 函数实现冒泡排序算法 func bubbleSort(arr []int) {n

32 - 判断三角形(高频 SQL 50 题基础版)

32 - 判断三角形 select *,if(xy>z and xz>y and zy > x,Yes,No) triangle fromTriangle;

Day9 —— 大数据技术之ZooKeeper

ZooKeeper快速入门系列 ZooKeeper的概述什么是ZooKeeper&#xff1f;ZooKeeper的特点和功能使用ZooKeeper的原因 ZooKeeper数据模型ZooKeeper安装ZooKeeper配置ZooKeeper命令行操作常见服务端命令 ZooKeeper的概述 什么是ZooKeeper&#xff1f; ZooKeeper是一个开源的分布式协…

jarvisoj_level2

首先检查checksec 可以看见no canary found 说明可能是栈溢出 运行一下程序 随便输一个,得到hello world(感觉这一步好像没啥用,没有RE那用) IDA 32 打开 后门 漏洞点 buf: 代码思路:利用溢出,把buf填满,然后构造程序,得到获取shell的目的 exp来自 BUUCTF—jarvisoj_level…

【Qt】学习Day1

文章目录 Qt简介创建第一个Qt程序创建过程介绍main函数工程文件头文件控件源文件快捷键按钮控件常用API对象树坐标系 信号和槽自定义信号自定义槽函数触发自定义的信号案例-下课后&#xff0c;老师触发饿了信号&#xff0c;学生响应信号&#xff0c;请客吃饭重载信号连接信号La…

Paxos分布式共识算法

Paxos分布式共识算法 一、简介 Paxos算法是由莱斯利兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。它主要用于解决分布式系统中如何就某个值达成一致&#xff0c;并保证整个系统的一致性&#xff0c;即使在部分节点发生故障的情况下…

论文浅尝 | 基于生成模型的多模态实体链接

笔记整理&#xff1a;郭凌冰&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/2306.12725 1. 动机 多模态实体链接&#xff08;Multimodal Entity Linking&#xff0c;MEL&#xff09;旨在将带有多模态上下文的提及映射到知识库…

[SAP ABAP] 运算符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…

keep-alive实现页面缓存

<!--router-view 实现页面缓存--> <router-view v-slot"{Component}"><keep-alive :max"8"><component :is"Component"></component></keep-alive> </router-view>

2024年6月23日 十二生肖 今日运势

小运播报&#xff1a;2024年6月23日&#xff0c;星期日&#xff0c;农历五月十八 &#xff08;甲辰年庚午月戊午日&#xff09;&#xff0c;法定节假日。今天国际奥林匹克日&#xff0c;坚不可摧的意志&#xff0c;披荆斩棘的豪情&#xff0c;永远值得拥有&#xff01; 红榜生…

算法金 | 统计学的回归和机器学习中的回归有什么差别?

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 统计学中的回归 目标&#xff1a; 主要用于解释和推断自变量&#xff08;independent variables&#xff09;和因变量&#xff08;de…

array_key_exists() expects parameter 2 to be array, null given

公众号获取微信服务器IP地址 错误代码如下 public function getwxIP(){//获取微信服务器IP地址$accessToken $this->getwxoaiAccessToken();$userToken new UserToken();$result $userToken->curl_get("https: //api.weixin.qq.com/cgi-bin/get_api_domain_ip…

Day58 代码随想录打卡|二叉树篇---将有序数组转换为二叉搜索树

题目&#xff08;leecode T108&#xff09;&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 方法&#xff1a;用有序数组构造平衡二叉搜索树&#xff0c;和我们之前有一题的思路差不多&#xff0c…