文件的顺序读取:
我们打开文件后 要使用文件操作函数 对文件与内存进行操作:>
① 第一个函数是用来从文件中读取一个字符
② 第二个函数是往文件中写入一个字符
fputc函数:
对于上面的函数后面适应的流 意思这样的:
我们的 C语言程序,只有运行起来,就默认打开三个流:
① stdin-标准输入流
② stdout-标准输出流
③ stderr-标准错误流
这三个流的类型也是FILE* 上面图片中 fputc(ch,p)如果把 p 换成 stdout 那么刚刚 写入的字母会打印到屏幕上:>
fgetc函数 :
fgetc函数 是从文件里面读取一个字符 读取完后这个文件指针会指向下一个字符 :>
就好像现在我们已经读取了 d 现在文件指针指向 e
从上面的图片我们可以看到这个函数返回的是读取到字符的ASCLL码值 如果文件读取结束或者读取失败会返回EOF
不知道大家注意到没有我上面fgetc返回的值是用int类型接收的 其实char类型来接受返回的ASCLL码值也是可以的 但是有一个点大家需要注意一下 我们这个函数读取结束或者读取失败会返回EOF嘛(EOF是-1) -1是整数 怎么可以用char类型来接受呢 所以这个时候既能接收ASCLL码值也能接收 整数 就是int类型了
puts函数:
就是把一个字符串 写入文件中
fgets函数:
同样的道理这个函数是从文件读取 一行 的字符串 (如果读取一次后这一行的数据没有读完的话 那么下一次再读取时还会继续读取这一行)
如图所示:第一个参数是内存中的空间 第二个参数是你要从文件中读取字符的个数 第三个参数是你打开文件返回的FILE*指针 (有个点要注意假如你读取的字符个数为n 那么你读取的个数是最高时为n-1) 如果读取结束或者读取失败 就会返回NULL
fprintf函数 fscanf函数:
刚刚说过读取字符写入字符的函数了 那我们对于格式化有格式的数据(比如结构体)又该怎么样内 这个时候就要用到 fprintf 和 fscanf 函数了
fprintf函数和printf函数和唯一的差别就是fprintf函数前面多了一个参数 -- 文件信息区的指针
同样 fscanf和 scanf函数的差别也是这样的
#include <stdio.h> struct stu { char arr[20]; int a; char b; }; int main() { struct stu s={"sdada",32,'a'}; FILE* p=fopen("data.txt","w"); assert(p); fprintf(p,"%s %d %c",s.arr,s.a,s.b); fclose(p); struct stu s1={0}; FILE* p=fopen("data.txt","r"); fscanf(p,"%s %d %c",s1.arr,&(s1.a),&(s1.b)); fclose(p); p=NULL;//其实如果为了保险起见这里也可以把p置为NULL;免得再使用它 }
fread函数 fwrite函数:
这两个函数 是用二进制进行读写
这个fwrite函数是用来往文件中写入数据 第①个参数是被写入的数据 第②个参数是单个元素的大小 第③个参数是元素的数量
这个时候写入文件里面 的是二进制的形式 我们肯定是读不懂的 除非把它读取出来
注意这里第一个参数是const void* 不知道大家知不知道 就是当我们编写一个函数且不知道参数应该是什么类型时 就用void*类型来接受 这样系统才不会报错 然后我们再在函数里面调整我们的数据类型
fread函数其实就是fwrite函数反过来参数的位置还是一样的 只是fread函数是从文件里面读取数据 fwrite函数是向文件中写入数据
注意fread函数 返回的是读取到的元素的个数 就好像你要读取3个 如果读取3个就返回3 读取2个就返回2 所以我们读取的时候 如果设定为只读取一个数据的话 那么如果多次读取直到没有数据读取元素个数返回0 读取就会结束 我们可以利用这种特性 来把文件中的数据一个不少的读取出来
有个小小的比较 大家试着比较一下scanf / fscanf / sscanf 以及他们对应的 printf / fscanf /sscanf 函数
①scanf函数是从标准输入流(stdin)上进行格式化输入的函数
printf函数是从标准输出流(stdout)上进行格式化输出的函数
②fscanf函数是从标准输入流/文件流上进行读取的函数
fprintf函数是向标准输出流/文件流上进行输出的函数
还有一个函数就留给大家自己思考啦 其实和上面的几个函数是一样的道理的