前言:
scanf、fscanf、sscanf / printf、fprintf、sprintf 这些函数长得都挺像的,它们分别都是干什么的呢?本篇博客将对这些格式化输入输出函数进行一个讲解。本篇为文件操作章节的延申,新手建议学过文件操作后观看,如果你还没有学文件操作可以先看以下两篇讲解文件操作的博客:
【维生素C语言】文件操作(上)本章为文件操作教学上篇,由浅入深的引入问题,然后逐一介绍知识。将详细讲解文件的打开和关闭、文件的顺序读写并精讲函数部分,初步学习“流”的概念!https://blog.csdn.net/weixin_50502862/article/details/119715195?spm=1001.2014.3001.5501【维生素C语言】文件操作下本章为文件操作教学下篇,将对文件的随机读写进行讲解,详细探讨上篇提到的文本文件和二进制文件。探究文件读取结束的判定、文件缓冲区等问题。https://blog.csdn.net/weixin_50502862/article/details/119807906?spm=1001.2014.3001.5501
一、printf / fprintf / sprintf
0x00 printf 函数
📂 头文件:#include <stdio.h>
📚 针对标准输出的格式化输出语句 - stdout
🔍 MSDN介绍:printf - C++ Reference
💬 代码演示:printf 的用法
#include <stdio.h>
int main(void) {
printf("Hello,World!\n");
int a = 100;
printf("a=%d", a);
return 0;
}
🚩 运行结果如下:
0x01 fprintf 函数
📂 头文件:#include <stdio.h>
📚 针对所有输出流的格式化输出语句 - stdout / 文件
🔍 MSDN介绍:fprintf - C++ Reference
💬 代码演示:随便创建一个文件,在文件中写入一段话
#include <stdio.h>
char data[] = "Hey, nice to meet you~";
int main(void) {
FILE* pf = fopen("test1.txt", "w");
if (pf == NULL) {
perror("fopen");
return 1;
}
// 使用fprintf写文件
fprintf(pf, "%s", data);
fclose(pf);
pf = NULL;
return 0;
}
🚩 (代码成功运行)
0x02 sprintf 函数
📂 头文件:#include <stdio.h>
📚 作用:把一个格式化的数据转换成字符串。
🔍 MSDN介绍:sprintf - C++ Reference
💬 代码演示:sprintf 的用法
#include <stdio.h>
struct S {
char arr[10];
int age;
float f;
};
int main(void) {
struct S s = { "hello", 20, 3.14f };
char buffer[100] = { 0 }; // 用于存放
sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了
printf("%s\n", buffer); // 将buffer打印出来
return 0;
}
🚩 运行结果如下:
二、scanf / fscanf / sscanf
0x00 scanf 函数
📂 头文件:#include <stdio.h>
📚 针对标准输入的格式化的输入语句 - stdin
🔍 MSDN介绍:scanf - C++ Reference
💬 代码演示:scanf 的用法
#include <stdio.h>
int main(void) {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("a=%d, b=%d\n", a, b);
return 0;
}
🚩 输入10 20,运行结果如下:
0x01 fscanf 函数
📂 头文件:#include <stdio.h>
📚 针对所有输入流的格式化输入语句 - stdin / 文件
🔍 MSDN介绍:fscanf - C++ Reference
💬 代码演示:fscanf 的用法
#include <stdio.h>
int data; // 存放读到的数据
int main(void) {
FILE* pf = fopen("test.txt", "r");
if (pf == NULL) {
perror("fopen");
return 1;
}
// 使用fscanf读文件
fscanf(pf, "%d", &data);
// 将读到的数据打印
printf("%d\n", data);
fclose(pf);
pf = NULL;
return 0;
}
🚩 运行结果如下:
0x02 sscanf 函数
📂 头文件:#include <stdio.h>
📚 作用:从一个字符串中读取一个格式化的数据。
🔍 MSDN介绍:sscanf - C++ Reference
💬 代码演示:利用 sscanf 从 buffer 字符串中还原出结构体的数据
#include <stdio.h>
struct S {
char arr[10];
int age;
float f;
};
int main(void) {
struct S s = { "hello", 20, 3.14f };
struct S tmp = { 0 };
char buffer[100] = { 0 };
sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了
printf("%s\n", buffer);
// 从buffer字符串中还原出一个结构体数据
sscanf(buffer, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.f));
printf("%s %d %f\n", tmp.arr, tmp.age, tmp.f);
return 0;
}
🚩 运行结果如下:
三、总结
scanf 针对标准输入的格式化的输入语句 - stdin
fscanf 针对所有输出流的格式化的输出语句 - stdin / 文件
sscanf 从一个字符串中读取一个格式化的数据
printf 针对标准输出的格式化输出语句 - stdout
fprintf 针对所有输出流的格式化输出语句 - stdout / 文件
sprintf 把一个格式化的数据转换成字符串
参考资料:
Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
本章完。