文件的基础必备知识(初学者入门)

1. 为什么使用文件

2. 什么是文件

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

4. 文件的打开和关闭

1.为什么使用文件

我们写的程序数据是存储在电脑内存中,如果程序退出,内存回收,数据就丢失,等程序再次运行时,上次的数据已经消失。面对这个问题即我们想将数据永久保存,我们就可以使用文件。

2. 什么是文件

磁盘(硬盘)上的数据的集合就是文件。

在文件功能的角度看,文件一般分为两种:程序文件、数据文件。

2.1 程序文件

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

2.2 数据文件

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

2.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

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

例如:c:\code\test.txt

为了方便起见,文件标识常被称为文件名。

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

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

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

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

一个数据在文件中是如何存储的?

规则:字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

测试代码:

4. 文件的打开和关闭

4.1 流和标准流

4.1.1 流

程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便操作,人类抽象出流的概念,相当于一种超能力,跟各种低高等动物进行交流。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过这个超能力(流)操作。

一般情况下,我们要想从流写入数据,或者从流中读取数据,都要打卡流,然后操作。

4.1.2 标准流

我们从键盘输入数据,向屏幕上输出数据,并没有打开流?

因为C语言程序在启动的时候,默认打开3个流:

   stdin - 标准输入流,在大多数情况中从键盘输入,scanf函数就是从标准输入流中读取数据。

   stdout - 标准输出流,大多数情况中输出至显示器界面,printf函数就是将信息输出到标准输出流中。

stderr - 标准错误流,大多数情况中输出到显示器界面。

stdin、stdout、stderr三个流的类型是:FILE *,通常称为文件指针。

C语言中,就是通过FILE * 的文件指针来维护流的各种操作。

4.2 文件指针

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

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

例如,vs2022编译环境提供的 stdio.h 头文件中有以下的文件类型声明:

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

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

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

一般是通过一个FILE的指针来维护这个FILE结构的变量。

创建一个文件指针变量。

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

解释:
定义pf是一个指向FILE类型数据的指针变量。可以是fp指向某个文件的文件信息(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。简单点说: 通过文件指针变量能够间接找到与它关联的文件。

如图:

4.3 文件的打开和关闭

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

在编写程序的时候,再打开文件的同时,都会返回一个FILE* 的指针变量指向该文件(建立指针和文件的关联)

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

//打开文件

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

//关闭文件

int fclose ( FILE * stream );

mode表示文件打开的打开模式,下面是文件的打开模式:

文件使用方式      含义                                                                   如果指定文件不存在

"r"(只读)             为了输入数据,打开一个已经存在的文本文件   出错

"w"(只写)           为输出数据,打开一个文本文件                         建立一个新的文件

"a"(追加)           向文本文件尾添加数据                                        建立一个新的文件

"rb"(只读)           为输入数据,打开一个二进制文件                     出错

"wb"(只写)          为输出数据,打开一个二进制文件                     建立一个新的文件

"ab"(追加)          向二进制文件尾添加数据                                    建立一个新的文件

"r+"(读写)           为读和写,打开一个文本文件                            出错

"w+"(读写)           为读和写,建立一个文本文件                           建立一个新的文件

"a+"(读写)           打开一个文件,在文件尾进行读和写                 建立一个新的文件

"rb+"(读写)          为了读和写打开一个二进制文件                       出错

"wb+"(读写)        为读和写,新建一个新的二进制文件                 建立一个新的文件

"ab+"(读写)         打开二进制文件,在文件尾进行读和写            建立一个新的文件

示例代码:
 

int main()
{
	//打开文件
	FILE* fp = fopen("test.txt", "w");
	//写文件
	if (fp == NULL)
	{
		perror("fopen");
	}
	int i = 'a';
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i, fp);
	}
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}

下面还有内容,期待我更有质量的文章吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++~~期末复习题目讲解---lijiajia版本

目录 1.类和对象 &#xff08;3&#xff09;创建对象的个数 &#xff08;3&#xff09;全局变量&#xff0c;局部变量 &#xff08;4&#xff09;构造函数的执行次数 &#xff08;5&#xff09;静态动态析构和构造顺序 &#xff08;6&#xff09;初始化顺序和声明顺序 &a…

MySQL数据库的基础:逻辑集合数据库与表的基础操作

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

简单聊聊大数据解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Spring5

文章目录 1. Spring 是什么&#xff1f;2. IoC3. Spring Demo4. IoC 创建对象的方式 / DI 方式注入的默认参数在哪里设定? 5. Spring 配置tx:annotation-driven 用于启用基于注解的事务管理 6. Bean的作用域7. 在Spring中有三种自动装配的方式1. 在xml中显式的配置2. 在java中…

node的安装

node是前端开发环境&#xff0c;所以运行前端程序需要安装和配置node 1. 下载安装node 去node官网选择你需要的版本进行下载 Node.js — Download Node.js (nodejs.org) ​ 下载到本地后一路点击next傻瓜式安装&#xff0c;安装成功后测试是否安装成功 node -v 显示node版…

