前言
在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 函数
函数原型:
int fscanf( FILE *stream, const char *format [, argument ]... );
int scanf( const char *format [,argument]... );
int fprintf( FILE *stream, const char *format [, argument ]...);
int printf( const char *format [, argument]... );
观察两组函数对比,发现fscanf和fprintf仅仅比scanf和printf函数多了一个参数,该参数就是文件指针或者标准输出输入流。
🍉 fprintf函数
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函数
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 };
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 函数
函数原型:
int sscanf( const char *buffer, const char *format [, argument ] ... );
int scanf( const char *format [,argument]... );
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(buf, "%s %d %.2f", s.name, s.num, s.score);
printf("字符串buf的内容:%s\n", buf);
sscanf(buf, "%s %d %f", tmp.name, &tmp.num, &tmp.score);
printf("结构体tmp的内容:%s %d %.2f\n", tmp.name, tmp.num, tmp.score);
return 0;
}
输出结果:
总结
以上就是三组输入输出函数的对比与使用,在实际使用中,根据程序的需要进行选择。
|