简述C语言文件操作

news2024/9/29 5:35:43

🌈 个人主页:白子寰
🔥 分类专栏:魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分79+),分享更多关于深度学习、C/C++领域的优质内容!(希望得到您的关注~)

 

目录

为什么要使用文件?

文件 

 程序文件

 数据文件

文本文件

二进制文件

 文件名

⽂件的打开和关闭

流和标准流

一图 KO 流 概念

 标准流

文件指针 

 文件的打开和关闭

文件的打开模式

文件的顺序读写

文件顺序读写函数

函数原型

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

fputc 

文件的随机读写

fseek

ftell

rewind 


为什么要使用文件?

要将数据持久化保存


文件 

文件功能分类,文件分为两种:

程序文件数据文件 

 程序文件

后缀名为①.c  ②.obj  ③.exe

 数据文件

文件的内容不一定是程序,而是程序运行读写的数据

如:程序运行时要从中读取数据文件内容/输出内容文件

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

文本文件

数据在内存中以二进制形式储存,不加转换输出到外存

二进制文件

数据在外存以ASCII码形式存储,在存储前转换(以ASCII字符的形式存储的文件)

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

在下面👇 “文件的打开和关闭” 讲到


 文件名

文件名包含三部分:

文件路径 + 文件名主干 + 文件后缀

 


 

⽂件的打开和关闭

流和标准流

一图 KO 流 概念

 标准流

C语⾔程序在启动的时候,默认打开了3个流:

stdin-标准输入流,在大多数的环境中从键盘输⼊,

scanf函数就是从标准输入流中读取数据。

stdout-标准输出流,大多数的环境中输出至显示器界面,

printf函数就是将信息输出到标准输出流中。

stderr-标准错误流,大多数环境中输出到显示器界面。

 


文件指针 

运行程序时,默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进行输入输出操作的。

stdin、stdout、stderr 三个流的类型是: C语⾔中,就是通过 FILE* ,通常称为文件指针

FILE* 的⽂件指针来维护流的各种操作的。

该结构体类型是由系统声明的,取名FILE. 

通过文件指针变量能够间接找到与它关联的文件

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

 

 文件的打开和关闭

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

 

mode打开方式 

文件的打开模式

文件使用方式含义如果指定文件不存在
"r"(只读)为了输入数据,打开一个已经存在的文本文件出错
"w"(只写)为了输出数据,打开一个文本文件建立一个新的文件
"a"(追加)向文本文件尾添加数据建立一个新的文件


 

函数使用

#include<stdio.h>

