C语言之文件操作(上)

C语言之文件操作(上)

文章目录

  • C语言之文件操作(上)
    • 1. 什么是⽂件?
      • 1.1 程序⽂件
      • 1.2 数据⽂件
      • 1.3 ⽂件名
    • 2. ⼆进制⽂件和⽂本⽂件
    • 3. ⽂件的打开和关闭
      • 3.1 流和标准流
        • 3.1.1 流
        • 3.1.2 标准流
    • 4. ⽂件指针
    • 5. 文件的打开与关闭

1. 什么是⽂件?

  磁盘上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)

1.1 程序⽂件

  程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)

1.2 数据⽂件

  ⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件

1.3 ⽂件名

  ⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

例如: c:\code\test.txt

为了⽅便起⻅,⽂件标识常被称为⽂件名

2. ⼆进制⽂件和⽂本⽂件

数据⽂件又被称为⽂本⽂件或者⼆进制⽂件

  1. 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件
  2. 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件

字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储

例如:10000如果以ASCII形式存储,则磁盘占5个字节(一个字符为1个字节),而以二进制形式存储,则磁盘占4个字节(一个整型)
在这里插入图片描述

ASCII形式存储:将每个字符转为对应的ASCII值,在将对应ASCII值转为二进制
二进制形式存储:将值转为二进制形式

3. ⽂件的打开和关闭

3.1 流和标准流

3.1.1 流

  在输入/输出数据的时候会输入/输出到不同的设备中,不同设备的输入/输出是以不同的方式的,为了方便程序员的操作,我们抽象出了流的概念,我们可以把流想象成流淌字符的河流

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

3.1.2 标准流

C语言在程序启动时,默认开打了三种流:
stdin — 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据

stdout — 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中

stderr — 标准错误流,⼤多数环境中输出到显⽰器界⾯

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

stdinstdoutstderr三个流的类型是: FILE*,通常称为⽂件指针。
C语⾔中,就是通过FILE* 的⽂件指针来维护流的各种操作的

4. ⽂件指针

  缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名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结构的变量,并填充其中的信息,使⽤者不必关⼼细节

5. 文件的打开与关闭

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

ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

filename为文件的路径
mode为打开方式(只读,只写,…)
stream 为文件指针

mode模式有以下几种:

在这里插入图片描述

注意:

  1. 当任意读取文件的方式读取不存在的文件时,将会报错
  2. 打开文件也是有返回值的,当打开失败会返回一个NULL指针,所以最好对返回值进行判断
  3. 和动态内存管理相似,开辟空间需要free释放,同理打开文件也需要关闭文件fclose,并且将文件指针置NULL
    示例:
#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt","r");//只读方式打开文件
	fclose(pf);//关闭文件
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是连接池?如何确认连接池的大小?

对于我们编写的几乎每个网络或移动应用程序来说&#xff0c;其底层的关键组件之一就是数据库。对于编写使用数据库且高性能且资源高效的应用程序&#xff0c;必须处理一项关键资源&#xff0c;但与 CPU、内存等不同&#xff0c;它通常不是很明显。该资源是数据库连接。 什么是…

调用Win10隐藏的语音包

起因 在做一个文本转语音的Demo的时候&#xff0c;遇到了语音包无法正确被Unity识别的问题。明明电脑上安装了语音包但是代码就是识别不出来 原因 具体也不是非常清楚&#xff0c;但是如果语言包是在的话&#xff0c;大概率是Win10系统隐藏了。 确定语言包 首先查看%windi…

VLAN详细学习

文章目录 VLAN概念VLAN种类端口VLAN工作原理以太网的三种链路类型配置 VLAN概念 一种讲局域网设备从逻辑上划分为一个个网段&#xff0c;从而实现虚拟网络的一种技术&#xff0c;这一技术主要应用于交换机中。Vlan技术是技术在以太网帧的基础上增加vlan头&#xff0c;用VLAN I…

云计算大屏,可视化云计算分析平台(云实时数据大屏PSD源文件)

大屏组件可以让UI设计师的工作更加便捷&#xff0c;使其更高效快速的完成设计任务。现分享可视化云分析系统、可视化云计算分析平台、云实时数据大屏的大屏Photoshop源文件&#xff0c;开箱即用&#xff01; 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#…

代码随想录算法训练营第50天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

