C语言文件操作(上)(27)

news2024/10/9 4:24:22

文章目录

  • 前言
  • 一、为什么要用文件?
  • 二、什么是文件?
    • 程序文件
    • 数据文件
    • 文件名
    • 文件类型
    • 文件缓冲区
    • 文件指针
  • 三、流
    • 流的概念
    • 标准流
  • 总结


前言

  C语言可以直接操作文件,如果你是第一次听说这个特性,可能会眼前一亮,感到惊奇
  事实上,我们以后为了能数据持久化,多是在数据库上操作,但你文件操作这块内容我认为还是要学习一下的

  就当是锻炼内功了,正文开始!


一、为什么要用文件?

我们先来看以下代码

int main()
{
	int n = 0;
	printf("%d", n); // 0
	
	scanf("%d", &n);
	printf("%d", n);

	return 0;
}

在终端上,我们会看到打印了0,此时光标在等待我们输入,我们输入20,就再次打印20
假如关闭程序,再来一次呢,会发现n一开始还是打印0,等于说我们输入的数据20,就不存在了

  数据是存放在内存中,当程序退出的时候之前的数据就会消失,很不方便。而使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化,这就是我们使用文件和未来的数据库的原因

二、什么是文件?

  磁盘上的文件是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的),本篇我们主要讨论数据文件

程序文件

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

数据文件

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

而在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上,其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件,即数据文件

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀,为了方便起见,文件标识常被称为文件名

例如:c:\code\test.txt

文件类型

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

二进制文件: 数据在内存中以二进制的形式进行存储,如果不加转换直接输出到外存,就是二进制文件
文本文件: 如果要求在外存上以ASCII码的形式存储,则需要在存储前进行转换。以ASCII码的形式进行存储的文件就是文本文件

那么一个数据在外存中是如何存储的呢?

答案是:字符一律以ASCII码值进行存储;数值型数据既可以以ASCII码值进行存储,也可以以二进制的形式进行存储

例如,有整数10000,如果我们以ASCII值的形式输出到磁盘,那么它将在磁盘中占用5个字节(一个字符一个字节);而如果以二进制的形式进行输出,那么它只在磁盘中占用4个字节(一个整型大小即可存储)

在这里插入图片描述

文件缓冲区

文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数

是指系统自动地在内存中为程序中每一个正在使用的文件开辟开辟一块“文件缓冲区”。从内存向磁盘输出的数据会先送到内存中的缓冲区,待缓冲区装满后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,待缓冲区装满后,再从缓冲区逐个地将数据送到程序数据区。缓冲区的大小是根据C编译系统决定

在这里插入图片描述

假如每次输入输出都要来一次访问磁盘,就好像每次上课有一个同学每隔一分钟就要提问一次问题,老师就得停下来,严重拖慢了教学进度,事实上这时候应该每位同学在上课期间先想好自己要问的问题,等到时候一齐解决,这种方式效率最高

// 你可以通过以下代码来验证文件缓冲区的存在
// 你可能暂时还看不太懂,没事,你可以学完本篇其他内容再倒回来
// 这是我的编排失误,但我懒得改了~~~
#include <stdio.h>
#include <windows.h>

// VS2022 WIN11 x64环境测试

int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);

	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");

	Sleep(10000);
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;

	return 0;
}

一句话,缓冲区的存在大大提高了操作系统的效率

文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字、文件的状态及文件的当前位置等)。这些信息是保存在一个结构体变量中的,该结构体变量是由系统声明的,并将该结构体类型重命名为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*的指针变量,定义pf是一个指向FILE类型的指针变量,可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量就能找到与它关联的文件,相信我,这很酷!!!

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

在这里插入图片描述

三、流

流的概念

我们上文提到了流这个概念,其实这很抽象,我在这里单独介绍一下,首先你应该认识到不同的外部设备的输入输出操作不同,要读取一个数据,可以键盘输入、文件输入、网络输入…

于是为了方便统一,对各种设备进行方便的操作,我们提出了流的概念

流:往往是对一种有序连续具有方向性的数据的抽象描述。(从流读写,都要先打开流,之后操作)

在这里插入图片描述

标准流

既然你说读写必须要打开流,那么我们为什么从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

答案就在头文件#include <stdio.h>里!!!
有了它,一个C程序在启动的时候,就自动打开了三个流:

  1. stdin-标准输⼊流,在大多数的环境中从键盘输入
  2. stdout-标准输出流,大多数的环境中输出至显示器界面
  3. stderr-标准错误流,大多数环境中输出到显示器界面

  以上三个流的类型是:FILE*,通常称为文件指针。并且通过文件指针来维护流的各种操作,也导致使用scanf和printf等函数可以直接进行输入输出操作


总结

  先粗略介绍一些概念,比较简略抽象,大家可自行搜索相关资料来掌握

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

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

相关文章

jwt认证课件讲解

JWT 基本概念 在用户登录后&#xff0c;我们需要在不同请求之间记录用户的登录状态&#xff0c;常用方式一般有三种&#xff1a;Cookie&#xff0c;Session和Token。 这里我们使用第三种Token令牌方式来实现认证鉴权&#xff0c;采用Json Web Token认证机制&#xff08;简称…

继电器原理及应用

