当前位置: 首页 > news >正文

【文件操作API的使用】

1.概念

这对聪明的你们来说简直就是,对吗。

那什么是文件操作符,文件操作又有哪些步骤呢?

文件操作符通常用于指代在计算机编程中用于处理文件的特殊符号或标识符。在很多编程语言中,文件操作符被用于打开、关闭、读取和写入文件,以及对文件进行其他操作。

一般来说,文件操作有以下步骤:

  1. 打开文件:使用文件操作符可以打开一个文件,使得程序能够访问文件的内容。通常情况下,打开文件需要提供文件名、路径以及访问模式等信息。

  2. 关闭文件:在文件使用完毕后,应该及时关闭文件,释放文件相关的资源。关闭文件可以通过文件操作符完成。

  3. 读取文件:文件操作符可以用于从文件中读取数据。读取文件时,文件操作符会根据指定的位置读取特定数量的数据,并将数据传递给程序进行处理。

  4. 写入文件:除了读取文件外,文件操作符也可以用于向文件中写入数据。程序可以使用文件操作符将数据写入文件的指定位置。

  5. 移动文件指针:文件操作符还可以用于移动文件指针的位置。文件指针表示了当前读取或写入位置在文件中的偏移量。通过移动文件指针,程序可以在文件中进行定位读取或写入操作。

在不同的编程语言和操作系统中,文件操作符的具体实现方式可能会有所不同。
例如,在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是一种特殊类型的软件组件&#xff0c;它允许在Java虚拟机&#xff08;JVM&#xff09;运行时修改应用程序的字节码。这种技术通常用于性能监控、日志记录、系统调试等。Java Agent主要分为两类&#xff1a; 1. 启动时加载的Agent&#xff08;Pre-Ma…...

深入解析大数据体系中的ETL工作原理及常见组件

** 引言 关联阅读博客文章&#xff1a;探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章&#xff1a;深入理解HDFS工作原理&#xff1a;大数据存储和容错性机制解析 ** 在当今数字化时代&#xff0c;大数据处理已经成为了企业成功的重要组成部分。而在大数据处…...

条件变量的简易C++实现版

条件变量通常与互斥锁一起使用&#xff0c;用于线程间的同步。以下是条件变量常用的一些函数&#xff1a; ①std::condition_variable::wait(lock, pred)&#xff1a;线程调用此函数时&#xff0c;会原子性地释放锁并阻塞当前线程&#xff0c;等待另一个线程调用 notify_one 或…...

目标检测评价标准

主要借鉴&#xff1a;https://github.com/rafaelpadilla/Object-Detection-Metrics?tabreadme-ov-file 主要评价指标、术语&#xff1a; Intersection Over Union (IOU)&#xff1a;两个检测框交集面积与并集面积的比值 True Positive (TP)&#xff1a;IOU大于阈值的检测框…...

C51-- 蓝牙,WIFI模块

HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送&#xff0c;指的是在数据传输的过程中&#xff0c;通过无线的方式这组数据不发生任何形式的改变&#xff0c; 仿佛传输过程是透明的&#xff0c;同时保证传输质量&#xff0c;最终原封不动的传送到接收者手…...

HN热帖|替换Redis的一场赛跑

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

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...