电路防护-贴片陶瓷气体放电管

贴片陶瓷气体放电管 GDT工作原理GDT主要特性参数典型电路压敏电阻与 TVS 管的区别 GDT工作原理 陶瓷气体放电管是一种电子器件&#xff0c;其工作原理基于气体放电现象。这种管子的内部填充了一种特定的气体&#xff0c;通常是氖气或氩气。当管子两端施加足够的电压时&#xf…

刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)

&#x1f4e3;德勤 2024暑期实习测评已发&#xff0c;正在申请的小伙伴看过来哦&#x1f440; ㊙️本次暑期实习优先考虑2025年本科及以上学历的毕业生&#xff0c;此次只有“审计及鉴定”“税务与商务咨询”两个部门开放了岗位~ ⚠️测评注意事项&#xff1a; &#x1f44…

USB转I2C转SPI芯片CH341

CH340与CH341区别 CH340主要用于将USB转换为各种串口&#xff0c;CH340H和CH340S可以实现USB转并口。 CH341和340的不同之处在于CH341提供I2C和SPI接口&#xff0c;方便连接到I2C或SPI总线操作相关的器件。 CH341主要有6种封装。见表1. CH341T SSOP-20封装和丝印 USB 总线转接…

大模型基础——从零实现一个Transformer(2)

大模型基础——从零实现一个Transformer(1) 一、引言 上一章主要实现了一下Transformer里面的BPE算法和 Embedding模块定义 本章主要讲一下 Transformer里面的位置编码以及多头注意力 二、位置编码 2.1正弦位置编码(Sinusoidal Position Encoding) 其中&#xff1a; pos&…

【JVM】从编译后的指令集来再次理解++i和i++的执行顺序

JVM为什么要选用基于栈的指令集架构 与基于寄存器的指令集架构相比&#xff0c;基于栈的指令集架构不依赖于硬件&#xff0c;因此可移植性更好&#xff0c;跨平台性更好因为栈结构的特性&#xff0c;永远都是先处理栈顶的第一条指令&#xff0c;因此大部分指令都是零地址指令&…

SpringMVC[从零开始]

SpringMVC SpringMVC简介 1.1什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M:Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专…

对猫毛过敏?怎么有效的缓解过敏症状,宠物空气净化器有用吗?

猫过敏是一种常见的过敏反应&#xff0c;由猫的皮屑、唾液或尿液中的蛋白质引起。这些蛋白质被称为过敏原&#xff0c;它们可以通过空气传播&#xff0c;被人体吸入后&#xff0c;会触发免疫系统的过度反应。猫过敏是宠物过敏中最常见的类型之一&#xff0c;对许多人来说&#…

【Java】static 修饰变量

static 一种java内置关键字&#xff0c;静态关键字&#xff0c;可以修饰成员变量、成员方法。 static 成员变量 1.static 成员变量2.类变量图解3.类变量的访问4.类变量的内存原理5.类变量的应用 1.static 成员变量 成员变量按照有无static修饰&#xff0c;可以分为 类变量…

Python学习打卡:day02

day2 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 8、字符串的三种定义方式 字符串在Python中有多种定义形式 单引号定义法&#xff1a; name 黑马程序员双引号定义法&#xff1a; name "黑马程序…

如何为色盲适配图形用户界面

首发日期 2024-05-25, 以下为原文内容: 答案很简单: 把彩色去掉, 测试. 色盲, 正式名称 色觉异常. 众所周知, 色盲分不清颜色. 如果用户界面设计的不合理, 比如不同项目只使用颜色区分, 而没有形状区分, 那么色盲使用起来就会非常难受, 甚至无法使用. 色盲中最严重的情况称为…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗&#xff1f; L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

【数据结构】AVL树(平衡二叉树)

目录 一、AVL树的概念二、AVL树的节点三、AVL树的插入四、AVL树的旋转1.插入在较高左子树的左侧&#xff0c;使用右单旋2.插入在较高右子树的右侧&#xff0c;使用左单旋3.插入较高左子树的右侧&#xff0c;先左单旋再右单旋4.插入较高右子树的左侧&#xff0c;先右单旋再左单旋…

unity基础(五)地形详解

目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌&#xff0c;如山脉、平原、山谷等。 通过 Unity 的地形…

C51学习归纳9 --- I2C通讯学习(重点)

首先&#xff0c;我自己学习过以后的直观感觉&#xff0c;通信协议是单片机的灵魂之一&#xff0c;只有规定好了通信协议我们才能够正确的接收到信息&#xff0c;才能实现更加深入的研究。所以这一部分是需要好好学习的。 本节借助一个可存储的芯片AT24C02&#xff0c;进行在I2…

开源低代码平台技术为数字化转型赋能!

实现数字化转型升级是很多企业未来的发展趋势&#xff0c;也是企业获得更多发展商机的途径。如何进行数字化转型&#xff1f;如何实现流程化办公&#xff1f;这些都是摆在客户面前的实际问题&#xff0c;借助于开源低代码平台技术的优势特点&#xff0c;可以轻松助力企业降低开…