文件操作【C语言】

news2024/11/15 8:09:08

目录

一、为什么使用文件

二、什么是文件

1、程序文件

2、数据文件

3、文件名

三、文件的打开和关闭

1、文件指针

2、文件的打开和关闭

四、文件的顺序读写

五、文件的随机读写

1、fseek

2、ftell

3、rewind

七、文件读取结束的判定

1、被错误使用的feof

1、文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

2、二进制文件读取结束判断,判断返回值是否小于实际要读的个数。

八、文件缓冲区


一、为什么使用文件

        我们之前在写的程序在运行时,数据是存放在内存中的,当程序退出时,数据就不存在了,等下次运行时,数据又得重新录入。如果我们希望做到把数据记录下来,我们想删的时候,数据才不存在,这就涉及到数据的持久化问题。一般持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。

        使用文件我们可以直接将数据存放在电脑的硬盘上,做到了数据的持久化。

二、什么是文件

磁盘上的文件就是文件。

在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件的功能角度分类的)

1、程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)

2、数据文件

文件内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

本篇博文讨论的是数据文件。

3、文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。为了方便起见,文件标志常被称为文件名。

文件名包含3部分:文件路径+文件主干+文件后缀

eg:C:\code\test.txt

三、文件的打开和关闭

1、文件指针

缓冲文件系统中,关键的概念是“文件系统指针”,简称“文件指针”。

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

        不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

        每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。

下面我们可以创建一个FILE*的指针变量。

FILE*pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

2、文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束后应该关闭文件。

在编写程序时,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

//打开文件
FILE * fopen(const char * filename,const char * mode);
//关闭文件
int fclose(FILE*stream);

打开方式如下:

四、文件的顺序读写

        

功能函数名适用于
字符输入函数fgetc所以输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

补充:任何一个c语言程序运行时,都默认打开3个流

stdin:标准输入(键盘)类型

stdout:标准输出(屏幕)

stderr:标准错误(屏幕)

对比一组函数:

scanf/fscanf/sscanf

printf/fprintf/sprintf

scanf:从键盘上读取格式化数据(stdin)

printf:把数据写到(输出)屏幕上(stdout)

fscanf:针对所有输入流的格式化输入函数

fprintf:针对所有输出流的格式化输出函数

sscanf:从一个字符串中,还原出一个格式化的数据

sprintf:把格式化的数据,存放在(转换成)一个字符串。

五、文件的随机读写

1、fseek

根据文件指针的位置和偏移量来定位文件指针。

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

stream:文件指针位置

offset:偏移量

origin(三个):SEEK_SET:文件起始位置开始

             SEEK_CUR:当前

             SEEK_END:文件末尾

2、ftell

返回文件指针相当于起始位置开始的偏移量。

long int ftell (FELE*stream)

3、rewind

让文件指针回到文件起始位置。

void rewind(FILE*stream)

六、文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件二进制文件

数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符形式存储文件就是文本文件

七、文件读取结束的判定

1、被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件是否结束。

而是应用于当文件读取结束时,判断是读取失败,还是遇到文件尾结束。

1、文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

例如:

        fgetc判断是否为EOF.

        fgets判断是否为NULL

2、二进制文件读取结束判断,判断返回值是否小于实际要读的个数。

        fread判断返回值是否小于实际要读的个数。

八、文件缓冲区

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

因为有缓冲区的存在,c语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件,否则可能导致读写文件出问题。

 

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

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

相关文章

unocss原子化

