IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言--三组输入输出函数对比(scanf/fscanf/sscanf、printf/fprintf/sprintf) -> 正文阅读

[C++知识库]C语言--三组输入输出函数对比(scanf/fscanf/sscanf、printf/fprintf/sprintf)

前言

在C语言中有这么三组输入输出函数,分别是:
scanf和printf、fscanf和fprintf、sscanf和sprintf
这三组函数都有着输入输出的功能,但它们的区别在哪里呢?

在这里插入图片描述

下面分别来介绍:

🍎. scanf 和 printf 函数

函数原型:

int scanf( const char *format [,argument]... );

int printf( const char *format [, argument]... );

这两个函数此处不再赘述,想必自”hello world“以来已经用了无数次了。


🍎. fscanf 和 fprintf 函数

函数原型:

//scnaf和fscanf函数对比:
int fscanf( FILE *stream, const char *format [, argument ]... );
int scanf( const char *format [,argument]... );

//fprintf和printf对比:
int fprintf( FILE *stream, const char *format [, argument ]...);
int printf( const char *format [, argument]... );

观察两组函数对比,发现fscanf和fprintf仅仅比scanf和printf函数多了一个参数,该参数就是文件指针或者标准输出输入流。

🍉 fprintf函数

//fprintf和printf对比:
int fprintf( FILE *stream, const char *format [, argument ]...);
int printf( const char *format [, argument]... );

对比fprintf和printf两个函数,我们发现其实二者大同小异,不同的仅仅是fprintf函数多了一个参数FILE *stream,这个参数就是表示的要输出写入的文件的指针或者说是文件输出流。

因此,fprintf函数的使用是可以直接类比printf函数的。

其实,printf函数只是将输出流这个参数默认为stdout,如果我们使用fprintf函数时,将第一个参数写为stdout,那它和printf函数的功能是一模一样的。可以参看下面的例子。

使用举例: 用一个结构体来举例:

struct Stu
{
	char name[20];
	int num;
	float score;
};

int main()
{
	struct Stu s = { "zhangsan",20220405,73.66 };

	FILE* pf = fopen("test.txt", "w");//以写的形式打开文件
	if (pf == NULL)
	{
		perror("fopen fail:");
		return -1;
	}

	//将数据写入文件:
	fprintf(pf, "%s %d %.2f", s.name, s.num, s.score);

	//将写入文件的数据显示在屏幕上:
	fprintf(stdout, "%s %d %.2f", s.name, s.num, s.score);


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

	return 0;
}

屏幕输出结果:
屏幕输出结果
文件输出结果:
在这里插入图片描述


🍉 fscanf函数

//scnaf和fscanf函数对比:
int fscanf( FILE *stream, const char *format [, argument ]... );
int scanf( const char *format [,argument]... );

和上面一样,我们这里也是拿scanf和fscanf函数对比。发现,两个函数的不同之处也仅仅是fscanf函数多了一个指向文件指针的参数。那么同样的,如果将这个参数改为stdin(标准输入流–键盘),那么其效果和scanf函数应该是一样的 。

所以,fscanf函数的使用方式同样可以直接参照scanf的使用。

下面还是举个例子来讲解,我们将从2.1节中写好的文件来读取数据放入结构体中。

使用举例:

struct Stu
{
	char name[20];
	int num;
	float score;
};
int main()
{
	struct Stu s = { 0 };//结构体初识化为0

	FILE* pf = fopen("test.txt", "r");//以读的形式打开文件
	
	if (pf == NULL)//判断打开成功与否
	{
		perror("fopen fail:");
		return -1;
	}

	//从文件读取数据:
	fscanf(pf, "%s %d %f", s.name, &s.num, &s.score);

	//将从文件中读取的数据显示在屏幕上:
	fprintf(stdout, "%s %d %.2f", s.name, s.num, s.score);

	//从键盘读取数据:
	fscanf(stdin, "%s %d %f", s.name, &s.num, &s.score);
	//将从键盘读取的数据显示在屏幕上:
	fprintf(stdout, "%s %d %.2f", s.name, s.num, s.score);


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

	return 0;
}

输出结果:
在这里插入图片描述


🍎. sscanf 和 sprintf 函数

函数原型:

//scnaf和sscanf函数对比:
int sscanf( const char *buffer, const char *format [, argument ] ... );
int scanf( const char *format [,argument]... );

//printf和sprintf对比:
int sprintf( char *buffer, const char *format [, argument] ... );
int printf( const char *format [, argument]... );

观察上述两组函数,我们发现,sscanf和sprintf同样也是只比scanf和printf函数多了一个char* buffer的参数,其他的参数、返回值均相同。

对于sscanf,表示从字符串buffer中读取一些格式化的数据;
对于sprintf,表示将格式化的数据转化为字符串存入buffer中。

使用举例: 此处同样以结构体来示例:

struct Stu
{
	char name[20];
	int num;
	float score;
};

int main()
{
	struct Stu s = { "zhangsan",2022,88.88 };
	struct Stu tmp = { 0 };

	char buf[100] = { 0 };

	//使用sprintf函数,将结构体变量s中的数据转化成字符串存入buf中:
	sprintf(buf, "%s %d %.2f", s.name, s.num, s.score);
	//打印buf观察其内容:
	printf("字符串buf的内容:%s\n", buf);


	//使用sscanf函数将buf中的字符串,读取存入结构体变量tmp中:
	sscanf(buf, "%s %d %f", tmp.name, &tmp.num, &tmp.score);//注意后两个要取地址,name因为是数组名,不用取地址符号
	//打印tmp观察内容:
	printf("结构体tmp的内容:%s %d %.2f\n", tmp.name, tmp.num, tmp.score);

	return 0;
}

输出结果:
在这里插入图片描述

总结

以上就是三组输入输出函数的对比与使用,在实际使用中,根据程序的需要进行选择。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:59:31  更:2022-04-06 16:00:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:53:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码