认识自己的无知是认识世界的最可靠的方法。
——蒙田《随笔集》
目录
上一篇文章我们讲了基本的文件输入输出函数 以及文件操作,现在我再来补充几个函数。
1 .补充:
fprintf函数和fscanf函数
fprintf函数和printf函数是非常类似的;
我们对比一下,他们的返回值都是int,并且后面的参数相同,不同的只有fprintf函数的第一个参数不同。
那我们想想printf函数是怎么用的呢,下面我们试着来写一下
int a=0;
char b=0;
printf("%d %d ",a,b);
这是我们最常使用printf函数的用法,那么fprintf函数是怎么用的呢;
完整代码展示:
struct S { char name[20]; int age; float score; }; int main() { struct S s = { "zhangsan", 20, 95.5f }; //把s中的数据写到文件中 FILE* pf = fopen("test.txt", "w"); if (NULL == pf) { perror("fopen"); return 1; } //写文件 fprintf(pf, "%s %d %.1f", s.name, s.age, s.score); fclose(pf); pf = NULL; return 0; }
可以看到fprintf函数在使用的时候,第一个参数加了pf,这就会将我们的数据写到我们的文件中
注:此处代码若有疑问,请看上一篇文章
或者评论区留言
运行结果:
可以看到我们的数据已经写到了文件中,这就是fprintf函数的用法,是不是超级简单。
下面是fscanf函数:
可以看出他们两个函数又是只多了一个文件指针这个参数
老规矩,我们还是来回忆一下scanf函数的用法
int a=0
scanf("%d",&a);
这是我们最常使用scanf函数的用法,那么fscanf函数是怎么用的呢;
完整代码:
//读取一个结构体数据 struct S { char name[20]; int age; float score; }; int main() { struct S s = {0}; //把s中的数据写到文件中 FILE* pf = fopen("test.txt", "r"); if (NULL == pf) { perror("fopen"); return 1; } //读文件 fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score)); printf("%s %d %f\n", s.name, s.age, s.score); fclose(pf); pf = NULL; return 0; }
此处我们可以看到,fscanf函数后面第一个参数是pf,意思是从文件中读取数据,然后我们输出出来;
运行结果:
可以看到我们此前没有在文件中写入数据,但是从文件中读取了出来,这就是fscanf函数;
2. 对比一组函数
对于上面一组函数,我想你们肯定会有疑问,这几个函数有什么区别呢,有什么用呢?下面我来为大家讲解一下
首先,我先来讲解一下各个函数是干什么的
scanf函数:他是按照一定的格式输入数据,从键盘获取
printf函数;按照一定的格式,把数据打印到屏幕上
他们两个函数都是格式化的输入/输出语句
fprintf函数:按照一定的格式向输出流(文件)输出数据
fscanf函数:按照一定的格式从输入流(文件)输入数据
// 适用于所有的输入/输出流的格式化输入/输出语句
sprintf函数是按照一定的格式将数据转换成 str 字符串;
下面请看例子:
struct S { char name[10]; int age; float score; }; int main() { char buf[100] = {0}; struct S tmp = { 0 }; struct S s = { "zhangsan", 20, 95.5f }; //能否把这个结构体的数据,转换成字符串 //"zhangsan 20 95.5" sprintf(buf, "%s %d %f", s.name, s.age, s.score);//以字符串的形式打印 printf("%s\n", buf); }
运行结果:
可以看到sprintf函数可以把格式化数据按照指定的格式转化成字符串,这就是sprintf函数的功能;那么我们可以不可以在转化回来呢,那就需要用到sscanf函数了;
sscanf函数是将字符串转换成一定的格式的数据;下面请看示例
代码展示:
struct S { char name[10]; int age; float score; }; int main() { char buf[100] = {0}; struct S tmp = { 0 }; struct S s = { "zhangsan", 20, 95.5f }; //能否把这个结构体的数据,转换成字符串 //"zhangsan 20 95.5" sprintf(buf, "%s %d %f", s.name, s.age, s.score);//以字符串的形式打印 printf("%s\n", buf); //能否将buf中的字符串,还原成一个结构体数据呢? sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score)); printf("%s %d %f\n", tmp.name, tmp.age, tmp.score);//以结构的形式打印 return 0; }
这里我们定义一个struct tmp,
sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
这段代码的意思是从buf里面按照"%s %d %f"格式 还原出 定义的结构体的数据 并 存放到tmp中
请看运行结果:
可以看到两次打印结果一样,说明我们可以将一个结构体数据转化成字符串,也可以将字符串提取数据放在结构体当中。
- sscanf函数:从字符串中按照一定的格式读取出格式化数据
- sprintf函数:把格式化的数据按照一定的格式转化成字符串
此次顺序读写完结,往后会更新文件的随机读写。
欢迎各位大佬指点!!!!