C语言 scanf/fscanf/sscanf 和 printf/fprintf/sprintf 区别
看了B站上比特鹏哥的C语言视频,在讲到“文件操作”章节内容的时候,讲到了对比 scanf/fscanf/sscanf 和 printf/fprintf/sprintf 这6个函数,觉得讲的不错,理解起来比起其他文章更加通俗易懂,所以记录下来,分享给大家。
代码运行环境:window10,visual studio 2019
结论:
scanf / printf
是针对标准输入流/标准输出流的 格式化输入/输出语句 (这里的标准输入流针对的是stdin,指的是从键盘获取的输入数据,标准输出流针对的是stdout,是指从屏幕打印出来的数据)
fscanf / fprintf
是针对所有输入流/所有输出流的 格式化输入/输出语句(这里所有输入流出了包含标准的输入流外,还包含文件输入流,所有输出流包含了标准的输出流外,还包含文件输出流)
sscanf / sprintf
sscanf是从字符串中读取格式化的数据(简单的理解,就是从字符串中提取想要的信息在转换成格式化的数据)
sprintf是把格式化数据输出成(存储到)字符串(简单的理解,就是提取格式化数据中想要的信息转换成字符串)
代码示例:
1. scanf / printf (针对标准输入流 stdin / 标准输出流 stdout)
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 struct S {
5 int n;
6 float score;
7 char arr[10];
8 };
9
10 int main() {
11 struct S s = { 0 };
12 scanf("%d %f %s", &(s.n), &(s.score), s.arr); // 从键盘输入数据
13 printf("%d,%f,%s", s.n, s.score, s.arr); // 从控制台输出数据
14 return 0;
15 }
代码运行结果:
2. fscanf / fprintf (针对所有输入流 / 所有输出流)
(1)文件流的格式化输入
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 struct S {
5 int n;
6 float score;
7 char arr[10];
8 };
9
10 int main() {
11 struct S s = { 100, 3.14f, "bit" }; // 如果不加f,就默认是double类型
12 FILE* pf = fopen("test.txt", "w");
13 if (pf == NULL) {
14 return 0;
15 }
16 // 格式化的形式写文件
17 fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
18
19 fclose(pf);
20 pf = NULL;
21 return 0;
22 }
(2)文件流的格式化输出
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 struct S {
5 int n;
6 float score;
7 char arr[10];
8 };
9
10 int main() {
11 struct S s = { 0 }; // 这边数据放0,因为希望读一个信息放入s中
12 FILE* pf = fopen("test.txt", "r");
13 if (pf == NULL) {
14 return 0;
15 }
16 // 格式化的输入数据
17 fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
18 printf("%d, %f, %s\n", s.n, s.score, s.arr);
19
20 fclose(pf);
21 pf = NULL;
22
23 return 0;
24 }
代码运行结果:
(3)标准输入流和输出流的格式化输入输出
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 struct S {
5 int n;
6 float score;
7 char arr[10];
8 };
9
10 int main() {
11 struct S s = { 0 };
12
13 fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);
14 fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);
15
16 return 0;
17 }
代码运行结果:
3. sscanf / sprintf (字符串和格式化数据相互转换)
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 struct S {
5 int n;
6 float score;
7 char arr[10];
8 };
9
10 int main() {
11 struct S s = { 100, 3.14f, "abcdef" };
12 char buf[1024] = { 0 };
13 // 把格式化的数据转换成字符串存储到buf,通过使用sprinf:把一个格式化的数据写到字符串中去
14 sprintf(buf, "%d - %f - %s", s.n, s.score, s.arr);
15 printf("%s\n", buf);
16
17 struct S tmp = { 0 };
18 // 从buf中读取格式化的数据到tmp中
19 sscanf(buf, "%d - %f - %s", &(tmp.n), &(tmp.score), tmp.arr); // 读取的时候格式要相对应: - -
20 printf("%d, %f, %s\n", tmp.n, tmp.score, tmp.arr);
21
22 return 0;
23 }
代码运行结果:
参考资料: https://www.bilibili.com/video/BV1q54y1q79w?p=73&vd_source=acfeb201256ec13951609fc4eebb2ca0