【C语言】—— 文件操作(上)

【C语言】—— 文件操作(上)

  • 一、 为什么使用文件
  • 二、 什么是文件
    • 2.1、 程序文件
    • 2.2、 数据文件
    • 2.3、 文件名
    • 2.4、二进制文件与文本文件
  • 三、 文件的打开和关闭
    • 3.1、流和标准流
      • (1)流
      • (2)标准流
    • 3.2、文件指针
  • 四、文件的打开和关闭

一、 为什么使用文件

  我们为什么要使用文件呢?回答这个问题之前,我们先来看一段代码:

#include<stdio.h>int main()
{int n = 0;scanf("%d", &n);printf("%d\n", n);return 0;
}

  这段代码创建了一个变量 n n n,当程序运行时,我们输入一个值(比如说 10 )存在变量 n n n 中,当我们下一次运行程序时,这个10 不见了,它的值又恢复到 0,我们又得重新输入一个值。

  原来,像 n n n 这样的变量是在内存里创建的,当程序结束时,刚刚申请的 4 个字节又还给了操作系统,当程序再次运行时, n n n中的值依然是 0

  因此,如果将数据存在内存中,当程序结束,下次再运行时,这个值就不见了,它无法持久化地保存起来

  怎么办呢?

  这时我们想,如果我们在电脑上创建了一个文件,文件中存这一个 10。这个文件是放在硬盘上的(比如C盘、E盘)。这即使把电脑关机,下次打开里面依然存的是 10。

  这是因为,当我们把数据放在文件中,即硬盘上时,这些数据持久化地保存下来。而相对的,放在内存中数据只要程序退出,数据就丢失

  因此当我们想把数据持久化地保存下来时,就需要文件

  

二、 什么是文件

  硬盘(磁盘)上的文件就是文件
  但是在程序设计中,我们一般谈的文件有两种:程序文件数据文件(从文件功能的角度分类)
  

2.1、 程序文件

  所谓的程序文件就是我们写出来的代码,程序文件包括源程序文件(后缀文 . c .c .c),目标文件 w i n d o w s windows windows 环境后缀为 . o b j .obj .obj),可执行程序 w i n d o w s windows windows环境后缀为 . e x e .exe .exe

在这里插入图片描述

  

2.2、 数据文件

  什么是数据文件呢?当我们写程序,从某一个文件中读取数据;或者把一些数据写到文件中,这种文件就称为数据文件

  本章我们讨论的内容主要是数据文件

  在之前的学习中,我们所处理的输入输出都是以终端为对象的,即:从终端的键盘输入数据,运行结果显示到显示器(屏幕)上。

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

2.3、 文件名

  一个文件要有唯一标识,以便用户识别和引用
  文件名包含 3 部分:文件路径+文件名主干+文件后缀

  如:c:\code\test.txt

  • c:\code\ 为文件路径
  • t e s t test test 为文件名主干
  • t x t txt txt 为文件后缀

  

2.4、二进制文件与文本文件

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

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

  前面曾提到的 . o b j .obj .obj文件就是一种 二进制文件,通过文本编辑器打开是一堆乱码,我们是看不懂的

在这里插入图片描述

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

在这里插入图片描述

  
  那么一个数据在文件中是如何存储的呢?
  字符一律以 A S C I I ASCII ASCII形式存储,数值型数据及可以用 A S C I I ASCII ASCII形式存储,也可以使用二进制形式存储。

  什么意思呢?假设现在有一个整数 10000:
  如果以 A S C I I ASCII ASCII 码的形式存储,则磁盘中占用 5 个字节(一个字符一个字节):一个字符 ‘1’,四个字符 ‘0’
  如果以二进制的形式存储,磁盘上只占4个字节(一个整型)
  

在这里插入图片描述

  而以 A S C I I ASCII ASCII形式存储则为文本文件;以二进制形式存储则为二进制文件
  
测试代码:

#include<stdio.h>int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf = NULL;return 0;
}

  这段代码可能有些看不懂,但是没关系,我们只需知道其大致意思即可:这段代码就是将 10000 以二进制的形式写到文件中

  执行程序后,我们直接打开文件:

在这里插入图片描述

  
  我们再通过二进制的形式打开文件

在这里插入图片描述

VS上打开二进制文件的方法

在这里插入图片描述

10000 在二进制文件中


  那 10 和 27 又是什么意思呢?其实就是 0001 0000 和 0010 0111 的十六进制表示,同时,因为是小端字节序存储,因此存储时反过来的。
  

三、 文件的打开和关闭

3.1、流和标准流

(1)流

  我们程序的数据要输出到各种外部设备(屏幕、硬盘、U盘、网络上),也需要从外部设备(键盘、文件、网络上、U盘)获取数据,不同的外部设备的输入输出的操作各不相同,为了方便程序员对各种设备进行方便操作,我们抽象出 的概念,我们可以把流想象成流淌着数据的河

  没有流,程序员就要学会如何从各种不同的设备上输入输出数据,而有了流,程序员只需知道如何将数据从流中取出和写入流即可,至于流如何与外部设备之间进行交流,我们并不关心,这是C语言底层和操作系统要关系的事情。这样大大简化了程序员学习编程的难度

  C程序针对文件、画面、键盘等的数据输入输出操作都是通过操作的。

  一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作

  进行文件操作,打开文件其实就是打开流,然后再对流进行读写

