Linux:IO库函数
目录
- 标准库IO函数
- 一、fopen
- 二、fwrite
- 三、fread
- 四、fseek
- 五、fclose
在编写程序时,离不开IO操作,最常见的IO操作就是用printf函数进行打印,本文主要介绍的是封装后的IO库函数。
标准库IO函数
常使用的IO库函数如下:
| 函数 | 作用 |
|---|---|
| fopen | 打开指定的文件 |
| fwrite | 向指定的文件写入数据 |
| fread | 从指定的文件读取数据 |
| fseek | 跳转到指定文件的读写位置 |
| fclose | 关闭指定文件 |
一、fopen
FILE *fopen(const char *path, const char *mode);
作用:用指定的方式打开指定的文件
- const char *path:文件名(要带这个文件的路径)
- const char *mode:文件的打开方式(只读、追加写等方式)
返回值:成功返回FILE*文件流指针,通过这个指针来操作文件,失败返回NULL。
文件打开方式 mode:
- r:只读,文件必须存在,否则打开失败
- r+:可读可写,文件必须存在,否则打开失败
- w:只写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
- w+:可读可写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
- a:追加只写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
- a+:可读追加写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
- b:以二进制方式打开文件,否则默认以文本形式打开文件
以上这些方式都是可以组合的,比如可以使用二进制打开并且可读追加写:ba+
二、fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
作用:通过传递的文件流指针,向文件写入指定大小的数据。
- const void *ptr:要向文件写入的数据的首地址
- size_t size:要向文件写入数据的块大小。因为文件的写入和读取是以块为单位的,块大小就是把数据均分成几块,每块文件有多大。
- size_t nmemb:要向文件写入数据的块的个数。
- FILE *stream:文件流指针,表示要把数据写入到哪个文件
返回值:返回实际写入文件的完整块的个数(1.5个块就返回1,0.5就返回0),出错返回0。
三、fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
作用:从指定的文件读取指定大小的数据。
- void *ptr:用来存储读取到的数据的空间的首地址。
- size_t size:要读取的块的大小。
- size_t nmemb:要读取的块的个数。
- FILE *stream:要操作的文件的文件流指针。
返回值:成功返回实际读取到的完整块的个数,读取不足一块的返回0,读取到了文件末尾返回0,出错了返回0。因此返回值是有歧义的。
因为返回值有歧义,因此通常把nmenb设置为要读取的数据的长度,把块的大小设置成1,这种方式可以明确通过返回值判断,到底有没有读取到数据。还可以使用下面两个函数来帮助判断返回值的含义。
-
int ferror(FILE* stream):
- 作用:测试文件的上一次操作是否出错了,出错了返回1
-
int feof(FILE*stream):
- 作用:测试文件读写是否到达文件末尾,到达文件末尾返回1
四、fseek
int fseek(FILE *stream, long offset, int whence);
作用:跳转文件的读写位置。
- FILE *stream:要操作的文件流指针
- long offset:偏移量(负数表示向前偏移,整数表示向后偏移,0不偏移)
- int whence:表示从哪里开始偏移
返回值:成功返回0,失败返回-1
什么是读写位置,为什么要跳转?
如果往一个文件写数据,写完之后直接读取,你会发现什么也读不出来。因为文件有一个读写位置,你可以理解成一个指针,这个指针指向的是你文件操作的最末端,你从最末端读取自然读取不出来,因此读取前要把指针指向文件的开头,也就是把读写位置跳转到开头。

whence选项:
- SEEK_SET:起始位置
- SEEK_CUR:当前读写位置
- SEEK_END:末尾位置
注意:如果你想在追加写的时候跳转读写位置,比如说,想在文件的开头进行追加写,这样是不会成功的,因为追加写只会在文件末尾进行写入。
文件的写入是一种覆盖式写入,比如我将读写位置跳转到w字符处,然后写入123,这样wor三个字符会被覆盖。

