C语言缓冲区
- 缓冲的类型
1.全缓冲 _IOFBUF
2.行缓冲 _IOLBUF
3.无缓冲 _IONBUF - 标准输入输出
1.stdin 0 标准输入
2.stdout 1 标准输入
3.stder 2 标准错误 - 清空缓冲区
fllush(buf); 刷新缓冲区并且把缓冲区的内容输出
buf表示缓冲区例如 stdin stdout - 设置缓冲区
void setbuf(FILE*,char*buf );//文件指针 指定缓冲区
void setbuffer(FILE*,char*buf,size_t size);// 全缓冲
void setlinebuf(FILE*);//行缓冲
- IO权限 mode
“w” 打开文件只写
“w+” 打开文件或创建只写
“wb+” 以二进制的方式打开写
“r” 打开文件只读
“r+” 打开或创建只读
“rb+” 二进制
“a” 追加的方式打开
“a+” 追加的方式打开或创建 - 文件操作代码
FILE结构体
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //???这个什么意思
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
创建文件流指针
FILE*file = fopen(const char*path,const char*mode);
//path指路经 mode以什么权限打开
int fd = open(char*,int flags); //linux
int f = open(char*,int flags,mode_t mode);
flags:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合.
O_CREAT 若欲打开的文件不存在则自动建立该文件.
O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打开文件.
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。
mode:
S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.
S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.
S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.
S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.
S_IROTH 00004 权限, 代表其他用户具有可读的权限
S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.
S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.
文件操作
fgetc(FILE*,char);//从文件读出一个字符
fputc(FILE*,char);//向文件写入一个字符
fgets(FILE*,char* buf,int length); //从文件读出一行字符串 以'\n'结尾
fputs(FILE*,char *buf,int length);//写入字符串
fread(void* ptr,int size,int count,FILE *);
/*
ptr只用来存放读出数据的内存 内存最小为size
size 读取元素的大小
count 读取的个数
*/
fwrite(vod *ptr,int size,int count,FILE*);
//通用IO读写
write(fd,char* buf,int length);
read(fd,char* buf,int length);
文件光标操作
int feof(FILE*);//访问光标是否到达文件末尾
fseek(FIlE* Stream , long offset ,int whence); //设置光标位置
//offset 指推进或后退长度
//whence 表示位置 例如 SEEK_CUR当前位置 SEEK_END末尾 SEEK_SET 文件开始
long ftell(FILE*);//求当前光标位置距离文件开头的字节数
rewind(FILE*) //光标复位
```
==关闭文件==
close(FILE*);