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

文件操作(下)

    • 5、文件的顺序读写
      • 5.1 顺序读写函数介绍
        • 5.1.1 fputc与fgetc
        • 5.1.2 fputs与fgets
        • 5.1.3 fprintf与fscanf
        • 5.1.4 fread与fwrite
      • 5.2 对比一组函数
    • 6. 文件的随机读写
      • 6.1 fseek
      • 6.2 ftell
      • 6.3 rewind
    • 7. 文件读取结束的判定
      • 7.1 被错误使用的feof
    • 8. 文件缓冲区

5、文件的顺序读写

5.1 顺序读写函数介绍

5.1.1 fputc与fgetc

请看:
文件操作(上)

5.1.2 fputs与fgets

fputs: 文本行输出函数

int fputs ( const char * str, FILE * stream );
//          字符串指针         文件指针

代码:

int main()
{
	//1.打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	//2.写文件
	fputs("I am a student.\n", pf);//\n换行
	fputs("are you ok???\n", pf);
	
	//3.关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

程序执行结果:文件中写入两行字符串,换行后有一个空行!
在这里插入图片描述
fgets:

char * fgets ( char * str, int num, FILE * stream );
//            字符串指针   读取的字符个数  文件指针

举例1:
往文件中放入以下内容
在这里插入图片描述
代码:

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

	//2.读文件
	char arr[20] = "xxxxxxxxxxxxxxxxxxxx";
	fgets(arr, 5, pf);//要读5个字符
	printf("%s\n", arr);

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

调试观察:
通过观察发现,我们要读取5个字符,但实际只读取了4个有效字符"abcd",末尾自动添加一个"\0",也就是只读取了n-1个字符
在这里插入图片描述

运行结果:打印"abcd"

在这里插入图片描述

举例2: 文本行输入函数
往文件中放入以下内容
在这里插入图片描述
代码:

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

	//2.读文件
	char arr[20] = "xxxxxxxxxxxxxxxxxxxx";
	fgets(arr, 10, pf);//要读10个字符
	printf("%s\n", arr);

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

调试观察:
可以观察到只读取了5个有效字符,还有一个"\n"和一个"\0",也就是说当遇到换行时,后标的字符都不会再读取,当然末尾是依旧要补"\0"的
在这里插入图片描述
运行结果:打印"abcde"
在这里插入图片描述

5.1.3 fprintf与fscanf

首先要明白一个概念
什么是可变参数列表?
例如:printf

//printf
int printf ( const char * format, ... );
//                                可变参数列表

举例:参数的数量是可变的

int main()
{
	printf("abcde\n");//一个参数
	printf("%d\n", 100);//两个参数
	printf("%d %c\n", 100, 'a');//三个参数
	return 0;
}

进入正题:

fprintf: 格式化输出函数

//fprintf
int fprintf ( FILE * stream, const char * format, ... );
//            文件指针                             可变参数列表

代码:

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "xiaoming", 18, 99.0f };
	//1.打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//2.写文件
	fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//格式化的输出函数

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

运行结果:结构体中的内容被写到了文件中

在这里插入图片描述

fscanf: 格式化输入函数

int fscanf ( FILE * stream, const char * format, ... );//从文件中读

用上文中fprintf向文件中输出的结果为例
代码:

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };
	//1.打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//2.读文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//格式化的输入函数

	//将读取的结果打印出来
	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);

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

程序执行结果:成功读取到了文件中的内容,并打印在了屏幕上

在这里插入图片描述

5.1.4 fread与fwrite

fwrite: 将ptr指向的空间中count个大小为size的数据写到文件中

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
//              ptr指向的空间      大小            个数         文件指针

代码:

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "wangwu",18,66.6f };
	//1. 打开文件
	FILE* pf = fopen("test.txt", "wb");//二进制的写
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//2. 写文件
	fwrite(&s, sizeof(struct S), 1, pf);//将s所指向空间中大小为sizeof(struct S)的1个数据写到pf所指向的文件中

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

运行结果:因为写入的是二进制的信息,所以人是看不懂的

在这里插入图片描述

fread: 从文件中读取count个大小为size的数据存放到ptr指向的空间中

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
//            ptr指向的空间     大小       个数         文件指针

代码:

//fread
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };
	//1. 打开文件
	FILE* pf = fopen("test.txt", "rb");//二进制的读
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//2. 写文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.name, s.age, s.score);

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

运行结果:
在这里插入图片描述

5.2 对比一组函数

scanf/printf: 针对标准输入流/标准输出流的 格式化 输入/输出函数
fscanf/fprintf: 针对所有输入流/所有输出流的 格式化 输入/输出函数
sscanf/sprintf:

  1. sprintf: 将格式化的数据写到字符串中,可以理解为将格式化的数据转换成字符串
