C语言_文件操作

news2024/11/26 12:22:58

文件基础

什么是文件

        文件是在计算机中以实现某种功能、或某个软件的部分功能为目的而定义的一个单位。磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分的)。

程序文件

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

数据文件

        数据文件是存储各种码制的数据的文件,包括图形、图像、声音、数字等各种数据。文件是记录在外存上的相关信息的命名组合,是逻辑外存的最小分配单元。数据文件可以是数字的、字符的、字符数字的或二进制的。本篇文章主要讨论的就是数据文件

文件名

        一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀 。例如: c:\code\test.txt。 ps. [ ./为当前目录 ../为当前目录的上一次目录 ]

为了方便起见,文件标识常被称为文件名

二进制文件和文本文件

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

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

文件的打开与关闭

流与标准流

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后在进行相关的操作。

标准流

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

  • stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
  • stderr - 标准错误流,大多数环境中输出到显示器界面。

这三个流的类型是:FILE*。有了这默认打开的三个流, 我们就可以直接使用scanf、printf等函数进行输入输出操作了。

文件指针

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

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

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

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

 文件的打开与关闭

ANSIC 规定使用 fopen 函数来打开文件, fclose 来关闭文件。

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

 其中mode表示文件的打开模式,下面是文件的打开模式:

int main()
{
    //打开⽂件
    FILE* pFile = fopen("data.txt", "w");
    //⽂件操作
    if (pFile == NULL)
    {
        perror("fopen");
        return;
    }
    //关闭⽂件
    fclose(pFile);
    pFile = NULL;
    return 0;
}

文件的顺序读写

顺序读写函数介绍

fgetc与fputc

 使用方法,请看代码:

int main()
{
	FILE* pf = fopen("data.txt", "w");//打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	for (int i = 0; i < 26; i++)	  //写文件
	{   //往data.txt文件里面,写入26个英文字母
		fputc('a' + i, stdout);
	}
	fclose(pf);	                      //关闭文件
	pf = NULL;
	return 0;
}

  使用方法,请看代码:

int main()
{
	FILE* pf = fopen("data.txt", "r");	//打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	for (int i = 0; i < 5; i++)         //读文件
	{//读取data.txt文件中的前五个字符
		printf("%c ", fgetc(pf));
	}
	fclose(pf);                         //关闭文件
	pf = NULL;
	return 0;
}

fgets与fputs

使用方法,请看代码:

