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.rhkb.cn/news/440591.html

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

相关文章

四.网络层(上)

目录 4.1网络层功能概述 4.2 SDN基本概念 4.3 路由算法与路由协议 4.3.1什么是路由协议&#xff1f; 4.3.2什么是路由算法&#xff1f; 4.3.3路由算法分类 (1)静态路由算法 (2)动态路由算法 ①全局性 OSPF协议与链路状态算法 ②分散性 RIP协议与距离向量算法 4.3.…

Python手绘五星红旗,庆75周年

环境 pip install matplotlib pip install numpy 代码 import matplotlib.pyplot as plt import numpy as np# 中国国旗的标准尺寸比例是 3:2 width, height 300, 200 # 这里可以调整为任何满足3:2比例的尺寸# 创建一个新图形 fig, ax plt.subplots(figsize(width/100, h…

快速熟悉Nginx

一、Nginx是什么&#xff1f; ‌Nginx是一款高性能、轻量级的Web服务器和反向代理服务器。‌ ‌特点‌&#xff1a;Nginx采用事件驱动的异步非阻塞处理框架&#xff0c;内存占用少&#xff0c;并发能力强&#xff0c;资源消耗低。‌功能‌&#xff1a;Nginx主要用作静态文件服…

JS 介绍/书写位置/输入输出语法

目录 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS 的组成 2. JS 书写位置 2.1 内部 JS 2.2 外部 JS 2.3 内联 JS 3. JS 注释和结束符 4. JS 输入输出语法 4.1 输入语法 4.2 输入语句 4.3 执行顺序 5. 字面量 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS …

网 络 安 全

网络安全是指保护网络系统及其所存储或传输的数据免遭未经授权访问、使用、揭露、破坏、修改或破坏的实践和技术措施。网络安全涉及多个方面&#xff0c;包括但不限于以下几个方面&#xff1a; 1. 数据保护&#xff1a;确保数据在传输和存储过程中的完整性和保密性&#xff0c;…

Python3 爬虫 中间人爬虫

中间人&#xff08;Man-in-the-Middle&#xff0c;MITM&#xff09;攻击是指攻击者与通信的两端分别创建独立的联系&#xff0c;并交换其所收到的数据&#xff0c;使通信的两端认为其正在通过一个私密的连接与对方直接对话&#xff0c;但事实上整个会话都被攻击者完全控制。在中…

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载 iPhone 镜像、Safari 浏览器重大更新和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia/ 查看最新版。原创作品&#xff0c;转载请保留…

vsomeip用到的socket

概述&#xff1a; ​ vsomeip用到的socket的代码全部都在implementation\endpoints目录下面&#xff0c;主要分布在下面六个endpoint类中&#xff1a; local_client_endpoint_impl // 本地客户端socket&#xff08;UDS Socket或者127.0.0.1的socket&#xff09;local_server…

解决ros2 rviz Fixed Frame No TF data问题

新建一个终端&#xff0c;然后输入 &#xff1a;map后的数字可以任意&#xff0c;100也可以。注意map与框架名称一致。 rosrun tf2_ros static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 map 5

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识

关卡任务 闯关任务需要在关键步骤中截图&#xff1a; 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别&#xff0c;尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令&#xff1a; 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

html中的文本标签(含标签的实现案例)

目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font ​编辑7.文本格式化标签 8.文本语义标签 1&#xff09;时间time标签 2&#xff09;文本高亮Mark标签 3&#xff09;cite标签 9.特殊字符标签 10.图像标签img 附录&#xff…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…

【Python】Python知识总结浅析

Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年首次发布。它以简洁的语法和强大的功能著称&#xff0c;适用于多种应用场景&#xff0c;包括Web开发、数据分析、人工智能、自动化脚本等。 易于学习和使用&#xff1a;Python的语法简洁明了&#xff0c;适合初…

【Windows】在任务管理器中隐藏进程

在此前的一篇&#xff0c;我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身&#xff0c;实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码&#xff1a; // dllmain.cpp : 定义 …

RabbitMQ篇(基本介绍)

目录 一、简介 二、作用 三、AMQP协议 1. 简介 2. 核心概念 四、工作原理 五、工作模式 1. 普通模式 2. Worker模式 3. PubSub模式 4. Rounting模式 5. Topic模式 6. RPC模式 7. Publisher Confirms模式 六、基本结构 七、常见五个角色 一、简介 RabbitMQ 是一…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统&#xff1a;特点可发红包&#xff0c;可添加多条链接到用户网站和应用&#xff0c;安卓苹果APPPC端H5四合一 后端开发语言&#xff1a;PHP&#xff0c; 前端开发语言&#xff1a;uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法&#xff1a;用模型对训练数据标签进行拟合&#xff0c;拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击&#xff08;…

旋转花键高效运行关键之一

旋转花键是一种广泛应用于机械设备中的重要部件&#xff0c;具有传递扭矩、承受载荷和维持运动精度等功能&#xff0c;而旋转花键润滑脂则是确保其正常运作的关键因素之一。事实上&#xff0c;旋转花键润滑油的选择是一个综合性的过程&#xff0c;需要考虑多个因素以确保设备的…

图解Linux文件属性与目录配置

Linux的文件属性十分重要&#xff0c;与windows的文件属性有很大不同&#xff0c;Linux的文件增加了许多属性&#xff0c;如读写、连接数、文件拥有者及所属群组。如果一个文件属于一个群组&#xff0c;那么这个群组的成员就可以访问&#xff0c;其他的群组就不能访问&#xff…