【文件操作API的使用】
1.概念
这对聪明的你们来说简直就是,对吗。
那什么是文件操作符,文件操作又有哪些步骤呢?
文件操作符通常用于指代在计算机编程中用于处理文件的特殊符号或标识符。在很多编程语言中,文件操作符被用于打开、关闭、读取和写入文件,以及对文件进行其他操作。
一般来说,文件操作有以下步骤:
-
打开文件:使用文件操作符可以打开一个文件,使得程序能够访问文件的内容。通常情况下,打开文件需要提供文件名、路径以及访问模式等信息。
-
关闭文件:在文件使用完毕后,应该及时关闭文件,释放文件相关的资源。关闭文件可以通过文件操作符完成。
-
读取文件:文件操作符可以用于从文件中读取数据。读取文件时,文件操作符会根据指定的位置读取特定数量的数据,并将数据传递给程序进行处理。
-
写入文件:除了读取文件外,文件操作符也可以用于向文件中写入数据。程序可以使用文件操作符将数据写入文件的指定位置。
-
移动文件指针:文件操作符还可以用于移动文件指针的位置。文件指针表示了当前读取或写入位置在文件中的偏移量。通过移动文件指针,程序可以在文件中进行定位读取或写入操作。
在不同的编程语言和操作系统中,文件操作符的具体实现方式可能会有所不同。
例如,在C语言中,文件操作符通常是通过使用 FILE
结构体和相关的函数来实现的。
而在Python等高级语言中,文件操作符则可能是通过内置的文件对象来实现的。
今天我们就以C语言为例,
2.C语言文件操作的api介绍
fopen和fclose
fopen() 是一个用于在C语言中打开文件的标准库函数。
它通常用于打开一个文件,并返回一个指向该文件的文件指针。fopen() 函数具有以下一般形式:FILE *fopen(const char *filename, const char *mode);其中:参数1:filename:要打开的文件的路径。参数2:mode:打开文件的模式,可以是以下之一:
"r":只读模式。文件必须存在,否则函数失败。
"w":写入模式。如果文件存在,则文件内容被清空,如果文件不存在,则创建新文件。
"a":追加模式。如果文件存在,写入的数据将被追加到文件末尾,如果文件不存在,则创建新文件。
"r+":读写模式。文件必须存在,文件的内容可以被读取和写入。
"w+":读写模式。如果文件存在,则文件内容被清空,如果文件不存在,则创建新文件。
"a+":读写模式。如果文件存在,写入的数据将被追加到文件末尾,如果文件不存在,则创建新文件。
函数返回一个指向文件的指针,如果打开文件失败,则返回 NULL。close() 函数用于关闭一个已打开的文件。关闭文件后,释放与该文件相关的所有资源,
并将文件指针指向 NULL。它的一般形式如下:int fclose(FILE *stream);
其中:stream:指向已经被 fopen() 打开的文件的指针。
函数返回值为 0 表示成功关闭文件,返回 EOF 表示关闭文件失败
当然,我们还有其他的打开方式
fgetc和fputc
fgetc() 和 fputc() 是用于在 C 语言中进行文件读写操作的标准库函数。fgetc()
fgetc() 函数用于从指定的文件中读取一个字符,并将文件指针向前移动到下一个字符位置。
它的一般形式如下:
int fgetc(FILE *stream);其中:
stream:指向已经被 fopen() 打开的文件的指针。
函数返回值是读取的字符,如果到达文件结尾或者出现错误,
则返回 EOF(表示 End Of File)。fputc()
fputc() 函数用于向指定的文件中写入一个字符,并将文件指针向前移动到下一个字符位置。
它的一般形式如下:int fputc(int character, FILE *stream);
其中:character:要写入的字符。
stream:指向已经被 fopen() 打开的文件的指针。
函数返回成功写入的字符,如果出现错误,则返回 EOF。
介绍了这两个,那我们就可以写一个函数测试一下喽
fputs和fgets
显而易见了吧,我们只有一个字母的区别,而且‘s’很明显,就是字符串喽
fgets() 函数用于从指定的文件流中读取一行,并将其存储在字符串中。它的一般形式如下:char *fgets(char *str, int num, FILE *stream);
其中:str:是一个指向字符数组的指针,用于存储读取的字符串。
num:是要读取的最大字符数(包括空字符 \0)。
stream:是一个指向 FILE 对象的指针,它指定了要读取的文件流。
函数返回指向存储字符串的指针,如果到达文件末尾或者出现错误,则返回 NULL。fputs() 函数用于将一个字符串写入到指定的文件流中。它的一般形式如下:int fputs(const char *str, FILE *stream);
其中:str:是一个指向要写入的字符串的指针。
stream:是一个指向 FILE 对象的指针,它指定了要写入的文件流。
函数返回非负值表示成功,返回 EOF 表示写入失败。
fprintf和fscanf
前面我们说到的均为输入输出流( fgetc和fputc, fputs和fgets)而这个尾格式化输入输出流(fprintf和fscanf)
fprintf() 和 fscanf() 是 C 语言中用于文件操作的函数,
它们与 printf() 和 scanf() 函数非常类似,但是它们从文件流中读取或写入数据。fprintf() 函数用于将格式化数据写入到文件中。它的一般形式如下:int fprintf(FILE *stream, const char *format, ...);
其中:stream 是一个指向 FILE 对象的指针,它指定了要写入的文件流。
format 是一个字符串,包含了要写入到文件中的文本以及格式化指示符。
... 是要写入到文件的数据,可以是变量列表。
fprintf() 函数的返回值是成功写入到文件中的字符数,如果发生错误,则返回一个负值。fscanf() 函数用于从文件中读取格式化数据。它的一般形式如下:int fscanf(FILE *stream, const char *format, ...);
其中:stream 是一个指向 FILE 对象的指针,它指定了要读取的文件流。
format 是一个字符串,包含了要读取的数据的格式化指示符。
... 是用于接收读取的数据的变量列表。
fscanf() 函数的返回值是成功读取到的变量数,如果到达文件末尾或者发生错误,则返回 EOF。
fread和fwrite(用于二进制文件的读写操作)
fread() 和 fwrite() 是 C 语言中用于文件操作的函数,它们与 fprintf() 和 fscanf() 类似,
但是它们用于二进制文件的读写操作。fwrite() 函数用于将数据块以二进制形式写入到文件中。它的一般形式如下:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
其中:ptr 是一个指向要写入的数据块的指针。
size 是每个数据块的大小(以字节为单位)。
nmemb 是要写入的数据块的数量。
stream 是一个指向 FILE 对象的指针,它指定了要写入的文件流。
fwrite() 函数的返回值是成功写入的数据块数量,如果发生错误,则返回一个小于 nmemb 的值。fread() 函数用于从二进制文件中读取数据块。它的一般形式如下:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
其中:ptr 是一个指向用于存储读取数据的缓冲区的指针。
size 是每个数据块的大小(以字节为单位)。
nmemb 是要读取的数据块的数量。
stream 是一个指向 FILE 对象的指针,它指定了要读取的文件流。
fread() 函数的返回值是成功读取的数据块数量,如果到达文件末尾或者发生错误,
则返回一个小于 nmemb 的值。
feof和ferror
`feof` 和 `ferror` 都是用于检查文件流状态的函数,但有一些区别:1. `feof(FILE *stream)` 函数用于检查给定文件流 `stream` 是否已经到达文件末尾。
当文件流到达文件末尾时,`feof` 返回非零值;否则,返回 0。2. `ferror(FILE *stream)` 函数用于检查给定文件流 `stream` 的错误标志是否被设置。
如果文件流 `stream` 的错误标志被设置,`ferror` 返回非零值;否则,返回 0。在使用这两个函数时,应当注意它们的返回值不是绝对的,需要结合其他函数一起使用,
比如 `fgets`、`fscanf`、`fread`、`fwrite` 等读写函数,
检查它们的返回值以及 `feof` 和 `ferror` 的返回值,以正确处理文件流状态和错误。
3,每期一问
正确的使用feof和ferror
相关文章:

【文件操作API的使用】
1.概念 这对聪明的你们来说简直就是,对吗。 那什么是文件操作符,文件操作又有哪些步骤呢? 文件操作符通常用于指代在计算机编程中用于处理文件的特殊符号或标识符。在很多编程语言中,文件操作符被用于打开、关闭、读取和写入文件…...
C++ 让类只在堆或栈上分配
1. 让类只在栈上或堆上分配内存 在C中,类的对象建立分为两种: 一种是静态建立,如A a; 另一种是动态建立,如A* ptrnew A;这两种方式是有区别的。 1、静态建立类对象:是由编译器为对象在栈空间…...
SpringMVC源码分析(九)--返回值解析器
1.返回值解析器介绍 返回值解析器用于解析Hanlder执行方法后的返回结果,例如将方法上标注有@ResponseBody注解的返回值解析成JSON、将方法返回的字符串作为视图名等 SpringMVC中默认的返回值解析器见RequestMappingHandlerAdapter#getDefaultReturnValueHandlers private L…...
京西商城——创建订单和获取订单接口
在之前的写过的接口中,我先后用了基于View和APIView来编写视图类 基于APIView类的时候相对于View会有很多便捷,但其实drf还在APIView的基础上又封装了一个 GenericAPIView 类,会大大减少了在编写视图时的重复代码和在修改代码时的工作量。 G…...

大话设计模式之模板方法模式
模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,将特定步骤的实现延迟到子类中。模板方法模式通过在父类中定义算法的骨架,而将具体步骤的实现留给子类来完成,从而使子类…...