int main()
{
	FILE* pf = fopen("data.txt", "w");
	if(pf == NULL)
	{
		perror("fopen");
		return;
	}//把一个字符串写到data.txt文件里
	fputs("abcde\n", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

   使用方法,请看代码:

int main()
{
	FILE* pf = fopen("data.txt", "r");
	if(pf == NULL)
	{
		perror("fopen");
		return;
	}
	char arr[] = "xxxxxxxxxxxx";
	fgets(arr, 8, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf与fprintf

 使用方法,请看代码: 

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = { "zhangsan",20,99.9 };
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
    //写文件
	fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);
 
	fclose(pf);
	pf = NULL;
	return 0;
}

  使用方法,请看代码: 

int main()
{
	struct Stu s = { 0 };
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//读文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
    //把读到的内容打印到控制台上
	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

fread与fwrite

  使用方法,请看代码:

int main()
{
	struct Stu s = { "lisi",30,66.5 };
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//二进制写文件
	fwrite(&s, sizeof(s), 1, pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

   使用方法,请看代码:

int main()
{
	struct Stu s = { 0 };
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//二进制读文件
	fread(&s, sizeof(s), 1, pf);
    
	printf("%s %d %.1f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

 文件的随机读写

fseek

定义:int fseek ( FILE * stream, long int offset, int origin );

其中offset为偏移量,origin为偏移位置

ftell

 定义:long int ftell ( FILE * stream );

返回文件指针(光标)相对于起始位置的偏移量。

rewind

定义:void rewind ( FILE * stream );

让文件指针(光标)的位置回到文件的起始位置。

文件读取结束的判定

  • 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

        例如:

fgetc 判断是否为 EOF .

fgets 判断返回值是否为 NULL .

  •  二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

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

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

相关文章

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量&#xff0c;它是衡…

STL容器之unordered_set类

文章目录 STL容器之unordered_set类1、unordered系列关联式容器2、unordered_set2.1、unordered_set介绍2.2、unordered_set的使用2.2.1、unordered_set的常见构造2.2.2、unordered_set的迭代器2.2.3、unordered_set的容量2.2.4、unordered_set的增删查2.2.5、unordered_set的桶…

看看《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制山鸢尾萼片长度和萼片宽度的小提琴图

使用MATLAB绘制鸢尾花数据集&#xff08; fisheriris&#xff09;中山鸢尾&#xff08; Iris Setosa&#xff09;的萼片长度和 萼片宽度的小提琴图。这将帮助我们更好地了解山鸢尾的这两个特征的数据分布情况&#xff0c;包括它们的 中位数、四分位范围及密度估计。这种可视化工…

制造业、能源等传统行业进行数字化转型时要注意哪些问题?

制造业、能源等传统行业在进行数字化转型时需要注意以下几个关键问题&#xff1a; 1、明确转型目标和战略规划&#xff1a;企业需要根据自身的业务特点、市场需求和长远发展目标&#xff0c;制定清晰的数字化转型战略。包括确定转型的重点领域、预期成果、时间表和资源投入。 …

AI大模型探索之路-应用篇4:Langchain框架Memory模块—增强模型记忆与知识保留

目录 前言 一、概述 二、Conversation Buffer 三、Conversation Buffer Window 四、Conversation Summary 五、Conversation Summary Buffer 总结 前言 大模型技术在理解和生成自然语言方面表现出了惊人的能力。因此&#xff0c;为了实现长期的记忆保持和知识累积&#x…

【Java EE】获取Cookie和Session

文章目录 &#x1f38d;Cookie简介&#x1f340;理解Session&#x1f333;Cookie 和 Session 的区别&#x1f332;获取Cookie&#x1f338;传统获取Cookie&#x1f338;简洁获取Cookie &#x1f334;获取Session&#x1f338;Session存储&#x1f338;Session读取&#x1f33b;…

内网IP与外网IP关联关系连接过程

前言 我们每天都会访问各种各样的网站&#xff0c;比如淘宝&#xff0c;百度等等。不免会思考&#xff0c;我们的设备是如何连接上这些网址的呢&#xff1f;要想搞清楚这个问题&#xff0c;首先就得先搞清楚内网ip和外网ip的联系。 网络结构 如图&#xff0c;假设我们的计算机…

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析

DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址&#xff0c;大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文&#xff08;DHCP DISCOVER&#xff09; 的 IP 数据报&#xff0c;由于客户端没有 IP 地址&#xff0c;也不知道 DHCP 服务器的…

短剧在线搜索PHP网站源码

源码简介 短剧在线搜索PHP网站源码&#xff0c;自带本地数据库500数据&#xff0c;共有6000短剧视频&#xff0c;与短剧猫一样。 搭建环境 PHP 7.3 Mysql 5.6 安装教程 1.上传源码到网站目录中 2.修改【admin.php】中&#xff0c; $username ‘后台登录账号’; $passwor…

Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在14.0的系统rom产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.S…

通信分类3G,4G,5G,通信专用名词

Generation: 2G: GSM全名为&#xff1a;Global System for Mobile Communications&#xff0c;中文为全球移动通信系统&#xff0c;俗称"全球通"&#xff0c;是一种起源于欧洲的移动通信技术标准&#xff0c;是第二代移动通信技术 3G&#xff1a;WCDMA 4G&#xff1a…

PaddleVideo:onnx模型导出

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型&#xff0c;并基于 ONNX 引擎预测。 1&#xff1a;环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本&#xff0c;可根据环境更换版本号 python -m pip install onnxrunti…

flask 访问404

当你的项目有自己的蓝图&#xff0c;有添加自己的前缀&#xff0c;也注册了蓝图。 在访问的路由那里也使用了自己的蓝图&#xff0c;如下图 然后你访问的地址也没问题&#xff0c;但是不管怎么样访问就是返回404&#xff0c;这个时候不要怀疑你上面的哪里配置错误&#xff0c;…

彩虹聚合DNS管理系统源码

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0c;支持获取域名…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动&#xff0c;企业发现&#xff0c;管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程&#xff0c;其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型&#xff08;LLM&#xff09;来说尤是如此&#xff0c;大型语言模型…

Spring之AOP的详细讲解

目录 一.SpringAOP是什么&#xff1f; 1.1理论知识点 1.2简单的AOP例子 二.SpringAOP的核心概念 2.1切点(Pointcut) 2.2通知&#xff08;Advice&#xff09; 2.3切⾯(Aspect) 2.4通知类型 2.5切⾯优先级 Order 2.6切点表达式 2.6.1 execution表达式 2.6.2annotati…

【绘图案例-开启图片类型的上下文withOptions Objective-C语言】

一、上午呢,我们讲了一下图片类型的上下文 1.开启图片类型的上下文:UIGraphicsBeginImageContext, 然后,我们在上边儿,画了一些东西, 然后呢,把它取出来了,通过UIGraphicsGetImageFromCurrentImageContext() 通过这个图片类型的上下文,取出来了一个image对象, …

邦火策划真的靠谱吗?餐饮品牌策划实例解析

邦火策划在餐饮品牌策划领域的表现是否靠谱&#xff0c;可以通过具体的实例来进行解析。以下是一些相关的实例分析&#xff0c;以探讨邦火策划在餐饮品牌策划方面的真实效果和专业性。 首先&#xff0c;从品牌塑造与传播的角度来看&#xff0c;邦火策划注重通过精准的市场定位…

element-plus报错TypeError: data.includes is not a function

发生在vue3中&#xff0c;页面报错。 查找原因&#xff0c;表格中的data初始值定义不是数组 改一下 再试就好了

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

【面试精讲】MyBatis设计模式及源码分析&#xff0c;MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 单例模式&#xff08;Singleton Pattern&#xff09; 3. 建造者模式&#xff08;Bu…