前言
scanf、fscanf、sscanf / printf、fprintf、sprintf 这些函数长得都挺像的,它们分别都是干什么的呢?本篇博客将对这些格式化输入输出函数进行一个讲解。本篇为文件操作章节的延申,新手建议学过文件操作后观看
一、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 把一个格式化的数据转换成字符串