新model开发记录
模型使用 -- 用blender导出为 fbx ,修改渲染方式(点击模型->Materials->Extract Materials(将材质从fbx中 单独提取出来了)->Materials 选择 Shader -> SimpleURPToonLitExample 点开脸的材质,勾选第一条) 解决角色…...
ARMday1
1.总结keil5下载代码和编译代码需要注意的事项 答:下载代码时,确保stlink的驱动有效、魔术棒中硬件型号的连接 编译代码时,先将配置魔术棒里Debug中的Setting,将Flash中Reset and Run勾选上,并去除pack中的Enab…...
【C++风云录】创造视觉奇迹:探索C++图形编程的魅力与可能性
图形与界面:从SFML到Allegro,探索C图形编程的世界 前言 随着计算机图形技术和界面设计的快速发展,图形编程在软件开发中变得越来越重要。C作为一种功能强大的编程语言,为开发人员提供了丰富的图形编程工具和库。本文将介绍几个流…...

常见的Nginx+Redis+MQ+DB架构设计
三高,复杂的架构 SQRS CAP 缓存,限流 【Redis,缓存】 cache-aside 缓存cache:数据源的副本 store 1. Read/Write Through Pattern 读写穿透模式 redis:放当前在线用户,热点数据...

vue+elementUI搭建动态表头的表格
前提:以下代码是vue2项目结合elementUi完成的 数据结构 后端传来的数据是两个list,一个表头的list,一个表格内容的list // 表头 headTableAtts: [{ columnLabel: 姓名, columnName: name },{ columnLabel: 年龄, columnName: age },{ colu…...

【ENSP】交换机和交换机之间实现静态路由
1.概念 三层交换机只能在Vlanif逻辑口配置iP地址 2.实现方法 交换机允许对应vlan通行,配置vlanif的ip地址,做静态路由 3.静态路由配置方法 ip route-static 目的网段 子网掩码 下一跳设备 LSW1三层交换机配置 u t m sys vlan batch 10 20 …...
2024.2.18力扣每日一题——N叉树的前序遍历
2024.2.18 题目来源我的题解方法一 深度优先遍历(递归方式)方法二 迭代方式(栈实现) 题目来源 力扣每日一题;题序:589 我的题解 方法一 深度优先遍历(递归方式) 与二叉树的前序遍…...
Taro活动列表中,对某一个活动添加分享按钮
采用data-留下分享链接的拼接参数 1.在item文件中写按钮 openType“share” <ButtonclassName{classes.rowRightShareButton}openType"share"data-share-transfer-id{lastGiftingTransferId}data-share-picture-url{shareUrl}data-share-title{shareTitle}onClic…...

深入理解计算机系统 家庭作业 2.65
/* 异或运算可以把同为1时变成0。 */ #include <stdio.h> #include <stdlib.h> int odd_ones(unsigned x); int main(void) { int x0xF00000016; printf("x的奇数位:%d",odd_ones(x)); return 0; } int odd_ones(unsigned x) { char…...
Java字节码
Java Agent概述 Java Agent是一种特殊类型的软件组件,它允许在Java虚拟机(JVM)运行时修改应用程序的字节码。这种技术通常用于性能监控、日志记录、系统调试等。Java Agent主要分为两类: 1. 启动时加载的Agent(Pre-Ma…...

深入解析大数据体系中的ETL工作原理及常见组件
** 引言 关联阅读博客文章:探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章:深入理解HDFS工作原理:大数据存储和容错性机制解析 ** 在当今数字化时代,大数据处理已经成为了企业成功的重要组成部分。而在大数据处…...
条件变量的简易C++实现版
条件变量通常与互斥锁一起使用,用于线程间的同步。以下是条件变量常用的一些函数: ①std::condition_variable::wait(lock, pred):线程调用此函数时,会原子性地释放锁并阻塞当前线程,等待另一个线程调用 notify_one 或…...

目标检测评价标准
主要借鉴:https://github.com/rafaelpadilla/Object-Detection-Metrics?tabreadme-ov-file 主要评价指标、术语: Intersection Over Union (IOU):两个检测框交集面积与并集面积的比值 True Positive (TP):IOU大于阈值的检测框…...
C51-- 蓝牙,WIFI模块
HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变, 仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手…...

HN热帖|替换Redis的一场赛跑
3 月 21 日, Redis Ltd. 宣布了一项重大决定:Redis “内存数据存储”项目从 Redis 7.4 版本开始将以非自由的、源代码可用的许可证发布。这一消息并不受欢迎,但也并非完全意外。这次的变化的不同寻常之处是市面上已经有了多个 Redis 替代品可…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...

使用VMware克隆功能快速搭建集群
自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...
ABB馈线保护 REJ601 BD446NN1XG
配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器,用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合,具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器…...

Xcode 16.2 版本 pod init 报错
Xcode 版本升级到 16.2 后,项目执行 pod init 报错; ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchron…...