【C语言进阶】文件操作详解

news2024/11/27 18:31:49

文章目录

  • 一.文件指针
    • 1.什么是文件指针
    • 2.如何使用文件指针
    • 二.文件操作函数
      • 1.流与文件
      • 2.顺序读写函数
      • 三.文本文件和二进制文件
        • 四.文件缓冲区

一.文件指针

1.什么是文件指针

文件指针其实是文件类型指针的简称,我们常常会使用文件保存数据,而每个被使用的文件都会在内存中开辟相应的文件信息区。用来存放文件的各种信息,这些信息创建在一个结构体下,这个结构体的类型就被系统重命名为FILE,我们一般通过一个FILE类型的指针来维护文件信息区,所以我们将FILE类型的指针叫做文件指针。

2.如何使用文件指针

使用文件指针的目的就是为了操作文件,而最基本的就是打开文件和关闭文件,现在我们就先了解一下这两个操作如何实现吧。
为了打开文件和关闭文件就必须要知道fopen函数fclose函数

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

filename是指向文件名的指针,而mode指向的是指定文件使用方式字符串如“r”读“w”写等方式。

int fclose ( FILE * stream );

fclose函数则比较简单,只要向其传入文件指针,fclose即可关闭文件。关闭成功时返回0值失败返回EOF

二.文件操作函数

1.流与文件

介绍文件操作函数之前,我们先来了解‘流’的概念,我们在使用C语言编写程序后,我们并不知道这个程序将会输入到哪里:
在这里插入图片描述
而程序输入到不同的地方需要不同的数据处理方式,这就是流要干的事,程序在流的帮助下可以在多个地方下应用。
而任何一个C语言程序运行时,都默认打开三个流:
在这里插入图片描述
另外在操作文件时,是内存和文件的交互和我们之前写的程序内存和屏幕键盘的交互:
在这里插入图片描述

2.顺序读写函数

下面介绍关于文件操作的读写函数:
1.字符函数

int fputc ( int character, FILE * stream );
int fgetc ( FILE * stream );

fputc将字符character输出到文件指针stream中,如果成功输出则返回输入字符的ASCII码值,失败返回EOF
fgetc从文件指针stream指向的文件中读取第一个字符下一次读取下一个字符)并且返回字符的ASCII码值,失败也返回EOF。
2.文本函数

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

fputs将指针str指向的字符串输出到stream指向的文件中,输出成功返回非负数,否则返回EOF。
fgets将从文件中读取num个字符并复制到str指向的空间中,输入成功返回str,失败返回NULL,另外需要注意的fgets一次调用只能复制文件中一行的内容,即使指定的字符个数超过了文件内容第一行的字符个数,gets也不会读取文件中第二行的内容。
3.二进制函数

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

这两个函数稍有特殊,他们是以二进制的形式进行输入和输出。并且只能用于文件而以上的函数可以用于所有输入输出流,fwrite找到ptr指向的内容将大小为sizecount字节的内容写入文件中。而fread则相反,他将stream指向的文件内容中sizecount字节的内容读取到ptr的空间中。这两个函数都返回成功写入元素的个数,成功的话应该与count相同
4.随机读写函数

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

fseek可以将文件指针从origin位置偏移offset位。而ftell则可以将文件指针相对于起始位置的偏移量返回。rewind是将文件指针重新置为起始位置

三.文本文件和二进制文件

根据数据的存储形式,数据文件被称为二进制文件或者文本文件。那我们如何区分文件时二进制文件还是文本文件呢,我们以存放数字为例子一个数组存放到文件中如果是以二进制区分大小端存储的,如果存放到文本文件中会将数字的每一位都看成一个字符储存ASCII码值

四.文件缓冲区

最后我们介绍文件缓冲区的概念:程序从内存向硬盘等存储空间写入数据和程序读取硬盘的数据时,都不是直接读取和写入的在内存和硬盘之间存在文件缓冲区,比如我们使用程序想文件中读取数据时,硬盘会先把数据春放在缓冲区中,等达到一定条件时,在让程序读取。

