(C语言)文件操作

目录

文件

程序文件

数据文件

文件名

​编辑数据文件的分类

文件的打开和关闭

标准流

1)stdin

2)stdout

3)stderr

文件指针

文件的打开和关闭

对文件内容操作的函数

1)fgetc,fputc

2)fputs

 3)fgets

4)fprintf

5)fscanf

6)sprintf

7)fread,fwrite

文件的随机读写

1)fseek

 2)ftell,remind

文件读取结束的判定


我们存储的文件指是磁盘(硬盘)上的文件,放在硬盘上可以将数据进行持久化的保存

但是在程序设计时,我们通常谈到两种文件:程序文件和数据文件

文件

程序文件

1)源程序文件:后缀是.c的文件;

2)目标文件:windows环境后缀是.obj(在编译和链接中会专门讲解);

3)可执行文件:windows环境后是.exe;

数据文件

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

文件名

一个为了将要有唯一的文件标识,便于查找文件;

文件名包含三个部分:1)文件路径;2)文件主干;3)文件后缀;

数据文件的分类

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

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

2)文本文件:如果要求在外存文件上以ASCII码值的形式存储,则需要在存储前进行转化,以ASCII码值的形式存储的文件叫做文本文件;

注意:储存的时候,字符一律以ASCII码值的形式存储,数值型数据可以以ASCII码值的形式存储,也可以以二进制的形式存储

比如:10000,如果以二进制输出到磁盘上,则在磁盘上只占4个字节;如果以ASCII码值进行输出,每个字符一个字节,则需要5个字节;

文件的打开和关闭

如何用C语言打开一个文件;

我们程序的数据需要输出到 各种外部设备 ,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念;
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。

专门用来将文件和不同的外部设备建立关系;

文件的打开就是:1)打开文件(打开流);2)读写文件;3)关闭文件(关闭流)

标准流

我们在键盘上输入数据,向屏幕输出数据的时候,好像并没有看见打开了文件(流);因为在C语言程序启动时会默认打开3个标准流

1)stdin

标准输入流,在大多数环境从键盘输入,scanf函数就是从标准输入流中提取数据;

2)stdout

标准输出流,在大多数环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中;

3)stderr

标准错误流,大多数环境中输出(程序错误)到显示器界面;

stdin,stdout,stderr三个流的类型:FILE*,是一个文件指针

文件指针

文件指针是用来管理流的;

每一个被使用的文件(在硬盘上)都在内存中开辟了一个相应的文件信息区(在内存中),用来存储文件的相关信息,这些信息被保存在一个结构体变量中,该结构体的类型是由系统声明的,取名为FILE;

一般用FILE*的指针来维护FILE结构变量;

定义一个FILE*的指针相当于找到了文件的地址;

文件的打开和关闭

1)打开文件;2)读取文件;3)关闭文件;

在ANSI C标准中,规定用fopen来打开文件;

filename是指的是打开的文件名称,mode是文件打开的形式;

关闭文件用fclose;

关闭文件后,要把文件指针置为空指针;

后面会讲解对文件进行写操作;

注意:路径包含绝对路径和相对路径两种,这里就不再讲解了;

对文件内容操作的函数

1)fgetc,fputc

fgetc函数,形式:int fgetc(FILE* stream);从流中读取一个字符,当读取成功时,返回这个字符的ASCII码值,当读取错误的时候,返回EOF

fputc函数,形式:int fputc(int character,FILE* stream);将字符输出到流中;

2)fputs

fputs是用来将一串字符输出到文件中的;输出成功返回一个非负数,输出失败返回EOF

 3)fgets

fgets是拷贝函数;将流中的数据,拷贝最多num个倒str地址处;返回值是拷贝完成的起始地址;

可以看到记事本中的字符确实拷贝到了arr数组中,但是num是10,为什么只拷贝了9个?因为在使用fgets的时候会默认最后一个补'\0'上去,所以减少了一位字符的拷贝;若拷贝内容中含有换行符,则拷贝到换行符后自动停止拷贝;

4)fprintf

 

可以看到,printf和fprintf 的区别在于fprintf多了一个FILE* stream所以fprintf是把信息写在文件上的,而不是输出到屏幕上

5)fscanf

 与fprintf类似,fscanf不是从标准输入流中读取,而是从指定的stream流中读取;

6)sprintf

sprintf是将格式化的数据写到字符串中,即将格式化的数据转换成字符串;

将name字符串和c整形数据转化为字符串放在arr中;

7)sscanf

sscanf和sprintf的作用相反,其是将字符串转化成格式化数据;

sscanf是从arr地址开始读的,不是从键盘上读取;

7)fread,fwrite

fread和fwrite可以进行二进制的读写;

fread是将ptr地址处count个大小为size的元素以二进制的方式写入stream流中;

要用二进制的方式打开才能看到里面的数据,记事本不是以二进制的方式打开;

fread是从流中以二进制的方式读取num个size大小的数据放在str地址处,与fwrite相反,此处不再赘述了;

文件的随机读写

在进行对文件的操作的时候,文件中光标在时刻移动;在对文件进行读写的时候,我们又是不希望它从起始位置开始,此时我们就需要改变光标的起始位置。

1)fseek

fseek函数是专门用来改变文件光标的起始位置的;

从origin开始偏移量为offset(可以是负数)

