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

C语言:文件处理

文件处理

  • 一、文件的类型
    • (一)文本文件和二进制文件
    • (二)程序文件和数据文件
      • 数据文件按照二进制储存
  • 二、文件的打开和关闭
    • (一)文件指针
    • (二)文件的打开和关闭
      • 1、fopen
      • 2、fclose
    • (三)文件的打开方式
  • 三、文件读写函数
    • (一)fgetc
    • (二)fputc
    • (三)fgets
    • (四)fputs
    • (五)fscanf
    • (六)fprintf
    • (七)fwrite
    • (八)fread
    • (九)sscanf
    • (十)sprintf
    • (十一)fseek
    • (十二)ftell
    • (十三)rewind
  • 四、文件缓冲区
  • 结束语

一、文件的类型

(一)文本文件和二进制文件

按照文本的组织信息来分,文件可以分成二进制文件和文本文件

(二)程序文件和数据文件

按照文件功能来分,可以分成程序文件和数据文件

数据文件按照二进制储存

在这里插入图片描述
在这里插入图片描述

二、文件的打开和关闭

(一)文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息

(二)文件的打开和关闭

1、fopen

FILE * fopen ( const char * filename, const char * mode );

用来打开文件。打开成功的同时,函数会返回一个文件指针类型,相当于文件和指针之间建立联系。

int main() {FILE* pf = fopen("test.txt", "w");if (pf != NULL) {fputs("man, what can i see", pf);fclose(pf);}return 0;
}

可以观察到我们的字符串已经被写入到了文件之中。
在这里插入图片描述

2、fclose

int fclose ( FILE * stream );

用来关闭文件,如果文件成功关闭,那么就会返回0,如果失败,返回EOF;

(三)文件的打开方式

文件使用方式 					含义 			如果指定文件不存在
“r”(只读) 		为了输入数据,打开一个已经存在的文本文件  		出错
“w”(只写) 		为了输出数据,打开一个文本文件 		        新建文件
“a”(追加) 		向文本文件尾添加数据      					新建文件
“rb”(只读)	    为了输入数据,打开一个二进制文件 				出错
“wb”(只写)	    为了输出数据,打开一个二进制文件 		   	    新建文件
“ab”(追加) 	向一个二进制文件尾添加数据      				新建文件
“r+”(读写)		为了读和写,打开一个文本文件 					出错
“w+”(读写) 	为了读和写,建议一个新的文件      				新建文件
“a+”(读写) 	打开一个文件,在文件尾进行读写      			新建文件
“rb+”(读写) 	为了读和写打开一个二进制文件 					出错
“wb+”(读写)   为了读和写,新建一个新的二进制文件     	        新建文件
“ab+”(读写) 	打开一个二进制文件,在文件尾进行读和写      	新建文件

三、文件读写函数

在这里插入图片描述

(一)fgetc

int fgetc ( FILE * stream );

成功 : 将返回字符读取(提升为 int 值)。
如果位置指示器位于文件末尾,则该函数返回 EOF 并设置流的 EOF 指示符 (feof)。

失败 :
返回类型为 int 以适应特殊值 EOF,该值表示失败。
如果发生其他读取错误,该函数也会返回 EOF,但会设置其错误指示器 (ferror)。

(二)fputc

int fputc ( int character, FILE * stream );

成功 : 将返回写入的字符。
失败 : 返回 EOF 并设置错误指示器 (ferror).

(三)fgets

char * fgets ( char * str, int num, FILE * stream );

成功 : 如果读取到字符该函数返回 str,如果一个都没有读取到,返回空指针。读取字符时遇到文件末尾,设置 eof 指示(feof)
失败 : 则设置错误指示符 (ferror) 并返回空指针

(四)fputs

int fputs ( const char * str, FILE * stream );

成功 : 将返回一个非负值。
失败 : 该函数返回 EOF 并设置错误指示器 (ferror)。

(五)fscanf

int fscanf ( FILE * stream, const char * format, ... );

成功 : 该函数返回已成功填充的参数列表的项目数。读取字符时遇到文件末尾,设置 eof 指示(feof)
失败 : 该函数返回 EOF 并设置错误指示器 (ferror)。
如果在解释宽字符时发生编码错误,该函数会将 errno 设置为 EILSEQ。

(六)fprintf

int fprintf ( FILE * stream, const char * format, ... );

成功 : 将返回写入的字符总数。
失败 : 则设置错误指示符 (ferror) 并返回负数。
如果在写入宽字符时发生多字节字符编码错误,则将 errno 设置为 EILSEQ 并返回负数。

(七)fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

成功 : 返回成功写入的元素总数。
失败 : 如果此数字与 count 参数不同,则写入错误会阻止函数完成。在这种情况下,将为流设置错误指示器 (ferror)。

(八)fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

成功 : 返回成功读取的元素总数。
失败 : 如果此数字与 count 参数不同,则表示读取时发生读取错误或达到文件末尾。在这两种情况下,都设置了正确的指示器,可以分别使用 ferror 和 feof 进行检查。

(九)sscanf

int sscanf ( const char * s, const char * format, ...);

成功 : 该函数返回已成功填充的参数列表中的项目数。
失败 : 如果在成功解释任何数据之前输入失败,返回 EOF。

在这里插入图片描述
在这里插入图片描述

(十)sprintf

成功 : 将返回写入的字符总数。此计数不包括自动附加在字符串末尾的附加 null 字符。
失败 : 则返回一个负数。

在这里插入图片描述
在这里插入图片描述

