文件的三种缓冲方式
行缓冲
碰到换行符才刷新缓冲区
全缓冲
标准io库函数,往普通文件读写数据的,是全缓冲的
碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区
1、缓冲区满了刷新
2、认为刷新缓冲区 fflush(文件指针)
3、程序正常结束后会刷新缓冲区
无缓冲
在读写数据的时候通过系统调用io(read write),对文件进行读写
即写数据会立马进入文件,读数据会立马进入内存
流程
应用程序空间——>内核空间——>驱动程序——>硬盘
应用程序和内核程序在不同的空间里,目的是为了保护内核
设置缓冲区的目的
通过缓冲可以减少进出内核的次数,以提高效率
磁盘文件的分类
文本文件:
1、基于字符编码的文件,常见编码有ASCII、UNICODE等,一般可以直接用文本编辑器直接打开
2、文本文件编码基于字符定长,译码容易些
3、文本文件用通用的记事本就几乎可以浏览所有文本文件
4、文本文件任何一个意思至少是一个字符
二进制文件
1、计算机的存储在物理上是二进制的
2、基于值编码的文件
3、把内存中的数据按其在内存中的存储形式原样输出到磁盘上
4、二进制文件编码是变长的,译码难一些
5、二进制文件用一个比特来代表一个意思(位操作)
6、二进制文件空间利用率高
7、二进制文件需要具体的文件解码器
总结
文件在硬盘上存储的时候,物理上都是用二进制来存储的
操作文件时,是按照字节对文件来进行读写的,所以管文件又叫流文件,即把文件看做一个字节流
文件指针
文件指针就是用于表示一个文件的,所有对文件的操作都是用对文件指针进行操作的
文件指针形式
定义方式:FILE *指针变量标识符(FILE必须为大写)
对文件操作的步骤
1、对文件进行读写等操作之前要打开文件得到文件指针
FILE *pf=NULL;
pf=fopen("test.txt","w+");//只读
2、读写操作
3、关闭文件
fclose(pf);
打开文件fopen
说明:fopen函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针或创建一个文件并打开此文件,然后返回文件的标识,即指针
参数1:打开文件的路径 需要加“”
参数2:文件打开的方式
关闭文件
fclose(文件指针)
一个文件只能关闭一次,不能多次关闭
成功返回0
失败返回非0
读写文件
fgetc:
fgetc(ch,200,pf); 一次读一个字符 文件中读一个字符给ch 200次
成功返回0
失败返回EOF
fgets:
fgets(ch,n,pf); 读字符串 碰到换行或者末尾结束,或读取了n-1个字符结束,在读取的内容后面会加一个\0,作为字符串的结尾
成功返回目的数组的首地址
失败返回NULL
fread:
从参数4中读取数据,一次是参数2个字节,共参数3块,存放到参数1指向的内存里
返回值:实际读到的块数
fwrite:
将参数1的数据写入参数4中,一块是参数2个字节,一共参数3块
#include <stdio.h>
int main()
{
FILE *fp=NULL;
fp=fopen("test.txt","w");
fputc('A',fp);
fclose(fp);
fp=fopen("test.txt","a");
fputc('B',fp);
fclose(fp);
char ch;
fp=fopen("test.txt","r");
ch=fgetc(fp);
printf("%c\n",ch);
fclose(fp);
fp=fopen("test01.txt","w");
fputs("行也思君 ",fp);
fclose(fp);
fp=fopen("test01.txt","a");
fputs("坐也思君 ",fp);
fclose(fp);
char ch_1[20];
fp=fopen("test01.txt","r");
char *p=NULL;
p=fgets(ch_1,20,fp);
printf("%s\n",ch_1);
fclose(fp);
puts(p);
return 0;
}
结果
A
行也思君 坐也思君
行也思君 坐也思君
--------------------------------
Process exited after 0.02422 seconds with return value 0
请按任意键继续. . .