C语言第三十五弹---文件操作(上)

news2024/12/29 11:15:54

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

文件操作

1、为什么使用文件?

2、什么是文件?

2.1、程序文件

2.2、数据文件

2.3、文件名

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

4、文件的打开和关闭

4.1、流和标准流

4.1.1、流

4.1.2、标准流

4.2、文件指针

4.3、文件的打开和关闭

总结


1、为什么使用文件?

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存我们可以把数据存放在 磁盘文件、存放到 数据库等方式。此处我们就讲到如何 将数据放入到磁盘文件当中。

2、什么是文件?

磁盘(硬盘)上的文件是文件。例如电脑当中的C盘内放入的文件夹内的内容就是文件。
但是在程序设计中,我们⼀般谈的文件有两种:程序文件、数据文件(从文件功能的⻆度来分类
的)。

2.1、程序文件

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

2.2、数据文件

文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本弹讨论的是 数据文件
在以前各弹所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据运行结果显示到显示器上。 其实有时候我们会 把信息输出到磁盘上 ,当需要的时候再 从磁盘上把数据读取到内存中使用 ,这里处理的就是 磁盘上文件

2.3、文件名

⼀个文件要有⼀个 唯⼀的文件标识 ,以便用户识别和引用。
文件名包含3部分: 文件路径+文件名主干+文件后缀
例如: c:\code\test.txt        c:\code\ ---文件路径    test.txt ---文件名主干+文件后缀
为了方便起见,文件标识常被称为文件名。

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

根据数据的组织形式 数据文件 被称为 文本文件 或者 ⼆进制文件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
⼀个数据在文件中是怎么存储的呢?
字符⼀律以ASCII形式存储 数值型数据既可以用ASCII形式存储,也可以使用⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节(VS2022测试)。
测试代码:
#include <stdio.h>
int main()
{
 int a = 10000;
 FILE* pf = fopen("test.txt", "wb");
 fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
 fclose(pf);
 pf = NULL;
 return 0;
}

在VS上打开⼆进制文件:

先执行此代码,创建test.txt文件,然后在源文件添加现有项。添加文件test.txt,以二进制编辑器打开该文件。

4、文件的打开和关闭

4.1、流和标准流

4.1.1、流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要 打开流,然后操作

4.1.2、标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
stderr - 标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针。
C语言中,就是 通过 FILE* 的文件指针来维护流的各种操作的。

4.2、文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.
例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
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结构的变量,并填充其中的信息,使用者不必关新细节。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们可以创建⼀个FILE*的指针变量:
FILE* pf;//⽂件指针变量

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

4.3、文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSI C 规定使用 fopen 函数来打开文件, fclose 来关闭文件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
filename表文件名, mode表示文件的打开模式,下面都是文件的打开模式:
 
文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开⼀个已经存在的文本文件出错
“w”(只写)为了输出数据,打开⼀个文本文件建立⼀个新的文件
“a”(追加)向文本文件尾添加数据建立⼀个新的文件
“rb”(只读)为了输入数据,打开⼀个⼆进制文件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制文件建立⼀个新的文件
“ab”(追加)向⼀个⼆进制文件尾添加数据建立⼀个新的文件
“r+”(读写)为了读和写,打开⼀个文本文件出错
“w+”(读写)为了读和写,建议⼀个新的文件建立⼀个新的文件
“a+”(读写)打开⼀个文件,在文件尾进行读写建立⼀个新的文件
“rb+”(读写)为了读和写打开⼀个⼆进制文件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制文件建立⼀个新的文件
“ab+”(读写)打开⼀个⼆进制文件,在文件尾进行读和写建立⼀个新的文件
 

实例代码:
/* fopen fclose example */
#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭文件
		fclose(pFile);
	}
	return 0;
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法&#xff08;Enseamable learning&#xff09; 集成算法一般考虑树模型&#xff0c;KNN就不太适合 目的&#xff1a;让机器学习效果更好&#xff0c;单个不好&#xff0c;一起…

性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

BUUCTF------[HCTF 2018]WarmUp

开局一个表情&#xff0c;源代码发现source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"];if (! isset($page) |…

关于图形学中生成三角形库Triangle.Net的下载及简单使用

背景 Triangle.NET 是生成 2D&#xff08;约束&#xff09;Delaunay 三角剖分和点集或平面直线图的高质量网格。此库是基于 Jonathan Richard Shewchuk 的 Triangle 项目&#xff0c;主要用于图形学像Opengl(或Unity3D)中生成三角形使用。 下载 Triangle.Net是基于C#语言的库…