从内存向磁盘输出数据会先送到内存中的缓冲区,
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区
逐个
地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

int fflush ( FILE * stream );

fflush就是专门用来刷新缓冲区的,关闭文件时也会刷新缓冲区,将缓冲区的数据直接输送到目标为止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SMILEtrack:基于相似度学习的多目标跟踪

文章目录摘要1、简介2、相关工作2.1、Tracking-by-Detection2.1.1、检测方法2.1.2、数据关联方法2.2、Tracking-by-Attention3、方法3.1、体系结构概述3.2.1、图像切片注意(ISA)块3.2.3、Q-K-V注意力块3.3、基于相似匹配级联(SMC)的目标跟踪算法4、实验结果4.1、数据集4.2、MOT…

XMind导入Markdown(利用Typora导出opml)

安装Xmind XMind 是一款非常实用的商业思维导图软件 首先,安装Xmind并打开。通过"帮助"——>“关于Xmind”,可以获取到当前的版本号为 XMind 8 Update 9 在"文件"——>“导入”,可以看到Xmind支持的导入格式仅有…

get请求和post请求

get请求 1.get请求的特点 通过一个URL来访问一个地址,就比如说127.0.0.1:7001,这种请求方式就是get请求,get请求可以直接在URL中添加参数,通过URL来传递参数。 优点:使用简单,清晰有条理,比较适合网站和…

十五天学会Autodesk Inventor,看完这一系列就够了(三),拉伸命令

众所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&…

盘点2022年度A站UE神作top

A站大家都应该很熟悉了,在全球的CG行业都是属于专业化十分高的网站,平台内展示的内容包括影视、动画、娱乐等等板块,更是收录了众多大神艺术家的作品,多看看可以最直接的了解整个行业的审美趋势与技术动向。正好最近2022年A站人气…

数据结构:线性表的链式表示和实现

顺序表仅适用于不常进行插人和删除的线性表。因为在顺序存储表示的线性表中插入或删除一个数据元素,平均约需移动表中一半元素,这个缺陷是由于顺序存储要求线性表的元素依次“紧挨”存放造成的。因此对于经常需要进行插人和删除操作的线性表,就需要选择其他的存储表示方法。现在…

C进阶:文件的基础操作

本文主要讲解文件基础操作的知识。 目录 一.文件指针 二.文件的打开和关闭 1.文件的打开 打开文件我们需要使用到 fopen 函数; 注意(文件扩展名): 2.文件的关闭 三.文件的读写 1.读与写,输出与输入的概念 ​编…

VueUse(中文)——简介

一、VueUse——简介 VueUse是由Anthony Fu等大佬写的基于Vue的自定义钩子集合。类似于基于React的 ahooks功能丰富:200功能无缝迁移:适用于Vue 3和Vue2.7版本之后支持tree shaking:只引入自己需要的那部分,打包会更小还有其他的亮…

Chrome V3版开发教程使用Vue 3.x+Ant构建项目

简介 ​ Google在2023年将会遗弃V2版本,而目前在CSDN平台上的大部分Chrome插件的开发教程都是基于V2版本的,V3版本和V2的版本上还是有很大的区别,就比如manifest.json中的写法差距就很大,所以对于即将要开发Chrome插件的小伙伴来…

机器学习的相关概念与建模流程

文章目录一、机器学习简介1. 机器学习的相关定义2. 一次简单的机器学习任务:鸢尾花分类二、数据与数据集相关概念1. 数据与数据集2. 特征与标签3. 连续变量和离散变量4. 模型类型三、机器学习建模一般流程1. 提出基本模型2. 确定损失函数3. 根据损失函数性质&#x…

Servlet —— Smart Tomcat,以及一些访问出错可能的原因