JAVA代码编写 123.买卖股票的最佳时机III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意&#xff1a;**你不能同时参与多笔交易&#xff08;你必须在再次购买前出…

记录 | ubuntu上安装fzf

在 ubuntu 上采用命令行安装 fzf 的方式行不通 指的是采用下面的方式行不通&#xff1a; sudo apt install fzf # 行不通 sudo snap install fzf --classic # 行不通正确的安装方式是&#xff1a; ● 到 fzf 的 git 仓库&#xff1a;https://github.com/junegunn/fzf/re…

aardio网页组件:webPageOperation

webPageOperation是webview的初步封装&#xff0c;用来网页填表、操作网页。可操作web.form、web.view、web.view2等浏览器组件。 使用方法 首先把webPageOperation.aardio&#xff08;源码在后面&#xff09;放到~\lib\godking目录下&#xff0c;然后新建窗口项目&#xff…

Leetcode—10.正则表达式匹配【困难】

2023每日刷题&#xff08;五十八&#xff09; Leetcode—10.正则表达式匹配 算法思想 参考题解 实现代码 class Solution { public:bool isMatch(string s, string p) {int m s.size(), n p.size();vector<vector<bool>> dp(m 1, vector<bool>(n …

基于单片机智能循迹小车仿真设计

**单片机设计介绍&#xff0c;基于单片机智能循迹小车仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能循迹小车是一种通过传感器检测地面情况&#xff0c;并根据设定的规则进行动作控制的机器人。它使用…

信号量机制及信号量实现进程同步、互斥、前驱关系

进程互斥的四种软件实现万式&#xff08;单标志法、双标志先检查、双标志后检查、Peterson算法)进程互斥的三种硬件实现方式&#xff08;中断屏蔽方法、TS/TSL指令、Swap/XCHG指令&#xff09; 1.在双标志先检查法中&#xff0c;进入区的“检查”、“上锁”操作无法一气呵成&am…

性能测试、负载测试、压力测试之间的差异!

1、什么是性能测试 性能测试是一种用于确定计算机、网络或设备速度的测试。它通过在不同的负载场景中传递不同的参数来检查系统组件的性能。 2、什么是负载测试 负载测试是在任何应用程序或网站上模拟实际用户负载的过程。它检查应用程序在正常和高负载期间的行为。当开发项目…

CAN 三: STM32 CAN相关寄存器介绍

1、寄存器列表&#xff08;F1/F4/F7&#xff09; 寄存器名称作用CAN_MCRCAN主控制寄存器主要负责CAN工作模式的配置CAN_BTR位时序寄存器用来设置分频/TBS1/TBS2/TSWJ等参数&#xff0c;设置测试模式CAN_(T/R)IxR标识符寄存器存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR位C…

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

ZXing生成二维码

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 1.介绍 Android Zxing框架 生成二维码扫码功能;ZXing是一个开源的类库&#xff0c;是用Java编写的多格式的1D / 2D条码图像处理库&#xff0c;使用ZXing可以生成、识别QR Code(…

Servlet 的初步学习

前言 咱们最核心的目标是基于tomcat编程, 做出网站来 ~~ 基于tomcat进行网站后端的开发. 网站后端, http服务器,肯定是需要针对http 协议进行一系列操作的. 幸运的是, tomcat,已经把这些http相关的底层操作,封装好了只需要调用tomcat给咱们提供的api即可 Servlet 是什么 Servl…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc &#xff0c; --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre&#xff0c;为了减少磁盘占用&#xff0c;选择jre版本基础镜像 在宿主机创建文件夹iot&#xff0c;并把所需…

opencv 十五 红外图像中虹膜的提取

一、算法需求 在医疗检测中&#xff0c;需要使用红外相机拍摄眼睛照片&#xff0c;然后提取出虹膜的区域。在拍摄过程瞳孔需要进行运动&#xff0c;其通常不在正前方&#xff0c;无法形成圆形&#xff0c;不能使用常规的霍夫圆检测进行提取定位。且在在红外图像中&#xff0c;…

Java 语言关键字

Java关键字是电脑语言里事先定义的&#xff0c;有特别意义的标识符&#xff0c;有时又叫保留字&#xff0c;还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量…

鸿蒙OS应用开发者高级认证题库

一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09; 在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴…