当前位置: 首页 > 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 替代品可…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...