创建FILE类型指针,打开文件
FILE *fp;
fp = fopen("c:\\temp\\test.txt", "r");
此时fp只是拿到该文件的句柄。包括:
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //文件的起始位置
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf;//检查缓冲区状况,若无缓冲区则不读取
int _bufsiz; //缓冲区大小
char *_tmpfname;//临时文件名
};
typedef struct _iobuf FILE;
此时可以理解为该进程建立与物理磁盘的连接,结构体保存了指向系统级文件表的指针及其他信息。_file是一个描述符,作为打开文件索引表的整数。
此时只是初步完成连接,缓冲区中还没有东西。
当调用fread或者fwrite时,会将文件中一些字符放入缓存区中,接受read,如果read.size()大于缓冲区的大小,则会读取完重新更新缓冲区继续read。
此外注意一般情况下read 和 write 公用一块缓冲区,当你使用read完后fflush刷新缓冲区,将避免不必要的麻烦。
_bufsiz 在VS2015默认环境下为4096字节。
FILE中包含fd的信息,而且还包含IO缓冲,所以可以理解为FILE是对fd的封装,是C的标准形式,所以FILE*比fd更适合跨平台,应多用fopen,少用 open。
共享方式打开文件
安全性比fopen高
以共享的方式打开文件或者流
FILE _fsopen( const char filename, //需要打开的文件名
const char *mode, //可以访问的类型
int shflag); //共享访问类型
共享访问类型:
_SH_COMPAT //以兼容模式打开16位程序
_SH_DENYNO //充许读和写 以此模式打开类似fopen
_SH_DENYRD //拒绝读
_SH_DENYRW //拒绝读和写
_SH_DENYWR //拒绝写