JavaEE传送门JavaEE HTTPS —— HTTPS的加密方式 Servlet —— Tomcat, 初学 Servlet 程序 目录Smart TomcatSmart Tomcat 的下载配置 Smart Tomcat 插件访问出错404405500无法访问此网站Smart Tomcat 在上一篇文章中, 我们手动拷贝 war 包到 Tomcat 中的过程比较麻烦, 我们…

解析 json,整理分散数据入库

【问题】在 json 文件中有以下内容:现在需要将 json 中分散的数据整理入库。“LIST”中包含多个子孙记录,主要目标是”GROUPNAME”、”SERVICES”。“GROUPNAME”值、”SERVICES”中的键编号对应了数据库表 _groups 的 Groupname 和 ID。“SERVICES”每个…

PicGo+Gitee+Typora实现markdown图床

PicGoGitee实现markdown图床 情景概要 写博客的时候,总是需要插入图片的,图片存在本地的话上传到博客网站去就没法显示了 就算一个图一个图的复制粘贴上去,想移植到其他的博客网站,图就会失效,我们就需要图床 图床 …

系分 - 案例分析 - 项目管理

个人总结,仅供参考,欢迎加好友一起讨论 文章目录系分 - 案例分析 - 项目管理时间管理进度管理典型例题题目描述参考答案系分 - 案例分析 - 项目管理 时间管理 进度管理 ① 项目进度管理包括为管理项目按时完成所需的7个过程,具体为&#xf…

MyBatis-Plus数据安全保护(字段脱敏)

项目创建POM依赖 <dependency><!--MyBatis-Plus 企业级模块--><groupId>com.baomidou</groupId><artifactId>mybatis-mate-starter</artifactId><version>1.2.8</version> </dependency> YML配置 spring:datasource:# 配…

熟悉Spring框架?Spring容器使用流程,注解 你真的会吗?(让你一下通透~)

目录 前言 一、ApplicationContext 和 BeanFactory 的区别 二、主要工作流程 三、开发步骤 3.1、创建Maven项目 3.2、创建Spring的核心配置文件 3.3、Spring注解 3.3.1、类注解 3.3.2、五大类注解的关系 3.3.3、方法注解 3.3.4、属性注入 3.3.5、五大注解关系图&am…

【03】FreeRTOS的任务创建(静态和动态)和删除

目录 1.任务创建和删除的API函数 1.1动态创建任务函数 1.1.1实现动态创建任务流程 1.1.2任务控制块结构成员介绍 1.2静态创建任务函数 1.2.1实现静态创建任务流程 1.3任务删除函数 1.3.1删除任务流程 2.任务创建和删除&#xff08;动态方法&#xff09; 2.1宏confi…

一文掌握项目估算工具及方法【管理有度13】

01为什么要做估算我们的业务方经常抱怨资源不足&#xff0c;团队需求的吞吐率太低&#xff0c;资源和需求量的不匹配是一个永恒的话题&#xff0c;解决方案应该不只是增加资源&#xff0c;增加了资源如果需求的输入量不能稳定保证&#xff0c;那资源就会处于持续浪费的状态当中…

项目管理:项目控制的三个基本原则

要记住项目控制是怎么回事&#xff0c;一个简单方法是思考PDA。PDA是指预防、检测和行动。让我们仔细看看项目控制的这些基本原则。 1、预防 就像你自己的健康一样&#xff0c;健康的秘诀是加强你的免疫系统&#xff0c;尽量减少与有害物的接触。换句话说&#xff0c;就是不…

谷歌账号被封怎么办?谷歌账号解封申诉步骤请收好!

谷歌账号有多重要&#xff1f;相信很多跨境人和社媒营销人都会深有感悟的&#xff0c;谷歌账号可以说是国外互联网的一个通行证&#xff0c;国外非常多的网站都是支持使用谷歌账号登录的。 谷歌账号对企业进军海外市场是非常重要的存在&#xff0c;然而谷歌账号一旦操作不当是很…