文章目录1. 安装2. 配置3. Unocss预设3.1 presetUno3.2 presetAttributify3.3 presetIcons了解什么是UnoCSS请看:重新构想原子化CSS - 知乎 github地址:UnoCSS UnoCSS搜索引擎 1. 安装 npm i -D unocss2. 配置 vite.config.ts import { defineConf…

分享微信抽奖小程序制作步骤_微信抽奖小程序怎么开发

各位商家在节日期间做活动的时候,都希望用更少的费用去或者更好的宣传和推广的效果。比较常见的就是抽奖活动小程序。无须玩家下载,通过微信扫码或者指定入口就可以参与。方便,效果又好。那么,性价比高的抽奖活动小程序怎么做? 来…

LabVIEW使用VI脚本重新排列对象

LabVIEW使用VI脚本重新排列对象VI脚本可用来重新排列前面板和程序框图的对象。该教程以程序框图对象重新排列为例。按照下列步骤,使用VI脚本重新排列程序框图对象。创建VI前,需先了解VI脚本的基本内容。必须启用VI脚本,才能显示VI脚本选板&am…

solr-cloud集群

Zookeeper集群搭建完成,下面开始构建solr-cloud从复制四个tomcat实例开始将配置好的单机版solr复制到tomcat实例下修改tomcat端口号vim tomcat01/conf/server.xmlvim tomcat02 /conf/server.xml使用配置好的单机版solrhome关联solr和solrhomevim tomcat01/webapps/s…

数据库系统概念 | 第三章:SQL介绍

文章目录📚SQL语言概览📚SQL数据定义🐇基本数据类型🐇基本模式定义🥕create table🥕create domain🥕drop table🥕delete table🥕alter table📚SQL查询的基本结…

Transformer模型详解

1. 前言 transformer结构是google在2017年的Attention Is All You Need论文中提出,在NLP的多个任务上取得了非常好的效果,可以说目前NLP发展都离不开transformer。最大特点是抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。 …

VESC操作入门——控制霍尔电机、无感电机和AS5047P

目录一、设备说明二、VESC4驱动霍尔电机2.1、硬件准备2.2、硬件连接2.3、打开软件2.4、连接2.5、校准电机2.6、主界面操作三、VESC4驱动无感电机3.1、硬件准备3.2、硬件连接3.3、打开软件3.4、校准电机四、VESC4驱动AS5047P4.1、软硬件修改4.2、硬件准备4.3、硬件连接4.4、校准…

Win32解决透明字体改变时重叠的问题,GetClientRect与GetWindowRect的使用

透明字体,改变时发生文本重叠,解决办法是刷新窗体局部区域,该区域是文本或者按钮等控件的区域 Win32 API中使用InvalidateRect函数使指定区域失效,意味着要刷新该区域,再用UpdateWindow函数强迫窗体立即刷新 RECT rc; ... InvalidateRect(hWnd,&rc,true); UpdateWind…

Python操作文件及其内容的常用方式

Python操作文件及其内容的常用方式 文章目录Python操作文件及其内容的常用方式1:修改文件名1.1:修改指定文件名1.2:修改目录下的所有文件的文件名2:读取文件2.1:读取文件内容2.1.1:按行读取2.1.2&#xff1…

[Arduino]环境安装与配置

最近着迷与Arduio,可以连接控制各种器件帮助人类降低负担,如室内外温度动态采集、声控灯、自动给绿植浇水等各种应用,感觉挺有意思;随着最近两年物联网的推广及“万物互联”的普及,个人觉得物联网还是有点花样的&#…

认证授权功能分析

1 模块需求分析 1.1 什么是认证授权 截至目前,项目已经完成了课程发布功能,课程发布后用户通过在线学习页面点播视频进行学习。如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么…

1949-2020年各省全要素生产率(年度)

1949-2020年各省全要素生产率(年度) 1、时间:1949-2020年 2、计算说明:产出为实际GDP,投入要素为从业人员数、固定资产(永续盘存法) 3、范围:包括31省 4、指标说明: 全要素生产率&#xf…

TiCDC 源码阅读(三)TiCDC 集群工作过程解析

内容概要 TiCDC 是一款 TiDB 增量数据同步工具,通过拉取上游 TiKV 的数据变更日志,TiCDC 可以将数据解析为有序的行级变更数据输出到下游。 本文是 TiCDC 源码解读的第三篇,主要内容是讲述 TiCDC 集群的启动及基本工作过程,将从…

MSR 5660设备进行流量整形和带宽保证的实现案例

组网及说明现场客户使用MSR5660设备替换客户处原有华为的设备,之前华为的设备做了GTS流量整形和WFQ的带宽保证,需求见下面图片描述配置步骤一、针对G1/0/1口入方向进行本地优先级的映射:(1)对进入设备G1/0/1口的流量进…

机器学习(二):人工智能发展历程

文章目录 人工智能发展历程 一、人工智能的起源 1、图灵测试 2、达特茅斯会议 二、发展历程 人工智能发展历程 一、人工智能的起源 1、图灵测试 测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘&…

synchronized 原理(锁升级、锁消除和锁粗化)

目录:一、前言二、锁升级三、锁消除四、锁粗化一、前言根据之前的锁策略,可以总结出, synchronized 具有以下特性( JDK 1.8):1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁。2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁。3.…

Javascript 职责链模式

现实中的职责链模式 职责链模式的例子在现实中并不难找到,以下就是两个常见的跟职责链模式有关的场景。 ❏ 如果早高峰能顺利挤上公交车的话,那么估计这一天都会过得很开心。因为公交车上人实在太多了,经常上车后却找不到售票员在哪&#x…

年前最后一次分享5款小工具

马上要回家过年了,今年最后一次分享,希望大家喜欢。 1.图片管理器——Imagine 在管理器支持直接预览压缩包图片。支持图片编辑、图片批量转换、批量重命名、支持 GIF 动态图片编辑。如插入帧、修改帧的速度、循环播放、尺寸。同时还支持让系统右键菜单…

熟悉 NestJS (文末附视频)

前言 经过了需求分析以及技术选型之后,我们正式步入了第三个环节:脚手架搭建。 工欲善其事,必先利其器,NestJS 为开发者提供了很多开箱即用的功能,我们可以根据团队的需求搭建一套适配所有业务开发的基础脚手架。所以…

帮助有一定计算机基础的人 快速复习并重新拾起C语言基础

这里写目录标题1.C语言程序举例2.详解C语言程序结构1)#include2)main 函数:3){} 括号,程序体和代码块4)注释5)print 函数6)return 语句3 C程序的编译步骤是怎样?4.数据的…