(2)标准流

  那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
  那是因为C语言程序在启动的时候,默认打开了 3 个流

  • stdin(标准输入流):在大多数的环境中从键盘输入 s c a n f scanf scanf 函数就是从标准输入流中读取数据。
  • stdout(标准输出流):大多数的环境中输出至显示器界面 p r i n t f printf printf函数就是将信息输出到标准输出流中。
  • stderr(标准错误流):大多数环境中输出到显示器界面

  这是默认打开了的三个流,我们使用 s c a n f scanf scanf p r i n t f printf printf 等函数就可以直接进行输入输出操作的。

   s t d i n stdin stdin s t d o u t stdout stdout s t d e r r stderr stderr 三个流的类型是: F I L E FILE FILE* ,通常称为文件指针

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

  

3.2、文件指针

  在缓冲文件系统中,关键的概念是“文件类型指针”,简称 文件指针
  
  每一个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存储文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名 F I L E FILE FILE
  
  例如在VS2013编译器环境提供的 s t d i o . h stdio.h stdio.h 头文件中有以下的文件类型声明:

struct _iobuf {char* _ptr;int _cnt;char* _base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;};typedef struct _iobuf FILE;

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

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

  一般都是通过一个 F I L E FILE FILE 指针来维护这个FILE结构的变量,这样使用起来更加方便。

  下面我们可以创建一个 F I L E FILE FILE *的指针变量
  

FILE* pf;

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

在这里插入图片描述

  

四、文件的打开和关闭

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

  在编写程序的时候,在打开文件的同时,都会返回一个 FILE* 指针变量指向该文件,也相当于建立了指针和文件的关系。

   A N S I ANSI ANSI C C C规定使用 f o p e n fopen fopen函数来打开文件, f c l o s e fclose fclose函数来关闭文件。

在这里插入图片描述

f o p e n fopen fopen 函数(打开文件)

  • 如果文件打开成功,返回一个FILE* 指针,打开失败则返回空指针
  • f i l e n a m e filename filename 表示要打开的文件名,其应符合文件的命名规范,可以包含文件路径
  • m o d e mode mode 表示文件的打开模式,下面都是文件的打开模式
文件使用方式含义如果指定文件不存在
“r” (只读)为了输入数据,打开一个已经存在的文本文件出错
“w” (只写)为了输入输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据建立一个新的文件
“r+”(读写)为了读和写,打开一个新的文件出错
“w+”(读写)为了读和写,创建一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新文件
“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,创建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个未禁止文件,在文件尾进行读和写建立一个新的文件

  注:“ w w w”(只写)会将原文件的内容全部清空,再从第一位开始写入数据;“a”(追加) 是从文件末尾开始追加
  

在这里插入图片描述

f c l o s e fclose fclose 函数(关闭文件)

  使用 f c l o s e fclose fclose 函数将文件关闭后,要将该文件指针置空(如 f r e e free free 函数一样)
  
  
  可能有些小伙伴对输入输出的关系还有些糊涂,我们可以来看下面一张图

在这里插入图片描述

  其实,究竟是输入还是输出,应该站在程序的角度分析程序从外界获取数据,是输入;程序向外输出数据,是输出。

  
下面,我们先来尝试打开和关闭一个文件

#include<stdio.h>int main()
{FILE* pf = NULL;//打开文件pf = fopen("test.txt", "r");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//读文件//关闭文件fclose(pf);pf = NULL;
}
  • 前面曾提到,文件打开失败时, f o p e n fopen fopen 函数会返回一个空指针,因此使用 f o p e n fopen fopen 函数打开一个文件,要对其返回值进行判断
  • r e t u r n return return 1 :表示的是程序异常,提前结束程序,正常结束时返回0
  • 使用 f c l o s e fclose fclose 函数将文件关闭,别忘了将指针置空,如同 f r e e free free函数一样。
      
      
    未完待续······

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

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

相关文章

64.函数参数和指针变量

目录 一.函数参数 二.函数参数和指针变量 三.视频教程 一.函数参数 函数定义格式&#xff1a; 类型名 函数名(函数参数1,函数参数2...) {代码段 } 如&#xff1a; int sum(int x&#xff0c;int y) {return xy; } 函数参数的类型可以是普通类型&#xff0c;也可以是指针类…

Python可实现各种算法库之algorithms使用详解

概要 在软件开发和计算机科学领域,算法是解决问题的核心工具。Python 作为一种广泛使用的编程语言,提供了多种内置和第三方库来实现各种算法。algorithms 库是一个集合了多种常用算法和数据结构的 Python 库,旨在帮助开发者快速实现和应用这些算法。本文将详细介绍 algorit…

Ollama基于Casaos一键部署,并接入Dify知识库,无需再为API付费

