当前位置: 首页 > news >正文

30.0、C语言——文件操作 (1)

30.0、C语言——文件操作 (1)

什么是文件:

        1. 磁盘上的文件是文件;
        2. 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件;

程序文件:

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

数据文件:

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

本章讨论的是数据文件:

        1. 在以前各章所处理数据的输入输出都是以终端为对象,即从终端的键盘输入数据,运行结果显示到显示器上;

        2. 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件; 

文件名:

        1. 一个文件要有一个文件表示,以便用户识别和引用;

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

        3. 例如: c : \ code \ test .txt

        4. 为了方便起见,文件表示通常被称为文件名

文件类型:

        1. 根据数据的组织形式,数据文件被称为文本文件【文本文件内容是我们都能看懂的字符】或者二进制文件【二进制文件内容是一些随机值、乱码我们看不懂】

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

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

一个数据在内存中是怎么存储的呢?

        1. 字符一律以 ASCII 形式存储,数值型数据既可以用 ASCII 形式存储,也可以使用二进制形式存储;

        2. 如有整数 10000 ,如果以 ASCII 码的形式输出到磁盘,则磁盘中占用 5 个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占 4 个字节(vs2013测试);如下图所示->

 以代码的形式测试一下 ->

int main() {
	int a = 10000;
	FILE* pf = fopen("test.txt","wb");//这里wb的意思就是以二进制的形式写该文件
	fwrite(&a,4,1,pf);//将&a写进去,写4个字节,1个这样的四个字节的数据,,放到 pf指针 维护的这个文件里面去,二进制的形式写到文件中
	fclose(pf);//写完之后关闭这个文件
	pf = NULL;
	return 0;
}

文件缓冲区:

        ANSIC 标准采用 “缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

        从内存向磁盘输出数据会先送到内存中的缓冲区;装满缓冲区后才一起送到磁盘上;

        如果从磁盘向计算读入数据,则从磁盘文件读取输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区 ( 程序变量等 );

        缓冲区的大小根据 C 编译系统决定的;

给大家举个实例:

int main() {
    whlie(1) {
        sleep(1);
        printf("hehe");
    }
    return 0;
}

        在linux中上述这段代码按道理来说运行之后应该是每过1秒就打印一个呵呵,但是我们运行后发现过了一秒什么都没有打印,这是因为程序文件 printf() 和屏幕之间还有一个东西就是输出缓冲区,这个缓冲区要等printf() 充满了之后才会一次性输出;

文件指针:

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

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

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

        1. 那么不同的C编译器的 FILE 类型包含的内容不完全相同,但是大同小异;

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

        3. 一般都是通过一个 FILE 的指针来维护这个 FILE 结构的变量,这样使用起来更加方便;

下面我们可以创建一个 FILE* 的指针变量:

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

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

相关文章:

  • 物联网感知安全——你了解多少?
  • Linux【编写一个简单的shell】
  • Python入门到进阶——流程控制
  • 基于Docker的开源端到端开发者平台
  • Chapter2.2:控制系统的数学模型
  • 前端关于cookie那些事儿
  • git——仓库合并不丢失git记录
  • 【云原生】MySQL on k8s 环境部署
  • Jetpack ViewModel源码分析
  • 数字逻辑第二章笔记
  • 从开发角度看羊了个羊
  • 我用PaddleOCR把Halcon论坛的OCR帖子试了一遍,结果。。。
  • 微信号怎么改
  • Spring集成Apache Kafka教程
  • 基于SSM实现图书馆座位预约系统
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • download使用浅析
  • ECS应用管理最佳实践
  • ES6 学习笔记(一)let,const和解构赋值
  • javascript 哈希表
  • laravel 用artisan创建自己的模板
  • 程序员最讨厌的9句话,你可有补充?
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 7行Python代码的人脸识别
  • ​configparser --- 配置文件解析器​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (5)STL算法之复制
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Oracle)SQL优化技巧(一):分页查询
  • (力扣)1314.矩阵区域和
  • (四)汇编语言——简单程序
  • *** 2003
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 反射的使用
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET分布式缓存Memcached从入门到实战
  • @angular/cli项目构建--Dynamic.Form
  • @angular/cli项目构建--http(2)
  • @private @protected @public
  • @vue/cli 3.x+引入jQuery
  • [ JavaScript ] JSON方法
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [dart学习]第四篇:函数
  • [docker]docker网络-直接路由模式
  • [Electron]ipcMain.on和ipcMain.handle的区别