使用fopen等标准C库来操作文件
fopen
需要的头文件:
#include <stdio.h>
函数原型:
FILE *fopen(const char *pathname, const char *mode);
参数:
- pathname: 文件路径
- mode:
- “r” :以只读方式打开文件,该文件必须存在。
- “w” :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
- “a” :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
- “r+” :以可读写方式打开文件,该文件必须存在。
- “w+” :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
- “a+”:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
- “rb” :只读打开一个二进制文件,只允许读数据。
- “wb” :只写打开或建立一个二进制文件,只允许写数据。
- “ab” :追加打开一个二进制文件,并在文件末尾写数据。
- “rb+” :读写打开一个二进制文件,允许读写数据,文件必须存在。
- “wb+” :读写打开或建立一个二进制文件,允许读和写。
- “ab+” :读写打开一个二进制文件,允许读,或在文件末追加数据。
- “rt” :只读打开一个文本文件,只允许读数据。
- “wt” :只写打开或建立一个文本文件,只允许写数据。
- “at” :追加打开一个文本文件,并在文件末尾写数据。
- “rt+” :读写打开一个文本文件,允许读和写。
- “wt+” :读写打开或建立一个文本文件,允许读写。
- “at+” :读写打开一个文本文件,允许读,或在文件末追加数据。
打开方式总结:
① 打开是否为二进制,用“b”标识;
② 读写方式有以下几种:只读、只写、读写、追加只写、追加读写。
③ 对文件是否必须存在,以及存在时是清空还是追加会有不同的响应。具体判断如下图:
参考:fopen函数mode参数详解_fopen mode_allinallinallin的博客-CSDN博客
- 返回值:文件顺利打开后,指向该流的文件指针就会被返回,若文件打开失败则返回NULL。
fclose
需要的头文件:
#include <stdio.h>
函数原型:
int fclose(FILE *stream);
参数:
- stream: 文件指针(也就是fopen成功之后返回的指针)
fread 和 fwrite
需要的头文件:
#include <stdio.h>
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:
- ptr: 指向“数据读取到之后存储到的缓存区”/“要写入的数据存放的缓存区”的指针
- size: 读取/写入 的 基本单元 字节大小 , 单位是字节 , 且一般是缓冲的单位大小
- 如果缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
- 如果缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
- nmemb: 读取/写入 的 基本单元 个数
- stream: 文件指针
- 返回值 : 实际从文件中读取/写入的 基本单元 个数 ; 读取/写入的字节数是 基本单元数 * 基本单元字节大小
- 对于写write:哪怕size设置基本单元的大小是100个char,但是nmemb设置了1,那么返回值就是1, 返回值严格跟随nmemb的值,但是当缓冲区的数据已经全部写完的时候,就不会再继续增加内容了,只不过进行无意义的写操作使得最后写的次数等于nmemb
- 对于读read,同样返回值大部分情况下跟随nmemb的值,除了:当给出的读取缓存区已经已经读满了或者已经没东西可读了,那么就不会再读了,并且返回已经读的基本单元个数
fseek
需要的头文件:
#include <stdio.h>
函数原型:
int fseek(FILE *stream, long offset, int whence);
参数:
- stream: 文件指针
- offset: 偏移量
- whence: SEEK_SET(头)或 SEEK_CUR(当前) 或 SEEK_END(尾)
- 返回值:如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码
实操演示
demo9.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE *fp;char *write_buf = "mjmmm";char *read_buf;fp = fopen("./mjm.txt","w+");int count = fwrite(write_buf, sizeof(char), strlen(write_buf),fp);// fwrite(write_buf, sizeof(char)*strlen(write_buf), 1,fp);printf("%d bytes has been written\n",count);fseek(fp,0,SEEK_SET);read_buf = (char *)malloc(sizeof(char)*count);fread(read_buf, sizeof(char),strlen(write_buf),fp); //注意此时第三个参数不能使用 strlen(read_buf), 因为read_buf中没有任何有效参数,所以会是0//fread(read_buf, sizeof(char)*strlen(write_buf),1,fp);printf("context:%s\n",read_buf);fclose(fp);return 0;
}
运行代码:
打开mjm.txt:
相关文章:

使用fopen等标准C库来操作文件
fopen 需要的头文件: #include <stdio.h> 函数原型: FILE *fopen(const char *pathname, const char *mode); 参数: pathname: 文件路径mode: “r” :以只读方式打开文件,该文件必须存在。“w” ÿ…...
Spring-Cloud-Loadblancer详细分析_1
背景 从SpringCloud 2020 版本之后,组件移除了除 Eureka 以外,所有 Netflix 的相关,包括最常用的 Ribbon Hystrix 等,所以 SpringCloud 在 spring-cloud-commons 提供了Loadbalancer 用来替代 Ribbon。本系列就来介绍Loadbalance…...
键盘键码keyCode对照表
字母和数字键的键码值(KeyCode)按键键码按键键码A65J74B66K75C67L76D68M77E69N78F70O79G71P80H72Q81I73R82 字母和数字键的键码值(KeyCode)按键键码按键键码S83149T84250U85351V86452W87553X88654Y89755Z90856048957 数字键盘上的键的键码值(KeyCode)按键键码按键键码0968104…...