int sprintf ( char * str, const char * format, ... );

代码举例:

struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "lisi",18,80.0f };
	char arr[20] = { 0 };
	sprintf(arr, "%s %d %f", s.name, s.age, s.score);//将结构体变量s中的内容转换成字符串
	printf("%s\n", arr);
	return 0;
}

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

  1. sscanf: 从字符串中提取格式化的数据,也可以理解为将字符串转换为格式化的数据
int sscanf ( const char * s, const char * format, ...);

代码举例:

struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	char arr[100] = { 0 };
	struct S s = { "lisi",18,80.0f };
	
	//临时变量
	struct S tmp = {0};
	
	//将s中的各个数据转化成字符串,存放在arr中
	sprintf(arr, "%s %d %f", s.name, s.age, s.score);

	//从arr中提取格式化的数据存放在tmp中
	sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
	printf("%s %d %f", tmp.name, tmp.age, tmp.score);

	return 0;
}

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

6. 文件的随机读写

6.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

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

代码:

int main()
{
	FILE* pFile;
	pFile = fopen("test.txt", "wb");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);//This is a sample.
	fclose(pFile);
	pFile = NULL;
	return 0;
}

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

6.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell  ( FILE * stream );

代码:

int main()
{
	FILE* pFile;
	long size;
	pFile = fopen("test.txt", "rb");
	if (pFile == NULL)
		perror("fopen");
	else
	{
		fseek(pFile, 0, SEEK_END); 
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of test.txt: %ld bytes.\n", size);
	}
	return 0;
}

运行结果:
在这里插入图片描述

6.3 rewind

让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

代码:

int main()
{
	int n;
	FILE* pFile;
	char buffer[27];
	pFile = fopen("myfile.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pFile);
	rewind(pFile);
	fread(buffer, 1, 26, pFile);
	fclose(pFile);
	pFile = NULL;
	buffer[26] = '\0';
	printf(buffer);
	return 0;
}

7. 文件读取结束的判定

7.1 被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。

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

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

8. 文件缓冲区

ANSIC 标准采用“缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

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

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

相关文章

SD教程:【AI创意】欧洲杯特别设计:SD机甲足球

使用Stable Diffusion&#xff08;SD&#xff09;为欧洲杯设计一款独特的机甲足球。这个创意项目将展示如何结合足球元素和机甲设计&#xff0c;创作出既符合体育精神又具有未来科技感的作品。无论是用于赛事宣传、纪念品设计还是艺术展示&#xff0c;这个设计都能吸引足球迷和…

正则表达式阅读理解

((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\)?|(…

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…

使用 Vanna 生成准确的 SQL 查询:工作原理和性能分析

Vanna工作原理 从本质上讲,Vanna 是一个 Python 包,它使用检索增强功能来帮助您使用 LLM 为数据库生成准确的 SQL 查询。 Vanna 的工作分为两个简单的步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回可设置为在您的数据库上自动运行的 SQL 查询。 vn.t…

一文讲解:如何理解数字化?数字化的三大本质!

在当今时代&#xff0c;一些企业对数字化概念与本质进行了专门的诠释&#xff0c;部分认为数字化是基于大数据、云计算、物联网、5G等数字技术来实现企业的管理创新&#xff0c;且这一进程的前提是建立在信息化基础之上。然而&#xff0c;也有一些专家持有不同观点&#xff0c;…

Apache HBase概述(图文并茂~)

HBase概述 1. Why we need HBase &#xff1f; 在大数据时代来临之前&#xff0c;我们通常依赖传统的关系型数据库&#xff08;如RDBMS&#xff09;来处理数据存储和管理。然而&#xff0c;随着数据量的急剧增长和数据结构的多样化&#xff0c;传统数据库系统开始显露出其局限性…

照片变漫画怎么弄?这5个照片变漫画方法超简单

在艺术和社交融合的现在&#xff0c;将照片转换为漫画风格已经成为一种流行趋势。 无论是为了创造个性化的头像&#xff0c;还是制作有趣的社交媒体帖子&#xff0c;拥有一款能够将照片转换为漫画的软件将极大地丰富你的创意表达。 下面&#xff0c;本文将介绍几款能够实现这…

eNSP学习——SNMP基础配置

目录 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、开启Agent服务 3、配置SNMP版本 4、配置NMS管理权限 5、配置向SNMP Agent输出Trap 信息 主要命令 原理概述 随着网络规模的日益发展&#xff0c;现有的网络中&#xff0c;设备数量日益…

Charles抓包工具系列文章(六)-- Block List 和 Allow List (黑白名单)

一、背景 Allow List 是白名单&#xff0c;请求的接口如果在白名单里&#xff0c;就被允许。 Block List 是黑名单&#xff0c;请求的接口如果在黑名单里&#xff0c;就被拒绝。 黑白名单是可以一起启用的&#xff0c;优先黑名单。 二、白名单 Allow List 1、新增白名单接口…

2024国内外音频转换器大盘点,盘点音乐剪辑的7个有效方法!

当遇到不支持的音乐文件时&#xff0c;您可能就会想要拥有一款优秀的音频转换器。当您想减小大量音乐文件以节省设备存储空间时&#xff0c;它也可以很好地帮上忙。如果您正在寻找这么一款音频转换器&#xff0c;那么&#xff0c;请不要错过这篇文章。一款顶尖的音频转换器不仅…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。

关于我 我算是“入行”不久的一个新人安全工作者&#xff0c;为什么是引号呢&#xff0c;因为我是个“半个野路子”出身。早在13年的时候&#xff0c;我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xff0c;我逐渐淡出了安全圈子&#x…

[vscode] 自定义log快捷生成代码

1、进入设置页面&#xff1a;文件>首选项>用户代码片段>选择设置的语言。 2. 关于代码段显示位置的调整设置 文件>首选项>设置&#xff0c;搜索代码段或snippetSuggestions&#xff0c;修改为”top”; 参考&#xff1a; vscode自定义log快捷生成代码

铊的危害以及工业废水除铊的工艺

铊是一种有毒的重金属&#xff0c;具有强烈的神经毒性&#xff0c;同时对肝肾也有损害作用。铊中毒分为急性中毒和慢性中毒&#xff0c;急性中毒一般在接触12-24h内发病&#xff0c;早期表现为食欲减退、恶心、呕吐、腹痛、腹泻等消化道症状&#xff0c;数天后才出现明显的神经…

酷开系统丨酷开科技AI赋能数字大屏,开启智能家居新纪元

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的崛起无疑为科技领域带来了革命性的变化。酷开科技&#xff0c;正以其独特的"AI数字大屏"战略&#xff0c;将创新理念转化为现实&#xff0c;引领行业发展新潮流。 酷开科技的智能电视操作系统…

基于前馈神经网络的姓氏分类任务(基础)

1、认识前馈神经网络 What is it 图1-1 前馈神经网络结构 人们大多使用多层感知机&#xff08;英语&#xff1a;Multilayer Perceptron&#xff0c;缩写&#xff1a;MLP&#xff09;作为前馈神经网络的代名词&#xff0c;但是除了MLP之外&#xff0c;卷积神经网络&#xff08…

AI智能体的炒作与现实:GPT-4都撑不起,现实任务成功率不到15%

AI 智能体的宣传很好&#xff0c;现实不太妙。 随着大语言模型的不断进化与自我革新&#xff0c;性能、准确度、稳定性都有了大幅的提升&#xff0c;这已经被各个基准问题集验证过了。 但是&#xff0c;对于现有版本的 LLM 来说&#xff0c;它们的综合能力似乎并不能完全支撑得…

Java基础的重点知识-04-封装

文章目录 面向对象思想封装 面向对象思想 在计算机程序设计过程中&#xff0c;参照现实中事物&#xff0c;将事物的属性特征、行为特征抽象出来&#xff0c;描述成计算机事件的设计思想。 面向对象思想的三大基本特征: 封装、继承、多态 1.类和对象 类是对象的抽象&#xff…

初阶 《操作符详解》11. 下标引用、函数调用和结构成员

11. 下标引用、函数调用和结构成员 1. [ ] 下标引用操作符 操作数&#xff1a;一个数组名 一个索引值 int arr[10];//创建数组 arr[9] 10;//实用下标引用操作符&#xff0c;[ ]的两个操作数是arr和9arr[7]-->*(arr7)-->*(7arr)-->7[arr] 7[arr] 9; //编译器不会…

软考《信息系统运行管理员》-1.1信息系统概述

1.1信息系统概述 信息的含义 信息是人们关心的事情的消息或知识 信息的分类 按产生信息的客体性质分&#xff1a; 自然信息&#xff1a;声、光、热、电等生物信息&#xff1a;遗传信息&#xff0c;生物体内、生物种群内的信息交流机器信息&#xff1a;自动控制系统社会信息…

flask与vue实现通过websocket通信

在一些情况下&#xff0c;我们需要实现前后端之间的时刻监听&#xff0c;本文是一篇工具文档&#xff0c;用于解决前后端之间使用websocket交互。 一. Flask的相关配置 1. 下载相关依赖库 如果还没有配置flask的话&#xff0c;需要先安装flask,同时为解决跨域问题&#xff0…