什么是Ollama Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速的运行大模型。浪浪云将它做为一键部署通过简单的安装&#xff0c;用户可以执行一条命令就可以运行开源大型语言模型&#xff0c;如 llama3 ,通以千问。极大地简化了部署和管理LLM的过程&#x…

modelscope可控细节的长文档摘要

modelscope可控细节的长文档摘要尝试 本文的想法来自今年OpenAI cookbook的一篇实践&#xff1a;summarizing_long_documents&#xff0c;目标是演示如何以可控的细节程度总结大型文档。 如果我们想让大语言模型总结一份长文档&#xff08;例如 10k 或更多tokens&#xff09;&…

6个步骤实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击…

Proteus-51单片机-DS18B20多点测温

DS18B20多点测温 一、Proteus仿真演示 每个DS18B20都有一个唯一的64位序列号,这使得在同一总线上可以挂载多个传感器,无需额外的地址分配。主机(通常为单片机)通过特定的时序控制,可以依次读取各个DS18B20的温度数据,实现分布式测温。 二、代码特点 三、开发环境介绍 本…

基于Arduino平台开源小车的初步使用体验

创作原因&#xff1a;偶然有机会接触到基于Arduino平台的开源智能小车&#xff0c;初步使用后与大家分享。因使用时间不常&#xff0c;可以纯当个乐子看看&#xff0c;感谢大家的阅读&#xff01; 图&#xff1a;一款基于Arduino平台的开源小车 一、开发环境 Misly&#xff1…

shark云原生-日志体系-filebeat高级配置(适用于生产)

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自动发现支持的 **hints**的完整列表&…

windows搭建mqtt服务器,并配置DTU收集传感器数据

1.下载并安装emqx服务器 参考&#xff1a;Windows系统下本地MQTT服务器搭建&#xff08;保姆级教程&#xff09;_mqtt windows-CSDN博客 这里我下载的是emqx-5.3.0-windows-amd64.zip版本 下载好之后&#xff0c;放到服务器的路径&#xff0c;我这里放的地方是&#xff1a;C…

脑启发设计:人工智能的进化之路

编者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指与食指拿起一件物品么&#xff1f; 试完你是不是发现自己竟然可以毫不费力地用自己不常用的手中&#xff0c;两根使用频率相对较低的手指&#xff0c;做一个不常做的动作。这就是人类大脑不可思议…

py黑帽子学习笔记_burp

配置burp kali虚机默认装好了社区版burp和java&#xff0c;其他os需要手动装 burp是用java&#xff0c;还得下载一个jython包&#xff0c;供burp用 配apt国内源&#xff0c;然后apt install jython --download-only&#xff0c;会只下载包而不安装&#xff0c;下载的目录搜一…

9.x86游戏实战-汇编指令mov

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

STM32智能农业监控系统教程

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能农业监控系统利用STM32嵌…

PCL从理解到应用【02】PCL环境安装 | PCL测试| Linux系统

前言 本文介绍在Ubuntu18.04系统中&#xff0c;如何安装PCL。 源码安装方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安装好后&#xff0c;可以看到pcl的库&#xff0c;在/usr/lib/中&#xff1b; 通过编写C代码&#xff0c;直接调用…

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […

【UE5.3】笔记7 控制Pawn移动

使用A、D键控制角色左右移动 打开我们的BP_Player蓝图类&#xff0c;选择事件图表&#xff0c;添加我们的控制事件 右键&#xff0c;搜索A keyboard&#xff0c;选择A,如下图&#xff0c;D也是 添加扭矩力 首先我们要把我们的player上的模拟物理选项打开&#xff0c;这样我们…

JavaFx基础知识

1.Stage 舞台 如此这样的一个框框&#xff0c;舞台只是这个框框&#xff0c;并不管里面的内容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…

【不锈钢酸退作业区退火炉用高温辐射计快速安装】

项目名称 不锈钢酸退作业区退火炉用高温辐射计快速安装 改造实施项目简介项目提出前状况:不锈钢生产过程中,各种型号的不锈钢带钢在退火工艺中对带钢温度的准确性要求很高,带钢温度的检测直接影响带钢的产品质量,不锈钢带钢温度测量依靠的是高温辐射计,其测量的准确性、稳…

【Python机器学习】算法链与管道——通用的管道接口

Pipeline类补单可以用于预处理和分类&#xff0c;实际上还可以将任意数量的估计器连接在一起。例如&#xff0c;我们可以构建一个包含特征提取、特征选择、缩放和分类的管道&#xff0c;总共有4个步骤。同样的&#xff0c;最后一步可以用聚类或回归代替。 对于管道中估计器的唯…

vue2使用use注册自定义指令实现权限控制

版本环境 vue的版本是^2.6.12&#xff0c;将会使用到Vue.use()、Vue.directive() 适用环境 页面某些按钮&#xff0c;需要受到当前登录用户的“角色”“权限”的影响&#xff0c;通过store获取角色role和权限permission&#xff0c;通过自定义指令的方式&#xff0c;控制某一…