五、fclose
int fclose(FILE *stream);
作用:关闭文件
- FILE *stream:要关闭的文件的文件流指针
返回值:成功返回0,失败返回-1
相关文章:
Linux:IO库函数
目录标准库IO函数一、fopen二、fwrite三、fread四、fseek五、fclose在编写程序时,离不开IO操作,最常见的IO操作就是用printf函数进行打印,本文主要介绍的是封装后的IO库函数。 标准库IO函数 常使用的IO库函数如下: 函数作用fop…...
Go爬虫学习笔记
N002.02 Go分布式爬虫实战 开篇 学习三阶段 入门,照猫画虎底层,了解方方面面,深入阅读源码和书籍借助开源组件来进行复杂设计,窥探各个组件赋能业务 分布式系统: 扩展性一致性可用性高并发微服务 爬虫࿱…...
数据结构课程设计:高铁信息管理系统(C++实现)
目录 简介实验输出实验要求代码运行环境结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖…...
Python 模块之 datetime
datetime 对象格式化为字符串 标准转换格式符号: %a 本地星期的短名称 如:Sun, Mon, ..., Sat (en_US); So, Mo, ..., Sa (de_DE) %A 本地星期全名称 如 :Sunday, Monday, ..., Saturday (en_US);Sonntag, Montag, ..., Samstag (de_DE) %w…...
linux安装编译ffmpeg
ffmpeg下载:http://ffmpeg.org/releases可以下载适合自己的版本。我下载的是5.0版本,然后解压:tar xvf ffmpeg-5.0.tar.gz进入ffmpegcd ffmpeg-5.0编译ffmpeg./configure --prefix/root/ffmpeg //编译文件存放的路径如果是交叉编译添加以下参…...
嵌入式Linux驱动开发(二)LED驱动
1. Linux下LED驱动原理 与裸机区别在于,编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写,linux下需要经过MMU。 1.1 地址映射相关概念 1)MMU(Memory Manage Unit - 内存管理单元): …...
C++学习
强制转换运算符 C 引入了四种不同的强制转换运算符以进行强制转换: const_caststatic_castreinterpret_castdynamic_cast C语言强制类型转换缺点: 主要是为了克服C语言强制类型转换的以下三个缺点。 没有从形式上体现转换功能和风险的不同。 例如&am…...
JavaEE简单示例——依赖注入
简单介绍: 首先我们要知道,依赖注入就是赋值,带着这句话去理解依赖注入就非常的简单了,将文中所有的依赖注入全部脑部替换成给属性赋值,再去理解依赖注入的概念。 依赖注入(DI)是指IoC容器在运…...
大数据框架之Hive: 第7章 综合案例练习(初级)
第7章 综合案例练习(初级) 一 环境准备 1.1 建表语句 hive> -- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出…...
kafka:linux 安装 kafka集群
kafka运行依赖于 jdk、zookeeper,kafka可视化工具选择kafka-eagle。所以要装的组件有:jdk、zookeeper、kafka、kafka-eagle一、安装jdk下载linux版本的jdk包,比如:jdk-8u192-linux-x64.tar.gz。将其复制到 /opt 目录下并解压&…...
springboot实现Hessian协议的RPC服务
背景 这段时间在公司接手了一个新项目,看到一段代码非常奇怪的,研究了好久。内容大概是这样 public void getUser (int id) {userService.getById(id); }当我点击这个方法进去的时候,我发现这个UserService类居然是导入jar包的一个接口&…...
2-6 SpringCloud快速开发入门: Eureka 服务注册中心发现与消费服务
接上一章节向Eureka 服务注册中心注册服务,这里讲讲Eureka 服务注册中心发现与消费服务 Eureka 服务注册中心发现与消费服务 我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下来我们就可以发现和消费服务了࿰…...
Java-Web之s2-001与CommonsCollections
本文源自我个人入坑Java-Web安全的一点小经验,献给那些看得懂java代码但不知道从哪里入手代审的师傅们:) Struts2之s2-001 环境配置 说说环境配置的问题,大多数人对漏洞复现的恐惧感还是来自于环境的配置,也许配了大…...
【JavaSE】数组的定义和使用(下)
数组的定义和使用(下)4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素(顺序查找)4.5 查找数组中指定元素(二分查找)4.6…...
Oracle 实现对全局错误语句的审计监控 ORA- alert
--将所有数据库ora-错误写入表create table error_tab (username varchar2(4000), d_current_nr_error varchar2(4000), ora_server_error_msg varchar2(4000), full_text varchar2(4000),errdate date);create or replace trigger error_triggerafter servererror on database…...
React解决样式冲突问题的方法
React解决样式冲突问题的方法 前言: 1、React最终编译打包后都在一个html页面中,如果在两个组件中取一样类名分别引用在自身,那么后者会覆盖前者。 2、默认情况下,只要导入了组件,不管组件有没有显示在页面中&#x…...
Go项目(用户操作微服务)
简介 用户留言、收藏、修改收货地址等,统一放在用户操作微服务这里按照业务类型划分微服务表设计,三张表// 用户收藏 type UserFav struct {BaseModel// 联合索引 idx_user_goods,且唯一User int32 gorm:"type:int;index:idx_user_goo…...
Spring Boot统一功能处理
目录 一、统一用户登录权限验证 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置 1.3 统一访问前缀 二、统一异常处理 三、统一数据格式返回 一、统一用户登录权限验证 1.1 自定义拦截器 拦截器是一个普通的类,需要实现HandlerInterceptor接口并重写pre…...
ETCD多次出现CONTEXT DEADLINE EXCEEDED
roothqa-master-01:~# etcdctl --endpoints$ETCD_ENDPOINTS member list --write-outtable {“level”:“warn”,“ts”:“2020-03-23T14:19:45.0330800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of unary invoker failed”,“target”:“endpoi…...
git 提交 多人开发避免冲突
代码正常提交 git add . git commit -m ‘备注信息’ git status 查看本地提交状态 git pull 拉取代码 git push origin master 指定远程仓库名和分支名 ‘’ 如果多人开发 A和B 提交避免冲突 B拉取代码修改内容直接提交后 A也修改了内容在git add / git commit / git pull / g…...
gobang高级配置指南:如何自定义主题和键位绑定
gobang高级配置指南:如何自定义主题和键位绑定 【免费下载链接】gobang A cross-platform TUI database management tool written in Rust 项目地址: https://gitcode.com/gh_mirrors/go/gobang gobang是一款跨平台的TUI数据库管理工具,采用Rust编…...
Java Spring Boot 中构造器循环依赖的处理
本文探讨了 Java Spring Boot 循环依赖问题是由于工程中结构设计不当造成的。通过分析示例代码,解释了循环依赖的原因,并提供了有效的解决方案来避免这些问题,重点是避免在结构中创建依赖对象的新例子,以防止无限递归调用 StackOv…...
掌握微信聊天记录永久备份:从数据主权到智能记忆管理
掌握微信聊天记录永久备份:从数据主权到智能记忆管理 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChat…...
Apollo配置中心:从基础概念到实战应用全解析
1. Apollo配置中心初探:为什么我们需要它? 想象一下你正在开发一个电商系统,数据库连接地址、支付接口密钥、商品库存阈值等配置信息散落在20个不同的properties文件里。每次修改配置都需要重新打包部署,半夜三点被叫起来改生产环…...
5个步骤让你的魔兽争霸3在现代电脑上完美运行:WarcraftHelper终极优化指南
5个步骤让你的魔兽争霸3在现代电脑上完美运行:WarcraftHelper终极优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔…...
告别死记硬背!信息系统项目管理师(高项)思维导图活用法:从考前3个月到考前一天的全周期规划
信息系统项目管理师备考革命:用思维导图构建你的动态知识引擎 备考信息系统项目管理师(高项)的过程,常常让考生陷入两难困境:一方面要掌握庞杂的知识体系,另一方面又要应对实际工作中的时间压力。传统死记硬…...
从ReVeal到实战:基于图神经网络的智能漏洞检测技术演进与落地思考
1. 图神经网络在漏洞检测中的崛起 第一次接触代码漏洞检测领域时,我被传统方法的繁琐流程震惊了。记得当时需要手动定义数百条规则来检测缓冲区溢出漏洞,每次遇到新漏洞类型就得加班加点补充规则。直到2018年遇到ReVeal论文,才发现图神经网络…...
实时语音合成全解析:技术原理、应用场景与未来展望
实时语音合成全解析:技术原理、应用场景与未来展望 引言 在人工智能浪潮席卷全球的今天,让机器“开口说话”已不再是科幻场景。实时语音合成(Real-Time TTS) 技术,作为连接数字世界与人类听觉的桥梁,正以…...
5个实用技巧:让你的微信自动化工具真正发挥价值
5个实用技巧:让你的微信自动化工具真正发挥价值 【免费下载链接】wxauto Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人 项目地址: https://gitcode.com/gh_mirrors/wx/wxa…...
使用LingBot-Depth优化Git版本控制中的3D模型管理
使用LingBot-Depth优化Git版本控制中的3D模型管理 1. 引言 在3D设计和游戏开发领域,版本控制一直是个头疼的问题。传统的Git系统擅长处理代码和文本文件,但面对3D模型这种二进制文件就显得力不从心了。每次修改模型后,你只能看到"文件…...
