功能 | 函数名 | 适用于 |
---|---|---|
格式化输入函数 | scanf | 标准输入流 |
格式化输出函数 | printf | 标准输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
函数名 | 功能 |
---|---|
sscanf | 把一个字符串的信息转换成格式化的数据 |
sprintf | 把格式化的数据转换成字符串 |
scanf 是从键盘上输入格式化的数据。
printf 是格式化打印信息到终端上。
他俩是针对标准输入流和输出流的,格式化的输入或输出语句。
fscanf 和 fprintf 针对所有流的(fscanf所有输入流,fprintf所有输出流)格式化输出语句。
sscanf 和sprintf是把一个字符串的信息转换成格式化的数据,把格式化的数据转换成字符串
【 fscanf 】 【 fprintf 】
fscanf是适用于标准输入流的格式化输出函数。
fprintf是适用于所有输出流的格式化输出函数。
当然,这两个函数也适用于标准输入流和输出流。
使用scanf 和printf 写出代码:
int main()
{
int a = 0;
char arr[10] ={0};
double d = 0.0;
scanf("%d %s %lf",&a,arr,&d);
printf("%d %s %lf\n",a,arr,d);
return 0;
}
打印出:
然而,我们把它改成fscanf 和 fprintf 看会出现什么效果?
我们知道,他们的参数必然有一个流的参数,通过MSDN查看,
我们发现第一个参数是流,所以我们的代码在上面的基础可以写成:
int main()
{
int a = 0;
char arr[10] ={0};
double d = 0.0;
fscanf(stdin,"%d %s %lf",&a,arr,&d);
fprintf(stdout,"%d %s %lf\n",a,arr,d);
return 0;
}
我们发现结果跟使用printf 和scanf 一模一样。在这里我们是作用于输入流和输出流。
那么下面我们看看作用于文件又是什么样子?
int main()
{
int a = 0;
char arr[10] ={0};
double d = 0.0;
FILE* pf = fopen("test.txt","w"); //打开这个文件
fscanf(stdin,"%d %s %lf",&a,arr,&d);
fprintf(pf,"%d %s %lf\n",a,arr,d);
fclose(pf); //关闭pf
pf = NULL;
system("pause");
return 0;
}
这时候我们打开当前文件夹的text.txt文件,
会提示该文件被修改,我们选择“是”后,再打开text.txt文件,会发现,我们写的内容被打印在text.txt文件中。
如果我们又想将内容读出来写在屏幕上:
int main()
{
int a = 0;
char arr[10] ={0};
double d = 0.0;
FILE* pf = fopen("test.txt","r"); //打开这个文件
fscanf(pf,"%d %s %lf",&a,arr,&d);
fprintf(stdout,"%d %s %lf\n",a,arr,d);
fclose(pf); //关闭pf
pf = NULL;
system("pause");
return 0;
}
这就是fprintf 和 fscanf(注意区别代码之间的细节)
【sscanf 】和【 sprintf】
【sscanf】
从MSDN上了解:
从一个字符串中读取格式化的数据。
【sprintf】
从MSDN上了解:
写一个格式化的数据到一个字符串中。
那这个时候,我们就有可能把一个结构体转换成一个字符串,也有可能把一个字符串转换成结构体。
话不多说,上代码:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S stu = {"zhangsan",20,98.5};
char buf[100] = {0};
sprintf(buf,"%s %d %lf",stu.name,stu.age,stu.score );
//sprintf 的第一个参数是char *buffer我们把读的数据放到char *buffer 里。
printf("%s\n",buf); //再将其打印出来。
return 0;
}
这个时候我们已经将结构体完美的转换成了字符串。
当然也可以字符串转换为结构体:这个时候我们用函数sscanf.
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S stu = {"zhangsan",20,98.5};
struct S tmp = {0};
char buf[100] = {0};
sprintf(buf,"%s %d %lf",stu.name,stu.age,stu.score );
printf("%s\n",buf);
sscanf(buf,"%s %d %lf",tmp.name ,&(tmp.age),&(tmp.score));
//此时,我们已经把一个结构体变成了一个字符串,这个字符串存在于buf,我们现在要把buf里的字符串存到tmp里面去。这个函数可以从一个字符串中读一个格式化的数据,sscanf的第一个参数是buf,是我们从哪里读取数据。 //name是数组名,本来就是地址,&(tmp.age),&(tmp.score)这里要取地址,因为它是一个变量。
printf("%s %d %lf\n",tmp.name,tmp.age,tmp.score); //打印
return 0;
}
sscanf的第一个参数是const char *buffer,我们从const char *buffer里读取数据。