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

文章目录

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


前言

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

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


一、为什么要用文件?

我们先来看以下代码

int main()
{int n = 0;printf("%d", n); // 0scanf("%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.mzph.cn/diannao/55583.shtml

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

相关文章

MongoDB的安装与增删改查基本操作

MongoDB是一种非关系型数据库,是NoSQL语言,但是又是最接近关系型数据库的。内部存储不是表结构,但是可以对数据进行表结构的操作。 一、安装 在官网:Download MongoDB Community Server | MongoDB下载系统对应的版本进行安装即可 二、编辑器 在安装MongoDB后会自带一个编…

图片格式入门

主要参考资料&#xff1a; 常见的图片格式介绍: https://blog.csdn.net/cnds123/article/details/127165291 目录 像素图与矢量图像素图&#xff08;pixel image&#xff09;矢量图&#xff08;Vector graphics&#xff09; 像素图与矢量图 像素图&#xff08;pixel image&…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

Spring Boot项目使用MyBatis Plus的详细步骤

在Spring Boot项目中使用MyBatis Plus&#xff0c;可以极大地简化数据库操作&#xff0c;提高开发效率。以下是在Spring Boot项目中集成和使用MyBatis Plus的详细步骤&#xff1a; 一、环境准备 确保已安装Java和Spring Boot&#xff1a;MyBatis Plus是基于Java和Spring Boot…

话术挂断之后是否处理事件

文章目录 前言联系我们解决方案方案一方案二 前言 流程&#xff1a;自动外呼进入机器人话术。问题&#xff1a;在机器人放音时用户挂断后&#xff0c;话术还会继续匹配流程&#xff0c;如果匹配上的是放音节点&#xff0c;还会进行放音&#xff0c;那么在数据库表conversation…

Redis 缓存策略详解:提升性能的四种常见模式

在现代分布式系统中&#xff0c;缓存是提升性能和减轻数据库负载的关键组件。Redis 作为一种高性能的内存数据库&#xff0c;被广泛应用于缓存层。本文将深入探讨几种常用的 Redis 缓存策略&#xff0c;包括旁路缓存模式&#xff08;Cache-Aside Pattern&#xff09;、读穿透模…

windows中C++调用dll文件的两种方式,QT QLibrary和Windows API

假设DLL文件名为 test.dll&#xff0c;函数 int add(int a.int b) 1.使用Windows API 的方式 #include <windows.h>extern "C" __declspec(dllexport) int add(int a, int b); // 定义函数typedef int (*AddFunction)(int, int); // 定义函数指针类型HMODULE …

阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

作者&#xff1a;胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件&#xff0c;这个事件是 K8s 原生的事件&#xff0c;其实绝大多数的用户并不会关心&#xff0c;同时也可能看不懂。而事件中心&#xff0c;是希望能够…

SpringBoot MyBatis连接数据库设置了encoding=utf-8还是不能用中文来查询

properties的MySQL连接时已经指定了字符编码格式&#xff1a; url: jdbc:mysql://localhost:3306/sky_take_out?useUnicodetrue&characterEncodingutf-8使用MyBatis查询&#xff0c;带有中文参数&#xff0c;查询出的内容为空。 执行的语句为&#xff1a; <select id&…

一个月冲刺软考——病毒与木马的了解、认证与加密、加密技术的分类

目录 1.计算机病毒与木马 2.加密方式的分类及特点 3.选择路由的策略 4.DoS攻击(拒绝服务) 5.认证与加密 6.报文摘要算法 7.网络攻击的类别 8.安全的分类及举例 9.加密技术的分类 10.什么是PKI体制&#xff1f;有哪些步骤&#xff1f; 1.计算机病毒与木马 1.1病毒&am…

Tensorflow2.0

Tensorflow2.0 有深度学习基础的建议直接看class3 class1 介绍 人工智能3学派 行为主义:基于控制论&#xff0c;构建感知-动作控制系统。(控制论&#xff0c;如平衡、行走、避障等自适应控制系统) 符号主义:基于算数逻辑表达式&#xff0c;求解问题时先把问题描述为表达式…

开源跨平台三维模型轻量化软件osgGISPlugins-1、简介

下一篇文章&#xff1a;开源跨平台三维模型轻量化软件osgGISPlugins-2、如何编译 1、仓库地址 github地址&#xff1a;https://github.com/newpeople123/osgGISPlugins gitee地址&#xff1a;https://gitee.com/wtyhz/osg-gis-plugins 2、项目简介 osg引擎的gis插件&#x…

【Kubernetes】常见面试题汇总(五十三)

目录 118. pod 状态为 ErrlmagePull &#xff1f; 119.探测存活 pod 状态为 CrashLoopBackOff &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。…

使用NumPy进行线性代数的快速指南

介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作&#xff0c;这对于数据分析和科学计算至关重要。在本指南中&#xff0c;我们将探讨 NumPy 中可用的一些基本线性代数操作&#xff0c;展示如何通过运算符重载和内置函数执行这些操作。 元素级…

【汇编语言】寄存器(CPU工作原理)(一)—— 寄存器的基础知识及存储

文章目录 前言1. 寄存器2. 通用寄存器3. 字在寄存器中的存储结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底层工作原…

docker拉取镜像推送到阿里云镜像仓库

文章目录 个人GitHub仓库地址镜像源地址 Docker拉取失败&#xff0c;利用github将镜像推送到阿里云 docker_image_pusher hub-mirror仓库 1、windows没有升级&#xff0c;用不了WSL。可以使用wsl&#xff0c;配合docker desktop直接拉取镜像&#xff0c;windows10安装WSL2及使…

Python 代码编写规范

本规范旨在为 Python 项目的代码编写提供一致性指南。它遵循 Python 社区的 PEP 8 标准&#xff0c;并结合了通用的编程最佳实践。 1. 编码风格 1.1 缩进 使用 4 个空格 作为缩进&#xff0c;不要使用制表符&#xff08;Tab&#xff09;。 def example():if True:print(&quo…

虾皮Shopee大数据面试题及参考答案

Cube 表性能优化,还有其他优化的方法吗? Cube 表性能优化可以从多个方面入手。 一方面,可以优化数据存储格式。选择合适的存储格式能够减少存储空间占用,提高数据读取速度。例如,Parquet 格式是一种高效的列式存储格式,它可以按列进行数据压缩,大大减少磁盘 I/O 和内存占…

Linux和指令初识

前言 Linux是我们在服务器中常用的操作系统&#xff0c;我们有必要对这个操作系统有足够的认识&#xff0c;并且能够使相关的指令操作。今天我们就来简单的认识一下这个操作的前世今生&#xff0c;并且介绍一些基础的指令操作 Linux的前世今生 要说Linux&#xff0c;还得从U…

Spring Boot中常用的JSR 380参数校验注解

NotNull: 验证对象值不应为 null。 AssertTrue: 验证布尔值是否为 true。 AssertFalse: 验证布尔值是否为 false。 Min(value): 验证数字是否不小于指定的最小值。 Max(value): 验证数字是否不大于指定的最大值。 DecimalMin(value): 验证数字值&#xff08;可以是浮点数&#…