jupyter切换conda虚拟环境
环境安装 conda install nb_conda 进入你想使用的虚拟环境: conda activate your_env_name 在你想使用的conda虚拟环境中: conda install -y jupyter 在虚拟环境中安装jupyter: conda install -y jupyter 重启jupyter 此时我们已经把该安装…...
【数据结构•堆】经典问题:k路归并
题目描述 k路归并问题: 把k个有序表合并成一个有序表。( k < 10^4 ) 输入输出格式 输入格式: 输入数据共有 2*k1 行。 第一行,一个整数k( k < 10^4 ),表示有k个有序…...
VUE3 动态路由
带参数的动态路由匹配 很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现…...

CentOS软件包管理rpm、yum
一、软件包概述 Linux常见软件包分为两种,分别是源代码包、二进制文件包。源代码包是没有经过编译的包,需要经过GCC、C编译器编译才能运行,文件内容包含源代码文件,通常以.tar.gz、.zip、.rar结尾;二进制包无需编译&am…...

【VSCode】报错:出现段错误解决办法 (Segmentation fault)
VScode报错:Segmentation fault (core dumped)的解决办法 解决Program received signal SIGSEGV, Segmentation fault.的辛酸 Linux环境下段错误的产生原因及调试方法小结 Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf 在程序中,TF…...
Linux Centos 8 用户管理之重置密码
如果在使用linux系统时遇到系统密码问题无法进入系统或者操作的时候可以按照下面的方法重置用户密码。 一、root用户密码重置: 方式一: 1.重启电脑或虚拟机,在刚进引导界面时候按“e"键,进入编辑模式。 2.在”quiet"…...

C语言快速回顾(三)
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。C/C是音视频必…...

【Apollo】Apollo-ros版本架构学习与源码分析
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Apollo-ros版本架构学习与源码分析。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&a…...
【Express.js】集成RabbitMQ
集成RabbitMQ 本节我们介绍在 express.js 中集成 rabbitmq. RabbitMQ 是一个消息队列中间件,常用于请求削峰,事务的队列处理,事件订阅机制的实现等。 准备工作 创建一个 express.js 项目(本文基于evp-express-cli)…...

UI美工设计岗位的基本职责概述(合集)
UI美工设计岗位的基本职责概述1 1、有良好的美术功底、设计新颖,整体配色及设计创意理念,能够独立完成整个网站页面设计及制作; 2、熟练运用DIV CSS,HTML 设计制作网页 ; 3、熟练运用Photoshop,Dreamweaver,Coreldraw(或Illustrator),Fla…...
最强自动化测试框架Playwright(23)-API测试
playwright支持进行API测试 示例: 如下代码创建API请求上下文,使用post方法请求API,并返回响应结果。 import playwright from playwright.sync_api import sync_playwrightwith sync_playwright() as p:api_request_contextp.request.new…...

k8s 自身原理 4
前面咱们分享了 mater 和 worker 节点里面都有哪些组件,他们又是各自主要负责的工作是什么,现在我们心里应该都有数了吧 master 节点: etcd 存储资源配置,ApiServer 提供 RESTful Api 用于交互,scheduler 用于调度 p…...
ZLMediaKit(webrtc)在linux上(CentOS7)部署与启动
一.ZLMediaKit(webrtc)在CentOS7部署与启动 # 1. 卸载旧版本 yum remove git # 2. 安装 yum 源的 Git 版本 yum install -y git # 3. 查看版本 git version # 输出 git version 1.8.3.1配置全局环境变量 # 1. 编辑配置文件 vim /etc/profile # 2. 在 /etc/profile 文件中末尾…...
汽车基础软件新「战争」:群雄混战,谁在抢跑?
中国车用基础软件迎来了发展的黄金窗口期。 当前,汽车电子电气架构正在加速向“跨域融合”的时代演进,汽车软件架构也在加速向SOA架构升级,软硬件分层解耦成为了实现“软件定义汽车”新开发模式的前提。 过去,汽车的所有功能开发…...

阿里云预装LAMP应用导致MySQL不显示访问密码如何解决
😀前言 本篇博文是关于阿里云云服务器ECS部署MySQL过程中出现的一下坑,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家…...
SQL 自动清除7天前数据前收缩数据库
作用: 删除七天前数据库中间表的资料,并收缩数据库 delete-Ecustom-xml-midtable.sql delete Mid_bom where datediff(day,dty,getdate())>7 delete Mid_cus where datediff(day,dty,getdate())>7 delete Mid_exp where datediff(day,dty,getdate(…...

LangChain-ChatGLM在WIndows10下的部署
LangChain-ChatGLM在WIndows10下的部署 参考资料 1、LangChain ChatGLM2-6B 搭建个人专属知识库中的LangChain ChatGLM2-6B 构建知识库这一节:基本的逻辑和步骤是对的,但要根据Windows和现状做很多调整。 2、没有动过model_config.py中的“LORA_MOD…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...