origin有三种,文件起始位置,当前位置,末尾;

 2)ftell,remind

 ftell是用来告诉你此时文件指针(光标)位置的,其返回文件相对于起始位置的偏移量;

rewind是重置光标位置的,让文件指针(光标)位置回到起始位置;

文件读取结束的判定

判断方法:

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

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

注意:feof是用来判断文件读取结束的原因是否是遇到了文件末尾,而不是判断文件是否读取结束;当读取到文件末尾,则返回一个非0值;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI修改验证账号名正则表达式的案例

我有如下的一行老代码,今天复用的时候发现当时注释写错了,改好以后请AI再检查一遍。 因为这次AI的分析的思路很典范,所以拿出来分享一下。 提问: 请看一下这个正则和后面的注释是否匹配,现在的验证规则是否保证账号至…

SQL进阶技巧:如何进行数字范围统计?| 货场剩余货位的统计查询方法

目录 0 场景描述 1 剩余空位区间和剩余空位编号统计分析 2 查找已用货位区间 3 小结 0 场景描述 这是在做一个大型货场租赁系统时遇到的问题,在计算货场剩余存储空间时,不仅仅需要知道哪些货位是空闲的,还要能够判断出哪些货位之间是连…

彻底理解如何保证Redis和数据库数据一致性问题

一.背景 系统中缓存最常用的策略是:服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准,那么就可能出现 DB 和 Cache 数据不一致的问题。 二.读数据 逻辑如下: 当客户端发起查询数据的请求,首先回去Redis中查看没有没该数据&…

后仿真中的SDF语法之关键字 IOPATH 用法详解

在后仿真中,SDF(Standard Delay Format)文件用于描述设计的时序信息,而IOPATH是SDF中的一个关键结构,用于定义单元间的路径延迟。以下是IOPATH关键字的用法及其相关内容的详细介绍: IOPATH结构旨在将延迟数…

Springboot 整合 Java DL4J 搭建智能问答系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

基于SpringBoot的“网上书城管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“网上书城管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 用户注册界面…

测评部署和管理 WordPress 最方便的面板

新版宝塔面板快速搭建WordPress新手教程 - 倚栏听风-Morii - 博客园 初学者使用1Panel面板快速搭建WordPress网站 - 倚栏听风-Morii - 博客园 可以看到,无论是宝塔还是1Panel,部署和管理WordPress都有些繁琐,而且还需要额外去配置Nginx和M…

网络安全问题概述

1.1.计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁: (1) 截获——从网络上窃听他人的通信内容。 (2) 中断——有意中断他人在网络上的通信。 (3) 篡改——故意篡改网络上传送的报文。可应用于域名重定向,即钓鱼网站。 (4) 伪造——伪…

视觉顶会论文 | 基于Swin Transformer的轴承故障诊断

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

Altenergy电力系统控制软件 status_zigbee SQL注入漏洞复现(CVE-2024-11305)

0x01 产品简介 Altenergy电力系统控制软件是Altenergy Power System推出的一款专业软件。旨在为用户提供全面、高效、安全的电力系统控制解决方案。广泛应用于各类电力系统领域,如电力调度中心、发电厂、变电站、工业园区等。通过该软件的应用,用户可以实现对电力系统的全面…

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体,也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎* 描述:* # Author : geovindu,Geovin Du 涂…

AUTOSAR网络管理中的主动唤醒与被动唤醒

文章目录 1、主动/被动唤醒源、主动/被动唤醒节点2、网络拓扑说明 1、主动/被动唤醒源、主动/被动唤醒节点 休眠唤醒需要有一个触发源来进行触发,我们常用的NM报文是其中的载体之一。休眠唤醒的触发源又分为主动唤醒源和被动唤醒源。 主动唤醒源,就是能…

索贝融媒体 Sc-TaskMonitoring/rest/task/search SQL注入漏洞复现

0x01 产品简介 索贝融媒体产品是成都索贝数码科技股份有限公司(简称索贝)为各级电视台和媒体机构打造的一套集互联网和电视融合生产的解决方案。其代表产品为MCH2.0融合媒体生产业务系统,该系统带来了媒体领域一种全新的融合生产流程和工作机制,具有全方位的资源汇聚能力、…

【PyTorch】Pytorch中torch.nn.Conv1d函数详解

1. 函数定义 torch.nn.Conv1d 是 PyTorch 中用于一维卷积操作的类。定义如下: 官方文档:https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1,paddi…

[大数据]Trino

Trino安装部署-CSDN博客 Central Repository: io/trino/trino-server 下载地址: repo1.maven.org/maven2/io/trino/Central Repository: io/trino/trino-serverhttps://repo1.maven.org/maven2/io/trino/trino-server/ vim /etc/security/limits.conf * soft nofile 131072…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道,飞书是一款功能强大的在线协作工具,可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档,在使用飞书的过程中,发现很多文档没有复制权限,如果想要摘抄笔记,只能一个字一个字地敲出…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 (一)直观性的理解 (二)缓存区的好处 二、经典案例分析体会 (一)文件读写流(File I/O Buffering) BufferedOutputStream 和 BufferedWriter 可以加快…

解决upload上传之后,再上传没有效果

解决upload上传之后,再上传没有效果 注释:这是第二次上传,两次网络请求都是第一次上传的,这次上传没有网络请求 原因:在我的代码里我限制了上传数量为1,然后上传成功后,上传列表没有清空&#…

【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…