C语言第三十六弹---文件操作(中)

news2025/3/12 23:46:01

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

文件操作

1、文件的顺序读写

1.1、顺序读写函数介绍

1.1.1、fgetc 与 fputc

1.1.2、fgets 与 fputs

1.1.3、fscanf 与 fprintf

1.1.4、fread 与 fwrite

1.2、对比一组函数

总结


1、文件的顺序读写

1.1、顺序读写函数介绍

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

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

1.1.1、fgetc 与 fputc

int fputc ( int character, FILE * stream );

将字符写入流。
将字符写入流并推进位置指示器。

字符被写在流的内部位置指示器指示的位置,然后自动前进一个。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符写入文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

VS执行此代码之后不会输出内容,需要去找到对应文件验证。 

int fgetc ( FILE * stream );

从流中获取字符。
返回指定流的内部文件位置指示器当前指向的字符。然后,内部文件位置指示器将前进到下一个字符。

如果流在调用时位于文件末尾,则该函数将返回 EOF 并设置流的文件末尾指示符 (feof)。

如果发生读取错误,该函数将返回 EOF 并设置流的错误指示器 (ferror)。

fgetc 和 getc 是等效的,只是 getc 在某些库中可以作为宏实现。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //从pf流中读取数据
	int ch = fgetc(pf);
	printf("%c ", ch);

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

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

	ch = fgetc(pf);
	printf("%c ", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

输出结果与对应文件内容比较如下图:

1.1.2、fgets 与 fputs

int fputs ( const char * str, FILE * stream );

将字符串写入流。
将 str 指向的 C 字符串写入流。

该函数从指定的地址 (str) 开始复制,直到到达终止 null 字符 ('0')。此终止 null 字符不会复制到流中。

请注意,fputs 与 puts 的不同之处不仅在于可以指定目标流,而且 fputs 不会写入其他字符,而 puts 会自动在末尾附加换行符。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符串写入文件
	fputs("abcdef", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

执行该代码之后的文件结果如下图: 

char * fgets ( char * str, int num, FILE * stream );
//str为接受数据的地址

从流中获取字符串。
从流中读取字符,并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先到者为准。

换行符使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。

终止 null 字符会自动追加到复制到 str 的字符之后。

请注意,fgets 与 gets 有很大不同:fgets 不仅接受 stream 参数,还允许指定 str 的最大大小,并在字符串中包含任何结束换行符。

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[100] = { 0 };
	//将文件中读取字符串
	fgets(arr, 5, pf);
	printf("%s\n", arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试结果如下图: 

1.1.3、fscanf 与 fprintf

int fprintf ( FILE * stream, const char * format, ... );

将格式化的数据写入流。
将按格式指向的 C 字符串写入流。如果 format 包含格式说明符(以 % 开头的子序列),则格式后面的附加参数将被格式化并插入到生成的字符串中,以替换它们各自的说明符。

在 format 参数之后,该函数至少需要与 format 指定的其他参数一样多的附加参数。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 5.2f,'c',52 };//结构体初始化
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%f-%c-%d", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码测试:

int fscanf ( FILE * stream, const char * format, ... );

从流中读取格式化的数据。
从流中读取数据,并根据参数格式将数据存储到其他参数所指向的位置。

附加参数应指向已分配的对象,该对象由格式字符串中的相应格式说明符指定。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%f-%c-%d", &(s.f), &(s.c), &(s.n));
	printf("%f-%c-%d\n", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

1.1.4、fread 与 fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

将数据块写入流中。
从 ptr 指向的内存块写入一个 count 元素数组,每个元素的大小为 Bytes 字节。

流的位置指示器按写入的总字节数前进。

在内部,该函数将 ptr 指向的块解释为无符号字符类型的 (size*count) 元素数组,并按顺序将它们写入流式处理,就好像为每个字节调用了 fputc 一样。

举个例子:

#include <stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	//打开文件
	FILE* pf = fopen("data.txt", "wb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //二进制写文件
	fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从流中读取数据块。
从流中读取 count 元素的数组,每个元素的大小为 bytes,并将它们存储在 ptr 指定的内存块中。

流的位置指示器按读取的总字节数前进。

如果成功,读取的总字节数为 (size*count)。

举个例子:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	//打开文件
	FILE* pf = fopen("data.txt", "rb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制写文件
	fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

1.2、对比一组函数


scanf / fscanf / sscanf

                int scanf ( const char * format, ... );
//使用键盘输入信息
int fscanf ( FILE * stream, const char * format, ... );
//将stream中的信息写入后面格式化函数中
int sscanf ( const char* s, const char * format, ... );
//将字符串信息转化为格式化信息


printf / fprintf / sprintf

                int printf ( const char * format, ... );
//打印信息到屏幕
int fprintf ( FILE * stream, const char * format, ... );
//将后面格式化信息写到stream中
int sprintf ( char * str,    const char * format, ... );
//将格式化数据转化为字符串数据

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

基于51单片机心率脉搏计设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 系统方案设计 3 1.2 系统总体设计 4 2 硬件设计 5 2.1 主控电路 5 2.2 驱动电路 8 2.3 信号采集电路 10 2.4 显示电路 13 2.5 总体电路图设计 15 3 软件设计 16 3.1 软件开发环境的介绍 16 3.2 系统重要函数介绍 16 4…

解决QMYSQL driver not loaded问题

前言 之前都是在Qt5.51上开发&#xff0c;连接mysql数据库一直没有问题&#xff0c;换到5.15.2后一直报错 一查才发现\5.15.2\msvc2019_64\plugins\sqldrivers目录下没有qsqlmysql了&#xff0c;5.5.1是有的&#xff0c;5.15.2是要自己编译的。。。 下载源码 安装qt的时候没…

大型多模态智能体:综述

论文链接&#xff1a;https://arxiv.org/abs/2402.15116 大型语言模型&#xff08;LLMs&#xff09;在推动文本基础的智能体方面已经取得了超群的性能&#xff0c;赋予它们类似人类的决策和推理能力。与此同时&#xff0c;一个新兴的研究趋势集中于将这些LLM驱动的智能体扩展到…

这套系统架构,同事直呼666

你使用的每一个热门应用程序的背后,都有一个由架构、测试、监控和安全措施组成的软件系统。今天让我们看一下满足生产环境应用程序的高级架构由哪些体系组成。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保了我们的代码从存储库出发,经过…

【TOP】中科院1区TOP,Elsevier出版社,仅2-3个月录用!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;5.0-5.5&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff1b; 【版面情况】正刊&#xff0c;仅10篇版面&#xff1b; 【检索情况】SCIE在检&#xff0c;预计3个月左右录用&#xff1b; 【征稿领域】有关…

图机器学习(2)-图的基本表示

0 复习 1 图的基本表示 1.1 本体图Ontology 疾病和食物之间的关系&#xff1a;能吃、不能吃、推荐吃。 1.2 图的种类 药物和药物之间的副作用就是异质图&#xff1a; 二分图是一种特殊的异质图&#xff1a; 1.3 节点连接数 通过节点数可以说明节点的重要度。 1.4 邻接…

.NetCore6.0实现ActionFilter过滤器记录接口请求日志

文章目录 目的实现案例&#xff1a;一.首先我们新建一个WebApi项目二.配置 appsettings.json 文件&#xff0c;配置日志存放路径三.创建 Model 文件夹&#xff0c;创建AppConfig类和ErrorLog类1.在AppConfig类中编写一个GetConfigInfo方法获取配置文件中的值2.在ErrorLog类中&a…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

重庆有哪些媒体资源?活动展会媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆作为中国的一个直辖市&#xff0c;拥有丰富的媒体资源&#xff0c;涵盖电视台、广播电台、报纸、杂志以及网络媒体等各个领域。这些媒体不仅是传播新闻和信息的重要渠道&#xff0c;…

学习JavaEE的日子 Day23 迭代器,LinkedList,Vector,Stack,HashSet,LinkedHashSet

Day23 1.迭代器 含义&#xff1a;遍历集合中的数据 分类&#xff1a;Iterator 和 ListIterator Iterator 和 ListIterator 区别 Iterator &#xff1a;Collection接口下所有的实现类都可以获取的迭代器&#xff0c;可以在遍历时删除元素 ListIterator &#xff1a;List接口下所…

京东数据分析平台(京东店铺数据分析工具)推荐

京东店铺数据分析能够帮助商家了解自己的经营状况&#xff0c;优化商品策略&#xff0c;提高销售效率。以下是京东店铺数据分析的一些基本步骤和方法&#xff1a; 首先&#xff0c;在进行京东店铺数据分析时&#xff0c;我们需要借助一些电商数据分析工具来获取相关数据&#…

一次一对一服务引起的沉思和笑话(微信号Stefan)

前情提要 客户需求&#xff1a; 分析页面代码和接口请求协议和参数需求&#xff0c;将人工下载视频怎么获得最终的视频链接&#xff0c;这一逻辑清晰的展示并讲解清除。我询问了是否需要成品爬虫&#xff0c;他说代码他自己能搞定。 我给的价格选择&#xff1a; 第一种、首…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

[C#]winform基于C2PNet算法实现室内和室外图像去雾

【CP2Net框架】 https://github.com/YuZheng9/C2PNet 【CP2Net介绍】 Abstract 考虑到不适定的性质&#xff0c;发展了单图像去模糊的对比正则化&#xff0c;引入了来自负图像的信息作为下界。然而&#xff0c;对比样本是非一致的&#xff0c;因为阴性通常距离清晰&#xff…

二维码门楼牌管理系统应用场景:赋能市场研究与城市决策的新动力

文章目录 前言一、市场研究的新视角&#xff1a;门牌数据揭示市场趋势二、城市规划的得力助手&#xff1a;门牌数据指导资源分配三、决策制定的科学依据&#xff1a;门牌数据提升决策准确性四、未来展望&#xff1a;二维码门楼牌管理系统的更多可能性 前言 随着信息技术的飞速…

国创证券|存钱有窍门,掌握这五个窍门利息高出不少?

大部分居民会把手中闲置的资金存入银行&#xff0c;享用安稳的收益&#xff0c;其间存在以下五个诀窍&#xff1a; 1、比照不同银行的利率 储户在去银行存钱时&#xff0c;能够比照不同银行的利率&#xff0c;尽量地挑选利率较高的银行存&#xff0c;来获取较多的收益&#x…

UML类图详解

目录 概述1 什么是UMLUML模型和图形UML2.2中一共定义了14种图示。 2 UML类图作用3 类图格式4类与类之间的关系表达 概述 我们在阅读开源项目时&#xff0c;总是希望能比较高效的整理清楚项目中的各个类之间的关系&#xff0c;那么有没有相应的工具能高效、简洁的表示清楚类关系…

CMake:开始

文章目录 在计算机上获取和安装 CMake目录结构基本 CMake 用法CMakeLists文件适用于 CMake 的 Hello World配置和生成运行 CMake GUI运行 ccmake Curses 接口从命令行运行 CMake将编译器指定为 CMake构建配置构建项目 在计算机上获取和安装 CMake 在使用 CMake 之前&#xff0…