C语言_文件操作

文件基础

什么是文件

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

程序文件

        程序文件包括源程序文件(后缀为.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 .

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

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

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

相关文章

【MATLAB源码-第33期】matlab基于遗传算法的多层编码柔性作业车间调度问题仿真

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 遗传算法&#xff1a; 遗传算法是一种基于自然选择和遗传遗传学的优化算法。它模拟了生物进化的过程&#xff0c;通过对问题解的编码&#xff08;通常以染色体或基因型的形式&#xff09;、交叉、变异等操作来生成新的解。…

Coze 识别用户意图

文章目录 Coze 识别用户意图 Coze 识别用户意图 本文将通过 LLM 节点、Condition 节点和插件节点构建一个用于识别用户意图的工作流。 效果示例 本文构建的示例工作流概览如下。 在该工作流中&#xff1a; 使用 LLM 节点将用户输入数据分为 1&#xff08;天气&#xff09;、…

Flume实时读取目录文件到HDFS案例

【尚硅谷】大数据技术之Flume教程从入门到实战_哔哩哔哩_bilibili 目录 flume简介 flume案例 1、监控端口数据官方案例 2、实时读取目录文件到HDFS案例 flume简介 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系…

【UE Niagara】烟雾特效

效果 步骤 1. 创建一个材质&#xff0c;这里命名为“M_Smoke” 设置混合模式为半透明&#xff0c;着色模型为无光照 连接如下节点 其中纹理采样节点所使用的纹理为引擎自带的“T_SmokeSubUV_8x8” 2. 新建一个Niagara发射器&#xff0c;模板使用“Empty”&#xff0c;这里命名…

MLeaksFinder报错

1.报错&#xff1a;FBClassStrongLayout.mm 文件&#xff1a;layoutCache[currentClass] ivars; 解决&#xff1a;替换为layoutCache[(id)currentClass] ivars; 2.编译正常但运行时出现crash indirect_symbol_bindings[i] cur->rebinding FBRetainCycleDetector iOS15 …

亚马逊运营必看!如何运用自养号测评获得买家评论转销量?

作为亚马逊卖家&#xff0c;相信大家对亚马逊的产品星级评分 (Rating) 都不陌生&#xff0c;这几颗亮眼的星星&#xff0c;不仅可以让你的Listing脱颖而出&#xff0c;获得足够多、足够高的产品评分&#xff0c;也是促使消费者下单的重要因素之一。 那么&#xff0c;亚马逊运营…

DepthFormer论文详解

摘要 本文旨在解决有监督单目深度估计的问题&#xff0c;我们从一项细致的试点研究开始&#xff0c;以证明远程相关性对于准确的深度估计至关重要。我们建议使用Transformer以有效地注意力机制对这种全局上下文进行建模。我们还采用一个额外的卷积分支来保留局部信息&#xff0…

NPU编译MultiScaleDeformableAttention

NPU对pytorch&#xff0c;想将检测模型在NPU上训练&#xff0c;存在编译MultiScaleDeformableAttention的需求。 然而&#xff0c;原dino模型https://github.com/IDEA-Research/DINO/tree/main/models/dino/ops/src 仅包含CPU版本和GPU版本&#xff1a; 是不是就真的无法解决…

2024/4/5—力扣—在排序数组中查找元素的第一个和最后一个位置

代码实现&#xff1a; 思路&#xff1a;二分法 方法一&#xff1a;分别查找左右侧边界 /*** Note: The returned array must be malloced, assume caller calls free().*/ int GetTargetFirstPosition(int *nums, int numsSize, int target) {int l 0, r numsSize - 1;while …

【北京迅为】《iTOP-3588开发板开发板系统编程手册》第3章 标准IO

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

蓝桥杯复习笔记

文章目录 gridflexhtml表格合并单元格 表单表单元素input类型 select h5文件上传拖拽apiweb Storage css块元素和行内元素转换positionfloat溢出显示隐藏外边距过渡和动画动画变形选择器属性选择伪类选择器 css3边框圆角边框阴影渐变text-overflow与word-wrap jsdom操作documen…

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的桶…

C++--this指针

this 指针是一个隐含于每一个成员函数中的特殊指针。它是指向一个正操作该成员函数的对象。当对一个对象调用成员函数时&#xff0c;编译程序先将对象的地址赋予this指针&#xff0c;然后调用成员函数。每次成员函数存取数据成员时&#xff0c;C编译器将根据 this 指针所指向的…

由于找不到msvcp100.dll,无法继续执行代码要如何处理?正确的msvcp100.dll修复

由于找不到msvcp100.dll,无法继续执行代码要如何处理&#xff1f;其实要处理这种dll文件丢失的问题&#xff0c;还是比较简单的&#xff0c;只要我们了解清楚这个msvcp100.dll文件&#xff0c;那么就可以快速的解决&#xff0c;好了&#xff0c;废话不多说&#xff0c;我们一起…

证件照小于30kb怎么弄?这个工具三步搞定

当我们需要将照片上传到各种平台时&#xff0c;常常会遇到图片文件大小限制的问题。无论是社交媒体平台还是工作需求&#xff0c;如果照片文件过大&#xff0c;系统会提示上传失败或无法上传。想要解决的这个问题&#xff0c;可以选择将图片压缩指定大小&#xff0c;比如图片压…

git操作码云(gitee)创建仓库到上传到远程仓库

想必有的小伙伴在为上传到码云远程仓库而感到烦恼吧&#xff01;本篇为大家详细讲解实现过程&#xff0c;跟着我的步伐一步一步来。 我就当大家已经注册好了码云 一、在码云上需要的操作 接下来我们需要使用到 git 了 二、git 上的操作 到了咋们的git了&#xff0c;开整 首…

代码浅析Point-LIO

0. 简介 对于最近出来的Point-LIO(鲁棒高带宽激光惯性里程计)&#xff0c;本人还是非常该兴趣的&#xff0c;为此花了一些时间重点分析了Point-LIO的代码&#xff0c;并研究了它相较于Fast-LIO2的区别 1. laserMapping.cpp 第一部分就是实现对激光雷达视场角的图像分割。首先…

Python学习从0到1 day24 第二阶段 SQL ① SQL基础语法

还是会再见的 —— 24.4.10 MySQL基础及常用操作博主已整理在了两个专栏中&#xff0c;具体查看博主两个专栏的文章 ① Mysql数据库 ② 深入学习MySQL数据库 DDL —— 数据库管理 DDL —— 数据表管理 DML 数据操作语言 数据插入 INSERT 数据删除 DELETE 数据更新 UPDATE 注意…

短剧在线搜索PHP网站源码

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

Vue-Router入门

现在的前后端分离项目&#xff0c;后端只管数据传递&#xff0c;视图跳转的活交由前端来干了&#xff0c;vue-router就是专门来干这个活的&#xff0c;它可以让页面跳转到指定组件 组件是可复用的 Vue 实例, 把一些公共的模块抽取出来&#xff0c;然后写成单独的的工具组件或者…