倾斜三维模型OSGB路径漫游——DasViewer

背景 有时候我们需要查看倾斜三维模型效果的效果&#xff0c;虽然也有很多软件可以用&#xff0c;比如CC、超图等等&#xff0c;但是这些软件都比较大&#xff0c;安装也比较麻烦&#xff0c;DasViewer这个软件就比较轻量&#xff0c;安装也简单&#xff0c;功能强大&#xff…

网络信息安全:nginx漏洞收集(升级至最新版本)

网络&信息安全&#xff1a;nginx漏洞收集&#xff08;升级至最新版本&#xff09; 一、风险详情1.1 nginx 越界写入漏洞(CVE-2022-41742)1.2 nginx 缓冲区错误漏洞(CVE-2022-41741)1.3 nginx 拒绝服务漏洞&#xff08;CNVD-2018-22806&#xff09; 二、nginx升级步骤 &…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

jpg图片怎么转成png?一个超实用的jpg转格式方法

Jpg是常见的图片格式之一&#xff0c;有时候需要将常见的jpg格式转换成png格式的图片来应对不同的需求。因为png格式的图片画质更清晰还支持透明度等&#xff0c;能够更好的保存图片质量。接下来&#xff0c;就给大家介绍一下jpg转换png格式的小窍门。只需要使用jpg格式转换器&…

Matlab高光谱遥感、数据处理与混合像元分解

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

HMI方案技术分享|启明智显M4核心板适配RGB/LVDS接口屏幕教程

前言&#xff1a; 深圳市启明智显科技有限公司专注于HMI&#xff08;人机交互&#xff09;和AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的研发、设计和生产。公司产品覆覆盖了多种操作系统&#xff0c;包括Linux、RTOS和OneOs等。无论您的项目使用哪种系统&am…

policy-space response oracles (PSRO)含义

Algorithm 1 维护了一个所有玩家策略的策略池。然后循环地选定玩家&#xff0c;然后从他的策略集中选择出一个策略&#xff0c;固定其它所有玩家此时的策略&#xff0c;然后不断地训练这个策略使得该策略成为一个在别的玩家策略不变的情况下、近似的best respond。然后将其加入…

仿牛客网项目---关注模块的实现

本篇文章是关于我的项目的关注模块的开发。 关注模块的开发实现了用户之间的关注功能和关注列表的展示。通过使用相应的服务类处理关注和取消关注操作&#xff0c;并利用用户服务类获取用户信息&#xff0c;实现了关注功能的存储和查询。同时&#xff0c;通过触发关注事件&…

哈希的简单介绍

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 l o g 2 N log_2 N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的…

少儿编程 中国电子学会C++等级考试一级历年真题答案解析【持续更新 已更新82题】

C 等级考试一级考纲说明 一、能力目标 通过本级考核的学生&#xff0c;能对 C 语言有基本的了解&#xff0c;会使用顺序结构、选择结构、循环结构编写程序&#xff0c;具体用计算思维的方式解决简单的问题。 二、考核目标 考核内容是根据软件开发所需要的技能和知识&#x…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

私有化部署自己的ChatGPT,免费开源的chatgpt-next-web搭建

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

新零售SaaS架构:订单履约系统的概念模型设计

订单履约系统的概念模型 订单&#xff1a;客户提交购物请求后&#xff0c;生成的买卖合同&#xff0c;通常包含客户信息、下单日期、所购买的商品或服务明细、价格、数量、收货地址以及支付方式等详细信息。 子订单&#xff1a;为了更高效地进行履约&#xff0c;大订单可能会被…

安卓开发:计时器

一、新建模块 二、填写应用名称和模块名称 三、选择模块&#xff0c;Next 四、可以保持不变&#xff0c;Finish 五、相关目录文件 六、相关知识 七、&#xff1f;

正大国际:期货结算价是如何理解呢?结算价有什么作用?

如何理解期货结算价&#xff1a; 什么是商品期货当日结算价&#xff0c; 商品期货当日结算价是指某一期货合约当日交易期间成交价格按成交量的加权平均价。当日 无成交的&#xff0c;当日结算价按照交易所相关规定确定。 股指期货当日结算价是指某一期货合约当日交易期间最后一…

采购软件是如何改善采购周期?

采购是一个复杂的职能重叠网络&#xff0c;由市场分析、供应商选择、发布 RPF/RFQ、合同谈判等多个工作流程组成。此外&#xff0c;时间紧迫、满足客户期望等压力也使这项工作极具挑战性。因此&#xff0c;如果企业在采购过程中采取短视的方法&#xff0c;没有遵循适当的结构&a…