(十一)fseek

定位文件指针

int fseek ( FILE * stream, long int offset, int origin );

成功 :该函数返回零。
失败 :返回非零值。
如果发生读写错误,则设置错误指示器 (ferror)。

在这里插入图片描述
orgin可以取值:
在这里插入图片描述

(十二)ftell

求文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

成功 : 将返回位置指示器的当前值。
失败 : 返回 -1,并将 errno 设置为系统特定的正值。

(十三)rewind

将文件指针指向文件的首地址,可以fseek来达到相同的作用

void rewind ( FILE * stream );

在这里插入图片描述

四、文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述

结束语

相信有了这篇文件操作,下次再也不用担心忘记重新学啦。亲爱的小伙伴,不要忘记支持博主哦!
在这里插入图片描述

相关文章:

C语言:文件处理

文件处理 一、文件的类型(一)文本文件和二进制文件 (二)程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭(一)文件指针(二)文件的打开和关闭1、fopen2、fclose &…...

SpringBoot MybatisPlus selectOne的坑

目录 一、问题 二、问题解决 三、其他方法 一、问题 selectOne在查询多条数据时会报错,查询语句并不会加 limit 1。 One record is expected, but the query result is multiple records。 二、问题解决 在QueryWrapper上添加如下: QueryWrapper&…...

Spring源码-ClassPathXmlApplicationContext的refresh()都做了什么?

AbstractApplicationContext的refresh方法 /*** 用给定的父类创建一个新的ClassPathXmlApplicationContext* Create a new ClassPathXmlApplicationContext with the given parent,* 从给定的XML文件加载定义* loading the definitions from the given XML files.* param confi…...

网站加密和混淆技术简介

我们在爬取网站的时候,会遇到一些需要分析接口或 URL 信息的情况,这时会有各种各样类似加密的情况 1. 某个网站的URL 带有一些看不懂的长串加密字符,要抓取就必须懂的这些参数是怎么构造的,否则我们连完整的 URL 都构造不出来&am…...

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程,主要用途是为了日志采集,所以搭建相对比较简单暴力,不过也可以作为一个参考供大家学习,主打一个能用管跑(调优啊,参数解释啊,原理啊,太枯燥了&a…...

“Apple Intelligence”的“系统提示词”被曝光了

当 苹果的 Apple Intelligence 还未完全开放体验时,其提示词就已经曝光了。 苹果如何指挥 AI 干活,这次被泄露的非常彻底。我们就拿邮件来说,借助 AI,收发及回复邮件变得非常简单,但背后的逻辑是内置提示词在拿捏。 比…...

django学习-数据表操作

一、数据表操作 1. 数据新增 由模型实例化对象调用内置方法实现数据新增,比如单数据新增调用create,查询与新增调用get_or_create,修改与新增调用update_or_create,批量新增调用bulk_create。 1.1 create() # 方法一 # 使用cr…...

机器学习-决策树

决策树 决策树1. 简介2. ID3 决策树3. C4.5决策树4. CART决策树5. 决策树对比6. 正则化 剪枝 决策树 1. 简介 """ 简介一种树形结构树中每个内部节点表示一个特征的判断每个分支代表一个判断结果的输出每个叶节点代表一种分类结果建立过程1. 特征选择选取有较…...

opencascade TopoDS_Shape源码学习【重中之重】

opencascade TopoDS_Shape 前言 描述了一个形状,它 引用了一个基础形状,该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度&#xff…...

Self-study Python Fish-C Note15 P52to53

函数 (part 5) 本节主要讲函数文档、类型注释、内省、高阶函数 函数文档、类型注释、内省 (P52) 函数文档 函数是一种代码封装的方法,对于一个程序来说,函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的,更需要关注的…...

Java小白入门到实战应用教程-异常处理

Java小白入门到实战应用教程-异常处理 前言 我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况,它能打断了正常的程序执行流程。 而异常处理是一项至关重要的技术,它使得程序能够优雅地处理运行时错误,避免…...

使用Anaconda安装多个版本的Python并与Pycharm进行对接

1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示,我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单,直接安装即可: 3、设置conda.exe的…...

android系统中data下的xml乱码无法查看问题剖析及解决方法

背景: Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下: 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的,这些syste…...

​MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引

若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX.语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...

Python数据可视化利器:Matplotlib详解

目录 Matplotlib简介安装MatplotlibMatplotlib基本用法 简单绘图子图和布局图形定制 常见图表类型 折线图柱状图散点图直方图饼图 高级图表和功能 3D绘图热图极坐标图 交互和动画与其他库的集成 与Pandas集成与Seaborn集成 常见问题与解决方案总结 Matplotlib简介 Matplotli…...

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)

2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda: 大家可以根据自己的网络情况从下面的地址下载: miniconda官网地址:https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…...

介绍rabbitMQ

RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),主要用于在不同的应用程序之间进行异步通信。以下是关于RabbitMQ的详细介绍: 一、基本概念 消息中间件:RabbitMQ是一个消息中间件&#x…...

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视

关键词:深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升,且有可能演变成严重且不可逆转的状况,这不仅对家庭幸福构成威胁,还带来巨大的经济负担。当前的研究着重指出&#x…...

VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发

在VB.NET中,利用Windows Presentation Foundation (WPF) 进行图形界面开发是一个强大的选择,因为它提供了丰富的UI元素、动画、数据绑定以及样式和模板等高级功能。以下是在VB.NET项目中使用WPF进行图形界面开发的基本步骤: 1. 创建一个新的…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

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

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

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...