int main()
{
	//文件指针变量读写文件
	// 当前文件位置
	//FILE* pf = fopen("data.txt", "w");

	//当前文件位置
	FILE* pf = fopen("./data.txt", "w");


	//当前文件的上一级位置
	//FILE* pf = fopen("./../data.txt", "w");

	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

文件的顺序读写

文件顺序读写函数

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输入函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

函数原型


 

回到上面的 “二进制文本” 提到的问题

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

int main()
{
	int a = 100;

	//文件指针变量打开文件
	FILE* pf = fopen("Data.txt", "wb");

	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//以二进制方式写入文件
	fwrite(&a, 4, 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

 内存中以二进制显示:


 

用的比较多的是fputc

fputc 

函数使用 

int main()
{
	//文件指针打开文件
	FILE* pf = fopen("Data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//输入数据读写文件:26个字母
	//int i = 0;
	//for (i = 0; i < 26; i++)
	//{
	//	fputc('a' + i, pf);
	//	fputc('\n', pf);
	//}
	
	//控制台输出stdout
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i, stdout);
		fputc('\n', stdout);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

文件的随机读写

fseek

函数介绍

函数使用

int main()
{
	//文件指针打开文件
	FILE* pf = fopen("Data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读写文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	fseek(pf, 3, SEEK_SET);
	ch = fgetc(pf);
	printf("%c\n", ch);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

控制台显示

 


ftell

函数介绍

int main()
{
	//文件指针打开文件
	FILE* pf = fopen("Data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读写文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	int n = ftell(pf);
	printf("%d\n", n);


	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

 控制台显示


 

rewind 

函数介绍

作用:返回文件起始位置(文件开头)

函数使用

int main()
{
	//文件指针打开文件
	FILE* pf = fopen("Data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读写文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	rewind(pf);

	ch = fgetc(pf);
	printf("%c\n", ch);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

控制台输出


 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“关关难过关关过,前路漫漫亦灿灿”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走把。

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

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

相关文章

java-基于springboot+vue实现的旅游信息管理系统功能介绍

开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

深入探索JDK动态代理:从入门到原理的全面解析

文章目录 基本概念入门案例实现JDK动态代理的步骤入门实操拓展--动态生成代理类的几种方法方式一&#xff1a;通过getProxyClass方法获取代理实例方式二&#xff1a;通过newProxyInstance方法获取代理实例&#xff08;常用&#xff01;&#xff09;方式三&#xff1a;通过Lambd…

二十三 超级数据查看器 讲解稿 设置

二十三 超级数据查看器 讲解稿 设置 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;这节课我们讲一下&#xff0c;超级数据查看器的设置功能。 首先&#xff0c;我们打开超级数据查看器&#xff0c; 我…

AcWing 796. 子矩阵的和

这个题的重点是仿照一维的数组&#xff0c;所以a[N][N]也是从1索引开始的。画个图举个例子就非常清晰了 之所以不好理解是因为没画格子&#xff0c;一个格子代表一个点&#xff0c;就很好理解了。 java代码&#xff1a; import java.io.*; public class Main{static int N 1…

Java二阶知识点总结(七)SVN和Git

SVN 1、SVN和Git的区别 SVN是集中式的&#xff0c;也就是会有一个服务器保存所有代码&#xff0c;拉取代码的时候只能从这个服务器上拉取&#xff1b;Git是分布式的&#xff0c;也就是说每个人都保存有所有代码&#xff0c;如果要获取代码&#xff0c;可以从其他人手上获取SV…

使用 STL 容器发生异常的常见原因分析与总结

目录 1、概述 2、使用STL列表中的元素越界 3、遍历STL列表删除元素时对迭代器自加处理有问题引发越界 4、更隐蔽的遍历STL列表删除元素时引发越界的场景 5、多线程同时操作STL列表时没有加锁导致冲突 6、对包含STL列表对象的结构体进行memset操作导致STL列表对象内存出异…

操作符的属性:优先级、结合性

操作符的属性&#xff1a;优先级、结合性 优先级结合性 C语言的操作符有2个重要的属性&#xff1a;优先级、结合性&#xff0c;这两个属性决定了表达式求值的计算顺序。 优先级 优先级指的是&#xff0c;如果⼀个表达式包含多个运算符&#xff0c;哪个运算符应该优先执行。各…

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程 文章目录 RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程1. 安装环境说明1. WindowServer20192. ErLang与RabbitMQ对应版本 2 安装Erlang1. 安装Erlang2. ErLnag环境变量配置3. 查看是否安装成功 3. 安装Rab…

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

&#x1f600;前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出&#xff0c;因此人们称它为克努特—莫里斯—普拉特操作&#xff08;简称KMP算法&#xff09; KMP算法的优势: 提高了匹配效率&#xff0c;时间复杂度为O(m…

【C++】用哈希桶模拟实现unordered_set和unordered_map

目录 一、哈希介绍1.1 哈希概念1.2 哈希冲突解决1.2.1 闭散列1.2.2 开散列 二、哈希桶2.1 实现哈希桶2.1.1 构造节点和声明成员变量2.1.2 构造与析构2.1.3 仿函数2.1.4 查找2.1.5 插入2.1.6 删除 2.2 kv模型哈希桶源代码 三、改造哈希桶3.1 beginend3.2 迭代器3.2.1 前置 3.3 改…

Linux_ubuntu中进行断点调试

文章目录 一、安装gdb调试器&#xff1a;二、使用gcc编译程序&#xff1a;三、使用gdb对程序进行调试&#xff1a;1.设置断点&#xff1a;使用break命令或简写为b来设置断点2.调试运行——run&#xff1a;3.继续执行——continue/c&#xff1a;4.单步执行&#xff1a;5.监视变量…

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享&#xff0c;我们对测序数据进行了质量评估&#xff0c;接下来我们需要对数据进行数据质量控制。 数据预处理&#xff08;Data Preprocessing&#xff09;&#xff1a;包括去除接头序列&#xff08;adapter trimming&#xff09;、去除低质量序列&#xff08;qualit…

【Spring Boot 源码学习】共享 MetadataReaderFactory 上下文初始化器

《Spring Boot 源码学习系列》 共享 MetadataReaderFactory 上下文初始化器 一、引言二、往期内容三、主要内容3.1 源码初识3.2 CachingMetadataReaderFactoryPostProcessor3.2.1 register 方法3.2.1 configureConfigurationClassPostProcessor 方法 3.3 ConfigurationClassPos…

SpringMVC结合设计模式:解决MyBatisPlus传递嵌套JSON数据的难题

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

Learn OpenGL 24 点光源阴影

点光源阴影 上个教程我们学到了如何使用阴影映射技术创建动态阴影。效果不错&#xff0c;但它只适合定向光&#xff0c;因为阴影只是在单一定向光源下生成的。所以它也叫定向阴影映射&#xff0c;深度&#xff08;阴影&#xff09;贴图生成自定向光的视角。 本节我们的焦点是…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection&#xff0c;GC)是Java虚拟机(JVM)的一项重要功能&#xff0c;用于自动管理程序中不再使用的内存。在Java中&#xff0c;程序员不需要手动释放内存&#xff0c;因为GC会自动检测并回收不再使用的对象&#xff0c;从而减少内存泄…

Java基础【上】韩顺平(反射、类加载、final接口、抽象类、内部类)

涵盖知识点&#xff1a;反射、类加载、单例模式、final、抽象类、接口、内部类&#xff08;局部内部类、匿名内部类、成员内部类、静态内部类&#xff09; P711 反射机制原理 创建如下目录结构&#xff0c;在模块下创建src文件夹&#xff0c;文件夹要设置为Sources文件夹&…

Git使用:实现文件在不同设备之间进行同步

一、注册Gitee&#xff0c;创建远程仓库 注册网址&#xff1a;登录 - Gitee.com 打开Gitee&#xff0c;注册完进行登录&#xff0c;点击右上角【】创建一个仓库 新建仓库&#xff1a; 点击创建&#xff0c;仓库创建完毕。 二、下载Git安装包&#xff0c;并创建本地仓库 下载网…

正则表达式具体用法大全~持续更新

# 正则表达式&#xff1a; ## 单字符匹配&#xff1a; python # 匹配某个字符串&#xff1a; # text "abc" # ret re.match(b,text) # print(ret.group()) # 点&#xff08;.&#xff09;&#xff1a;匹配任意的字符(除了\n)&#xff1a; # text "\nabc&quo…

day02_mysql-DDLDMLDQL_课后练习 - 参考答案

文章目录 day02_mysql_课后练习第1题第2题 day02_mysql_课后练习 第1题 案例&#xff1a; 1、创建数据库test02_library 2、创建表格books 字段名字段说明数据类型b_id书编号int(11)b_name书名varchar&#xff08;50&#xff09;authors作者varchar(100)price价格floatpub…