5.fprintf--针对所有输出流(文件流/stdout)的格式化输出函数
以下可以看到fprintf只是比printf多了一个流指针的参数而已。
与printf的区别:printf是针对标准输出流 (stdout) 的格式化的输出函数
假设要把struct S s = { 100,3.14f,"zhangsan" };信息打印出来那应该怎么写呢?
那就应该先写成printf("%d %f %s\n", s.n, s.f, s.arr);,然后在前面加个参数改成fprintf(pf,"%d %f %s\n", s.n, s.f, s.arr)即可
#include<stdio.h> struct S { int n; float f; char arr[20]; }; int main() { struct S s = { 100,3.14f,"zhangsan" }; //打开文件 FILE* pf = fopen("test.txt", "w"); if (NULL == pf) { perror("fopen"); return 1; } //写文件 fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr); //关闭文件 fclose(pf); pf = NULL; return 0; }
输出:
6.fscanf -- 针对所有输入流(文件流/stdin)的格式化输入函数
跟fprintf传的文件流指针是一样的
与scanf的区别:是针对标准输入流 (stdin)的格式化的输入函数
#include<stdio.h> struct S { int n; float f; char arr[20]; }; int main() { struct S s = { 100,3.14f,"zhangsan" }; //打开文件 FILE* pf = fopen("test.txt", "w"); if (NULL == pf) { perror("fopen"); return 1; } //写文件 fscanf(pf, "%d %f %s",&(s.n),&(s.f),s.arr);//数组名arr是首元素地址,所以不需要取地址操作符 printf("%d %f %s\n", s.n, s.f, s.arr); //关闭文件 fclose(pf); pf = NULL; return 0; }
执行:
为什么需要用到"流"?
前提:如何把数据写进入外部设备,需要对每一种外部设备的操作比较多的了解,例如数据是怎么写进入文件、屏幕、网络、打印机等外部设备,都得知道它们的实现细节(读和写的细节),对于程序员来说太难了。
流的概念: 这时候抽象化了一个概念“流”,"流"知道怎么把数据写进各种外部设备的细节,那对于程序员而言,要读取数据就从流里面读,要写数据就写到流里面就可以了,至于这个流怎么跟外部设备交互的是不需要关心的。
流的种类:
stdin标准输入流 stdou标准输出流 stderr标准错误流都是FILE*的指针
stdin和stdout的适用情况
回到前面的输入输出函数:
fgetc、fgets、fscanf均适用于文件流以及标准输入流 -- stdin
fputc、fputs、fprintf均适用于文件流以及标准输出流 -- stdout
1.fgetc测试:
#include<stdio.h> int main() { int ch = fgetc(stdin);//输入 printf("%c\n", ch); return 0; }
执行:以下是输入一个字符和输出的情况
2.fputc测试:
int main() { fputc('a', stdout);//输出 fputc('f', stdout); fputc('g', stdout); fputc('z', stdout); return 0; }
执行:
3.fprintf测试:
int main() { struct S s = { 1000,3.666f,"hehe" }; fprintf(stdout,"%d %f %s\n",s.n,s.f,s.arr); return 0; }
执行:
4.fscanf测试:
int main() { struct S s = { 0 }; fscanf(stdin, "%d %f %s",&(s.n),&(s.f),s.arr); fprintf(stdout, "%d %f %s\n", s.n, s.f, s.arr); }
7.sscanf和sprintf
sscanf文献
翻译:
sprintf文献
翻译:
sscanf--把字符串转换成格式化的数据
sprintf--把格式化的数据转换成字符串
struct S { int n; float f; char arr[20]; }; int main() { //序列化和反序列化 struct S s = { 200,3.5f,"wangwu" }; //把一个结构体转换成字符串 char arr[200] = { 0 }; sprintf(arr, "%d %f %s\n", s.n, s.f, arr); printf("字符串的数据: %s\n", arr); //把一个字符串转换成对应的格式化数据 struct S tmp = { 0 }; sscanf(arr, "%d %f %s", &(tmp).n, &(tmp.f), &tmp.arr); printf("格式化的数据:%d %f %s\n", tmp.n, tmp.f, tmp.arr); return 0; }
执行:
关于文件操作的知识还有下半篇,欢迎大佬指正,感谢支持!