2.fgets和fputs
2.1认识fgets和fputs
fgets的作用是从流中读取字符串,并将其存放到指定的字符数组中 它有三个参数,第一个是用来储存从流中读取到的字符串的变量,第二个参数num的含义指的是最多只能够从中取出num-1个字符,这里笔者认为是因为fgets这个函数它会自动地在取得的字符后加'\0',因为没有'\0'的话,这个也就不能被称为字符串了,它在打印的过程中就会打印出一系列的随机值直到遇到'\0'才会停下。所以把'\0'也算上的话就是取出num大小的字符串。第三个参数则是对应的流,你想从哪儿取数据出来,就传哪儿的流。fgets返回的值类型为一个字符型指针,如果传字符串成功它会返回str的地址,失败则返回NULL
fputs的作用则是将字符串放进对应的流中 它的参数很简单就两个,一个是你要放进去的字符串的地址,一个是被放入的流fputs如果成功写入数据,它的返回值为一个正数,如果写入失败,它的返回值则为一个负数。
2.2使用fgets和fputs
老样子,我们先用fputs往文件中存放一个字符串,存放之前文件已被清空。
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } fputs("今天天气真好", pf); //将这个字符串写进abcd.txt中 fclose(pf); pf = NULL; }
运行结果如下:
由于一个汉字占两个字节,不好展示fgets,所以我们在这个文件中随便存放一些字母,并通过fgets把它们取出,在abcd.txt中存放I am a student,并使用fgets从中取6个字符(不算'\0'),并将其打印
运行结果如下:
确实取出了六个字符,给str写很多个x,并通过监视观察
确实是将'\0'也存放进去了。
3.fread和fwrite
3.1认识fread和fwrite
fread的作用是以二进制的形式从流中读取count个大小为size的内容并将内容存放到ptr中。
fwrite的作用是以二进制的形式将count个大小为size的内容从ptr中取出,并放进对应的流中。
3.2使用fread和fwrite
老样子,先使用fwrite对文件的内容进行修改,文件中是没有任何内容的
代码如下:
#include<stdio.h> struct abc { int a; float b; };//创建一个名字为struct abc类型的结构体 int main() { FILE* pf = fopen("abcd.txt","wb"); if (pf == NULL) { perror("fopen"); //错误警告 return 1; } struct abc a1 = { 100,3.14f }; fwrite(&a1,sizeof(struct abc),1,pf); //将1个大小为struct abc的写进pf中 fclose(pf);//关闭文件 pf = NULL;//将野指针置为空指针 }
运行程序,结果如下:
我去,这是啥啊这是,看不懂啊,我们存的不是100和3.14吗。不要大惊小怪,之所以会看不懂,那是因为我们储存的信息是二进制信息,我们将这其中的信息以二进制的方式存放到了abcd.txt这个文件中。
使用fread,以二进制的形式读取数据,文件中的内容还是之前存放的二进制数据
代码如下:
#include<stdio.h> struct abc { int a; float b; };//创建一个名字为struct abc类型的结构体 int main() { FILE* pf = fopen("abcd.txt", "rb"); //以二进制只读的方式打开一个名为abcd.txt的文件 if (pf == NULL) { perror("fopen"); return 1; } struct abc a1 = {0}; fread(&a1, sizeof(struct abc), 1, pf); //以二进制的方式将1个大小为struct abc的内容从pf所指向的指针内容中取出,放在a1这个结构体中 printf("%d %f", a1.a, a1.b); //将内容打印出来 fclose(pf); pf = NULL; }
运行结果如下:
fread成功地将二进制信息转换成了我们需要的内容。