C语言-printf和scanf的区别详解

fprintf(指定的格式写到文件里面。适用于所有的输出流,可以打印在屏幕上面)+fscanf(指定的格式读取出来,适用于所有的输入流)

 fprintf(指定的格式写到文件里面)

两个函数是一样的

打开文件

写文件 fprintf以指定的格式写到信息里面

同时这里是文本的形式写进去的 因为我们都读得懂

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct MyStruct
{
	char name[20];
	int age;
};
int main()
{
	struct MyStruct s = { "张三",23 };
	FILE* ps = fopen("fprintf.txt", "w");//这里我们进行写入一个文件,没有的话会自动创建一个文件
	if (ps == NULL)
	{
		perror("fopen:w:");
		return 1;
	}
	fprintf(ps, "%s %d", s.name, s.age);//以指定格式写入文件
	fclose(ps);//关闭文件
	ps = NULL;//指针指向空指针


	return 0;
}

—————————————————————————————————————————— 

fscanf(指定的格式读取出来,适用于所有的输入流)

同理这个和scanf是一样的

数组名本身就是地址

fscanf

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct MyStruct
{
	char name[20];
	int age;
};
int main()
{
	struct MyStruct s = { "张三",23 };
	FILE* ps = fopen("fprintf.txt", "w");
	if (ps == NULL)
	{
		perror("fopen:w:");
		return 1;
	}
	//这里是把内容写到文件里面
	fprintf(ps, "%s %d", s.name, s.age);//写入文件
	fclose(ps);
	ps = NULL;


	//只读,因为你剩下的操作是文件读取,所以这里不行w,但是可以是只读,读取文件
	FILE* pf = fopen("fprintf.txt", "r");
	if (pf == NULL)
	{
		perror("fopen:r:");
		return 1;
	}
	//这里是读取内容,不读取是无法直接打印文件内容的
	fscanf(pf, "%s %d", s.name, &(s.age));//数组首元素就是地址 不需要取地址 ,此时也就是读取成功

	printf("%s %d\n", s.name, s.age);//表纯输出流打印文件

	fprintf(stdout, "%s %d\n", s.name, s.age);//指定输出流,打印文件
	fclose(pf);
	pf = NULL;

	return 0;
}

———————————————————————————————————————————

fprintf(可以打印在屏幕上面)

适用于所有的输出流,可以打印在屏幕上面

也就是你可以用fprintf写写入里面,用fscanf进行读取,再用fprintf进行打印

当然这里前面的参数是文件,我们指向的是文件,然后才能打印出来

stdout(补充说明)

stdout 是 C 标准库中的一个文件流,代表标准输出。标准输出通常指的是计算机屏幕,但它也可以被重定向到其他地方,比如一个文件。在 C 语言中,stdout 用于打印程序的输出信息,比如 printf 函数和 fprintf 函数输出的内容。

当你调用 printf 或者 fprintf 函数时,如果不指定文件指针参数,这些函数会默认使用 stdout 作为输出目标。例如:

printf("Hello, World!");

这行代码会将在 stdout 上打印 "Hello, World!"。默认情况下,stdout 指向控制台(屏幕),所以你会在屏幕上看到输出。

你还可以将 stdout 重定向到文件。例如,你可以使用系统命令行将输出重定向到文件:

./program > output.txt

这会使得 program 程序的标准输出被重定向到 output.txt 文件,而不会在屏幕上显示任何内容。

在 C 程序中,你也可以显式地将输出写入 stdout:

fprintf(stdout, "This will go to the screen or a file if redirected.\n");

因为这个不是标准输出流,是指定输出流,所以我们可以指定格式。

这里我们发现我们可以用fprintf函数打印出来

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct MyStruct
{
	char name[20];
	int age;
};
int main()
{
	struct MyStruct s = { "张三",23 };
	FILE* ps = fopen("fprintf.txt", "w");
	if (ps == NULL)
	{
		perror("fopen:w:");
		return 1;
	}
	//这里是把内容写到文件里面
	fprintf(ps, "%s %d", s.name, s.age);//写入文件
	fclose(ps);
	ps = NULL;


	//只读,因为你剩下的操作是文件读取,所以这里不行w,但是可以是只读,读取文件
	FILE* pf = fopen("fprintf.txt", "r");
	if (pf == NULL)
	{
		perror("fopen:r:");
		return 1;
	}
	//这里是读取内容,不读取是无法直接打印文件内容的
	fscanf(pf, "%s %d", s.name, &(s.age));//数组首元素就是地址 不需要取地址 

	printf("%s %d\n", s.name, s.age);//表纯输出流打印文件

	fprintf(stdout, "%s %d\n", s.name, s.age);//指定输出流,打印文件
	fclose(pf);
	pf = NULL;

	return 0;
}

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

sprintf(指定格式转化成字符串)+sscanf(字符串转化成指定格式)

sprintf(指定格式转化成字符串)

格式化的数据转化成字符串sprintf

sprintf 是一个在 C 语言中定义的函数,它的作用是将格式化的字符串和参数转换成字符串,并将结果存储在指定的字符数组中。因此,sprintf 可以用来将文件中的文档内容转化成字符串,也可以用来将刚编写的结构体代码转化为字符串。具体使用方式取决于程序的具体需求。 

