C语言 | 文件操作(上)【必收藏】

news2024/11/16 3:32:48

文件操作(上)

  • 1、使用文件的原因
  • 2、什么是文件
  • 3、二进制文件和文本文件
  • 4、 流的打开与关闭
    • 4.1 流和标准流
      • 4.1.1 流
      • 4.1.2 标准流
    • 4.2 文件指针
    • 4.3 文件的打开和关闭
  • 5、文件的顺序读写
    • 5.1 顺序读写函数介绍
      • 5.1.1 fputc与fgetc

1、使用文件的原因

首先来看一个代码:

int main()
{
	int a = 0;
	printf("a = %d\n", a);
	scanf("%d", &a);
	printf("a = %d\n", a);
	return 0;
}

当我们输入一个100,代码的运行结果是:
在这里插入图片描述
可以看到,a变成了100,那么我们关闭程序,再次运行程序a还会是100吗?
在这里插入图片描述
a又变为0,这是为什么呢?
原因是: a是在内存上的一块空间,如果程序退出,内存会归还给操作系统,a中的数据就会丢失,所以第二次运行程序时是看不到上一次的数据的,如果我们想要持久化的保存数据,我们可以将数据保存在硬盘上的文件中。

2、什么是文件

磁盘(硬盘)上的文件就是文件
我们一般所说的文件有两种,一种是程序文件,一种是数据文件
程序文件: 源程序文件(后缀为.c),目标文件(Windows环境下的目标文件后缀为.obj),可执行程序(Windows环境下的目标文件后缀为.exe)
数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
在这里插入图片描述
文件名: 文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
在这里插入图片描述

3、二进制文件和文本文件

根据文件的内容可以将文件划分为二进制文件文本文件
数据是以二进制的补码存储在内存中的,如果不加转换的输出到外存的文件中去,就叫做二进制文件
如果在存储前将数据转换成ASCII值的形式存储到外存中,以ASCII码字符存储的文件就叫做文本文件
举个例子,将 10000 存储到文件中,以二进制形式输出到硬盘上占4个字节,而以ASCII值形式输出则占用5个字节
在这里插入图片描述
代码:

int main()
{
	int a = 10000;
	FILE* p = fopen("data.txt", "wb");//w是写,b是以二进制的形式
	fwrite(&a, 4, 1, p);
	fclose(p);
	p = NULL;
	return 0;
}

结果是一个看不懂的二进制文件
在这里插入图片描述
如果在VS上打开:
在这里插入图片描述
在这里插入图片描述
可以看到存储的是 10 27 00 00,,就是10000
在这里插入图片描述

4、 流的打开与关闭

4.1 流和标准流

4.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

4.1.2 标准流

问题: 在使用C语言写程序时,使用scanf从键盘输入数据或者使用printf向屏幕输出数据为什么没有打开流和关闭流的操作呢?

原因就是C语言程序在启动的时候,默认打开了3个流:
stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出 流中。
stderr - 标准错误流,大多数环境中输出到显示器界面。 这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针。
在C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

4.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,如文件的名字,文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

在这里插入图片描述

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

文件是在硬盘上的,文件信息区是在内存上的!

4.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSI C 规定使用 fopen 函数来打开文件,fclose 来关闭文件。

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//                  文件名               文件的打开方式

返回的就是FILE*的指针,就是文件信息区的地址,然后就能找到文件信息区,就能找到流,然后进行读写操作

//关闭文件
int fclose ( FILE * stream );

mode表示文件的打开模式,下面都是文件的打开模式:
在这里插入图片描述

代码:

int main()
{
	//打开文件
	//打开成功返回有效的文件指针
	//打开失败返回NULL
	FILE* pf = fopen("data.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件

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

	return 0;
}

在这里插入图片描述
若文件路径下没有data.txt的文件,在只写的情况下,会自动在文件路径下创建一个data.txt文件,然后可以进行文件的写操作

若文件路径下有data.txt文件,并且文件中有内容,在只写的情况下会清空文件中的内容

执行程序前:
在这里插入图片描述
执行程序后:
在这里插入图片描述

代码:举例“w”和“r”

int main()
{
	//打开文件
	//打开成功返回有效的文件指针
	//打开失败返回NULL
	FILE* pf = fopen("test.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件

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

	return 0;
}

在这里插入图片描述
文件路径下没有test.txt文件,只读的话会报错
在这里插入图片描述
假如文件现在不在当前程序的路径下,在桌面该怎么打开?

我们就需要再在文件名之前添加文件的路径,如果能找到该文件,则文件内容会被清空
在这里插入图片描述
代码:

int main()
{
	//打开文件
	//打开成功返回有效的文件指针
	//打开失败返回NULL
	FILE* pf = fopen("C:\\Users\\Administrator\\Desktop\\test.txt", "w");//只写
	//                这也叫做绝对路径
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件

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

	return 0;
}

若文件在该工程所在路径的上一级路径该怎么办?
在这里插入图片描述

int main()
{
	//打开文件
	//打开成功返回有效的文件指针
	//打开失败返回NULL
	FILE* pf = fopen(".\\..\\test.txt", "w");
	//这叫做相对路径
	//. 表示当前路径
	//.. 表示上一级路径
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件

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

	return 0;
}

在这里插入图片描述
文件被清空,说明文件操作成功!

5、文件的顺序读写

5.1 顺序读写函数介绍

在这里插入图片描述

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);
所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

5.1.1 fputc与fgetc

fputc:

int fputc ( int character, FILE * stream );
//            输入的内容      文件指针

代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	for (int i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
		//  内容  文件指针
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

程序执行结果:项文件中写入26个英文字母
在这里插入图片描述

fgetc:

int fgetc ( FILE * stream );
//            文件指针

若文件读取成功,返回字符的ASCII值;
若文件读取失败,返回EOF(文件结束标志);

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}

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

程序执行结果:
在这里插入图片描述

以上就是上篇的全部内容啦!下篇更精彩哦!希望大家多多点赞支持!
如果有什么问题,欢迎私信!
在这里插入图片描述

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

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

相关文章

据阿谱尔统计显示,2023年全球凹版印刷机市场销售额约为9.1亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球凹版印刷机市场销售额约为9.1亿美元&#xff0c;预计在2024-2030年预测期内将以超过2.54%的CAGR&#xff08;年复合增长率&#xff09;增长。 由于对软包装和印刷包装的需求不断增长&#xff0c;全球凹…

Qt绘图项目 - 简易表盘

发话少说&#xff0c;放码过来 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();prot…

3-哈希表-81-四数之和-LeetCode18

3-哈希表-81-四数之和-LeetCode18 参考&#xff1a;代码随想录 LeetCode: 题目序号18 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff…

C#发送邮件

C#发送邮件代码&#xff0c;亲测可用。 using System; using System.Net; using System.Net.Mail;namespace MailSend {class Program{static void Main(string[] args){try{MailAddress receiver new MailAddress("666666666qq.com");//666666666qq.com 换成收件人…

告别混乱!7步打造精益管理模式,让企业效率翻倍

当下&#xff0c;企业要想立于不败之地&#xff0c;就必须注重管理效率的提升。然而&#xff0c;很多企业在追求高效运营的过程中&#xff0c;却常常陷入混乱和无效的努力中。那么&#xff0c;如何才能真正实现精益管理呢&#xff1f;深圳天行健精益管理咨询公司分享步骤如下&a…

【投稿优惠】2024年计算机科学与软件工程国际会议(ICCSSE 2024)

2024年计算机科学与软件工程国际会议 2024 International Conference on Computer Science and Software Engineering 会议简介 2024年计算机科学与软件工程国际会议是一个备受全球瞩目的学术盛会&#xff0c;旨在促进计算机科学和软件工程领域的学术交流与合作。此次会议将汇聚…

Android开发之音乐播放器添加排行需求

Music统计功能需求 1.记录歌曲名称与次数(歌曲播放结束算一次)&#xff0c;根据播放次数制作一个排行列表;&#xff08;开始说要记录歌手&#xff0c;后面debug发现这个字段没有&#xff0c;暂时不记录&#xff09; 2.记录播放歌曲的时长&#xff0c;时间累加&#xff1b;&…

基于安信可串口调试助手软件调试ESP8266串口WIFI模块ESP-01S应用功能

基于安信可串口调试助手软件调试ESP8266串口WIFI模块ESP-01S应用功能 ESP8266_01S引脚功能图ESP8266_01S原理图ESP8266_01S尺寸图检验工作1、USB-TTL串口工具(推荐使用搭载CP2102芯片的安信可USB-T1串口)与ESP8266_01S WiFi模块(推荐使用安信可ESP8266系列模组)接线(注意当…

使用谷歌 Gemini API 构建自己的 ChatGPT(一)

AI领域一直由OpenAI和微软等公司主导&#xff0c;而Gemini则崭露头角&#xff0c;以更大的规模和多样性脱颖而出。它被设计用于无缝处理文本、图像、音频和视频&#xff1b;这些基础模型重新定义了人工智能交互的边界。随着谷歌在人工智能领域强势回归&#xff0c;了解Gemini如…

HMI(人机交互)应用的15大领域,欢迎补充。

HMI&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;可以应用于许多不同的场景和行业&#xff0c;包括但不限于以下几个方面&#xff1a; 工业控制系统&#xff1a;HMI在工业生产中广泛应用&#xff0c;用于监控和控制生产过程。例如&#xff0c;工厂中的…

数据库学霸笔记

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

前端问题整理

Vue vue mvvm&#xff08;Model-View-ViewModel&#xff09;架构模式原理 Model 是数据层&#xff0c;即 vue 实例中的数据View 是视图层&#xff0c; 即 domViewModel&#xff0c;即连接Model和Vue的中间层&#xff0c;Vue实例就是ViewModelViewModel 负责将 Model 的变化反映…

构建企业核心竞争力:拥有自主大模型,引领行业未来

前言 随着人工智能技术的飞速发展&#xff0c;大模型技术已经成为推动行业进步的重要力量。在这个变革的时代&#xff0c;作为一位具有前瞻性的企业家&#xff0c;您深知拥有自主大模型对于提升公司竞争力、引领行业未来的重要性。本文将为您详细介绍大模型的市场现状以及企业…

【机器学习】通用大模型VS垂直大模型,你更加青睐哪一方?

目录 前言AI大模型的战场&#xff1a;通用与垂直的分化通用大模型&#xff1a;广泛适用的利器垂直大模型&#xff1a;深入领域的利器谁能够形成绝对优势&#xff1f;结语通用大模型文章推荐 前言 AI大模型的战场正在分化&#xff1a; 通用大模型在落地场景更广泛毋庸置疑&…

暗色系B端界面有什么好处、应用场景、缺点、该如何设计。

B端管理系统界面蓝色系和浅色系的非常多&#xff0c;暗色系一般不作为首选&#xff0c;这背后是什么原因呢&#xff0c;如果真的要设计暗色系界面&#xff0c;该如何办呢&#xff0c;本文就解决这些问题。 一、暗色系B端界面相对于浅色系有什么好处 1. 减少眩光和视觉疲劳&am…

引入tinyMCE富文本框在vue3中的使用

实现效果&#xff1a; 官网地址&#xff1a;TinyMCE 7 Documentation | TinyMCE Documentation 1.下载依赖&#xff08;我使用的版本是5.0 目前最新版本到7了&#xff09; pnpm/npm install tinymce5.0.0 -S pnpm/npm install tinymce/tinymce-vue -S 2.在public文件夹下…

浅析Spring中Async注解底层异步线程池原理

一、前言 开发中我们经常会用到异步方法调用&#xff0c;具体到代码层面&#xff0c;异步方法调用的实现方式有很多种&#xff0c;比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程&#xff0c;然后启动异步线程&#xff1b;再如&#xff0c;可以直接用java.uti…

数字孪生技术如何赋能智慧工厂

数字孪生技术为什么能在智慧工厂中发挥作用&#xff1f;随着工业4.0的推进和智能制造的普及&#xff0c;数字孪生技术成为智慧工厂的重要推动力。数字孪生是指在虚拟空间中创建一个与现实物理实体相对应的数字模型&#xff0c;通过实时数据交互和分析&#xff0c;实现对物理实体…

即插即用!CVD:第一个生成具有相机控制的多视图一致视频方案!(斯坦福港中文)

论文链接&#xff1a;https://arxiv.org/abs/2405.17414 项目链接&#xff1a;https://collaborativevideodiffusion.github.io/ 最近对视频生成的研究取得了巨大进展&#xff0c;使得可以从文本提示或图像生成高质量的视频。在视频生成过程中添加控制是未来的重要目标&#x…

GIS大赛制图类训练营:从入门到直通决赛,你只差这一步!

为什么要参加GIS大赛&#xff1f; 相信只要是读GIS相关专业的同学&#xff0c;大家在学校应该会经常被老师要求学生参加比赛&#xff0c;往届的学长学姐们也会鼓励大家本科期间多参加GIS大赛。 那是因为参加GIS比赛的好处多多&#xff0c;报名参赛不仅可以提升自身动手能力&…