目录 前言 继电器 1.继电器配图 2.继电器原理图 3.继电器的使用 1-继电器的使用意义 2-继电器使用场景 继电器的简单使用 1.使用原理及接线 2.使用思考 3.代码实现 总结 前言 我们上节已经简单了解了震动传感器的使用(不懂的直接去看&#xff1a;震动传感器)&#xff…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例&#xff0c;无论是否使用&#xff0c;实例都会被创建。优点是实现简单&#xff0c;线程安全。缺点是可能造成资源浪费&#xff0c;而程序可能不一定会使用这个实例…

21 基于51单片机的隧道车辆检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 以AT89C51单片机为控制核心&#xff0c;实现对隧道环境的监测。采用模块化设计&#xff0c; 共分以下几个功能模块&#xff1a; 单片机最小系统模块、电源模块、气体传感模块、和显示模块等。 通过…

Yocto - 使用Yocto开发嵌入式Linux系统_08 掌握软件包相关功能

Assimilating Packaging Support 本章介绍了解 Poky 和 BitBake 打包相关方面的关键概念。我们将了解支持的二进制包格式、共享状态缓存、包版本控制组件、如何设置和使用二进制包馈以支持我们的开发流程等。 This chapter presents the key concepts for understanding the as…

Pikachu-Sql-Inject - 通过sql进行远程服务器控制(试验)

secure_file_priv是MySQL中的系统变量&#xff0c;用于限制文件的读取和写入。 查看命令&#xff1a; show variables like "secure%" //或者 select secure_file_priv; 1.secure_file_priv NULL &#xff0c;限制文件的读取和写入。 2.secure_file_priv 文件路…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网&#xff1a;www.icicml.org 大会时间&#xff1a;2024年11月22日-24日 大会地点&#xff1a;中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

【含开题报告+文档+PPT+源码】基于SpringBoot的社区家政服务预约系统设计与实现【包运行成功】

开题报告 社区家政服务是满足居民日常生活需求的重要组成部分&#xff0c;在现代社会中发挥着越来越重要的作用。随着城市化进程的不断加速&#xff0c;社区家政服务需求量呈现持续增长的趋势。然而&#xff0c;传统的家政服务模式存在一些问题&#xff0c;如预约流程繁琐、信…

Kafka的基本概念整理

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

【M365运维】在SPO文档库里删除文档时,遇到文档被签出无法删除。

【问题】SPO的存储空间剩的不多了&#xff0c;在清理文档库时&#xff0c;遇到有些文档被签出但用户已经离职&#xff0c;删除文件时报错。 【解决】翻SPO的设置时&#xff0c;看到有“管理没有已签入版本的文件”&#xff0c;在里面获取文件的所有权之后就可以删除了。 具体…

如何使用ipopt进行非线性约束求目标函数最小值(NLP非线性规划)内点法(inner point method)

非线性规划&#xff0c;一般用matlab调用cplex和gurobi了&#xff0c;但这两个一般用于线性规划和二次规划 线性规划LP&#xff0c;二次规划&#xff08;quadratic programming&#xff09;&#xff0c;如果要求更一般的非线性规划IPOT是个很好的选择&#xff0c;求解器很多&a…

点,点间连接的数学构型系统

点&#xff0c;点间连接的数学构型系统 生物神经系统的宇宙时间尺度的进化过程&#xff1a;通过天文数字的生物数量、天文时间尺度的生态系统得自然&#xff08;按自然规则&#xff09;的演化&#xff0c;沉淀出最高级的人脑神经系统&#xff0c;那么其实&#xff0c;这个过程…

C嘎嘎入门篇:类和对象番外(时间类)

前文&#xff1a; 小编在前文讲述了类和对象的一部分内容&#xff0c;其中小编讲述过运算符重载这个概念以及一个时间类&#xff0c;当时小编讲的没有那么细致&#xff0c;下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载&#xff0c;那么&#xff0c;代码时刻…

MySQL 日志 - Binlog

文章目录 binlog 的格式mysqbinlog 工具SHOW binlog events;binlog 和 redo log 对比 https://dev.mysql.com/doc/refman/8.4/en/binary-log.html binlog 全称 BinaryLog&#xff0c;是 MySQL 数据库中用于记录所有更改数据库状态的事件的日志文件。它主要用于以下几个目的&am…

OBOO鸥柏丨OLED透明触摸查询一体机数字科技触控广告屏技术前沿

吊挂透明OLED触摸屏一体机正成为博物馆数字化展示的“共同奔赴赛道选择&#xff0c;透过透明屏幕看到展示物品的内部结构和细节&#xff0c;GG纯平面触控实现展示查询交互与互动的完美结合。相比传统的商用/工业液晶显示屏机柜&#xff0c;OLED透明触摸屏具有更高的对比度和更广…

解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南

文章目录 前言&#x1f340;一、 什么是 Python 字典&#xff1f;1.1 字典的语法 &#x1f340;二、 字典的基本操作2.1 字典的创建2.2 访问字典中的值2.3 添加或修改键值对2.4 删除字典中的键值对 &#x1f340;三、 字典的遍历操作3.1 遍历字典的键3.2 遍历字典的值3.3 同时遍…

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图&#xff0c;所以这里的泛型就更宽泛&#xff0c;不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的&#xff0c;换句话说&…

秋招内推2025-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

OBOO鸥柏丨户外液晶广告机有哪些功能可以定制室外广告牌?

OBOO鸥柏户外液晶广告机&#xff0c;犹如一位多才多艺的传播使者&#xff0c;巧妙融合信息传播、广告盛宴与互动乐园于一体&#xff0c;室外高亮数字标牌成为都市风景中一抹亮丽的智慧之光。鸥柏液晶户外广告牌轻盈穿梭于高速服务区的喧嚣、智慧城市的新能源充电站、收费站的繁…

Linux_kernel字符设备驱动12

一、字符设备的编程框架 在Linux_kernel驱动开发11中&#xff0c;我们介绍的系统调用。只是为了做一个实验&#xff0c;在真正开发时&#xff0c;我们并不会直接在内核中添加一个新的系统调用&#xff0c;这样做会导致内核体积变大。 1、字符设备结构体 我们实现一个硬件字符设…