一、 printf fprintf sprintf
三个函数的头文件均是stdio.h
int printf(const char *format[,argument]...);
int fprintf(FILE *stream, const char *format[,argument]...);
int sprintf(char *buffer, const char *format[,argument]...);
fprintf只比printf多了一个FILE的指针
sprintf只比printf多了一个char的指针
1.fprintf使用
fscanf是读文件的,那对应的fprintf当然是写文件的了,fprintf可以把数据写入文件中,借助的是第一个参数(FILE*的指针)
例如:
struct S
{
char name[20];
int age;
char sex[20];
};
int main()
{
struct S s = { "ccl", 19, "boy" };//初始化结构体作为写入文件的内容
//打开文件
FILE* pf = fopen("D:\\test.txt", "w");//"w"写文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
fprintf(pf, "%s %d %s", s.name, s.age, s.sex);//把数据写入文件
fclose(pf);//关闭文件
pf = NULL;//置空
return 0;
}
注:
"w"写之前会清空文件里的内容
fprintf的作用:
官方一点:发送格式化输出到流 stream 中
简单一点:把数据写入文件(但是文件流不只是文件,c++可以定义文件流,所以只是浅谈 )
2.sprintf的使用
sprintf只比printf多一个char*指针,后面参数同printf。
sprintf的作用:
官方点: sprintf的作用是将一个格式化的字符串输出到一个目的字符串中
参数里的buffer指针就是指向目的字符串的
简单点:把数据输出到一个字符串
int main(){
char a[52];
sprintf(a,"%d", 1234);
printf("%s\n", a);
return 0;
}
printf是将格式化输出到屏幕,fprintf和sscanf输出的去处不同而已
fprintf的去处是文件,sprintf的去处则是字符串
从这个角度就可以理解为什么fprintf的第一个参数是FILE的指针,而sprintf的第一个参数是char的指针
二、 scanf fscanf sscanf
int scanf(const char *format[,argument]...);
int fscanf(FILE *stream, const char *format[,argument]...);
int sscanf(char *buffer, const char *format[,argument]...);
1.fscanf
fscanf的作用:从文件中读入数据 赋值给变量
fscanf(stdin,...)等同于scanf(...)
stdin是标准输入流 也就是键盘 本质也是一个文件流
int main(){
int a = 10;
sscanf(stdin,"%d", &a);
printf("%d\n", a);
return 0;
}
注:避免从文件中读入中文 会出现乱码的情况
中文的编码不是单纯的ASCII码 中文有自己的编码标准
如果想要成功读取 就要改一下编码规则
这里以txt为扩展名的文件为例
把文本文件的UTF-8改为ANSI即可成功读取
2.sscanf
sscanf和scanf对比只多了一个buffer指针
官方点:从一个字符串中读入格式化的数据
简单点:从字符串中读入要的数据 (这也是为什么参数必须时字符指针的一个原因)
默认读入是从stdin中读入,在这读入来源改成了字符串而已.
sscanf可以实现切割字符串等常见的字符串操作
fscanf可以让我们从文件中拿到想要的数据