这里已经转化为字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct MyStruct
{
	char name[20];
	int age;
};
int main()
{
	struct MyStruct s = { "张三",23 };
	FILE* ps = fopen("fprintf.txt", "w");
	if (ps == NULL)
	{
		perror("fopen:w:");
		return 1;
	}
	//这里是把内容写到文件里面
	fprintf(ps, "%s %d", s.name, s.age);//写入文件
	fclose(ps);
	ps = NULL;


	//只读,因为你剩下的操作是文件读取,所以这里不行w,但是可以是只读,读取文件
	FILE* pf = fopen("fprintf.txt", "r");
	if (pf == NULL)
	{
		perror("fopen:r:");
		return 1;
	}
	//这里是读取内容,不读取是无法直接打印文件内容的
	fscanf(pf, "%s %d", s.name, &(s.age));//数组首元素就是地址 不需要取地址 

	//转化为字符串的形式
	char buf[100] = { 0 };//因为是转化成字符串的形式,所以需要用一个数组进行接收
	sprintf(buf, "%s %d", s.name, s.age);
	printf("字符串打印:  %s \n", buf);
    
    fclose(pf);
	pf = NULL;

	return 0;
}

———————————————————————————————————————————

sscanf(字符串转化成指定格式)

sscanf语法说明

这里是 从结构体读取数据

这里是从buf里面读取

所以sscanf也就是前面加上一个需要读取的名称

两次打印的对比,一样的,但是此时已经不是字符串的格式已经是指定的格式了

 代码总结

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct MyStruct
{
	char name[20];
	int age;
};
int main()
{
	struct MyStruct s = { "张三",23 };
	FILE* ps = fopen("fprintf.txt", "w");
	if (ps == NULL)
	{
		perror("fopen:w:");
		return 1;
	}
	//这里是把内容写到文件里面
	fprintf(ps, "%s %d", s.name, s.age);//写入文件
	fclose(ps);
	ps = NULL;


	//只读,因为你剩下的操作是文件读取,所以这里不行w,但是可以是只读,读取文件
	FILE* pf = fopen("fprintf.txt", "r");
	if (pf == NULL)
	{
		perror("fopen:r:");
		return 1;
	}
	//这里是读取内容,不读取是无法直接打印文件内容的
	fscanf(pf, "%s %d", s.name, &(s.age));//数组首元素就是地址 不需要取地址 

	//转化为字符串的形式
	char buf[100] = { 0 };//因为是转化成字符串的形式,所以需要用一个数组进行接收
	sprintf(buf, "%s %d", s.name, s.age);
	printf("字符串打印:  %s \n", buf);

	//字符串转化为带有格式的形式
	sscanf(buf, "%s %d", s.name, &(s.age));//我们这里还是这个格式, 把数组转化成格式给到结构体里面
	fprintf(stdout, "按照格式打印:%s %d\n", s.name, s.age);//指定输出流,打印文件
	fclose(pf);
	pf = NULL;

	return 0;
}

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

printf(标准输出流)+scanf(标准输入流)+函数的总结

这里说明一下,printf和scanf经常使用,就不详细举例,直接进行说明。

在C语言中,printf、fprintf、sprintf、scanf、sscanf和fscanf是用于输入和输出数据的函数。下面是它们的区别和通常的使用场景:

  1. printf
    • printf函数用于将格式化的数据输出到标准输出(通常是终端或控制台)。
    • 它不会在输出字符串的末尾添加换行符,所以如果需要换行,需要在格式字符串中显式包含\n。
    • 示例:printf("Hello, World!\n"
  1. fprintf
    • fprintf函数用于将格式化的数据输出到任意指定的文件指针(FILE *)。
    • 它可以将数据输出到文件、网络流等。
    • 示例:FILE *fp = fopen("file.txt", "w"); fprintf(fp, "Hello, World!\n"); fclose(fp);
  1. sprintf
    • sprintf函数用于将格式化的数据输出到一个字符数组或字符串。简单的说就是转化成字符串格式
    • 它不会在输出字符串的末尾添加换行符。
    • 示例:char buffer[100]; sprintf(buffer, "Hello, World!\n"); printf("%s", buffer);

  1. scanf
    • scanf函数用于从标准输入(通常是键盘)读取格式化的数据。
    • 它等待用户输入,并根据指定的格式解析输入的数据。
    • 示例:int num; scanf("%d", &num); printf("You entered: %d\n", num);
  1. sscanf
    • sscanf函数用于从字符串中读取格式化的数据。可以把字符串转化为任何你需要的格式
    • 它将字符串中的数据按照指定的格式解析成变量。
    • 示例:char str[] = "1234"; int num; sscanf(str, "%d", &num); printf("You entered: %d\n", num);
    • 可以把字符串转化为任何你需要的格式
  1. fscanf
    • fscanf函数用于从任意指定的文件指针读取格式化的数据。
    • 它可以从文件、网络流等读取数据。
    • 示例:FILE *fp = fopen("file.txt", "r"); int num; fscanf(fp, "%d", &num); fclose(fp); printf("You entered: %d\n", num);

格式化的数据就是带有格式的数据

比如整形 字符 浮点型

看到结构体不方便 需要转化为字符串 那就是 sprintf

需要转化回来 那就用sscanf, fscanf

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值