[IO系统]02 用户态的文件IO操作
来源:互联网 发布:直线插补算法 编辑:程序博客网 时间:2024/06/05 23:01
在工作中,经常会进行文件创建、更新、删除等操作,但是作为存储领域技术人员,我们又对其过程了解多少哪。本系列文章将会对文件操作进行系统的分析和梳理,与大家共同进步。
先来了解用户态的文件操作的常用函数。
1. “缓冲”文件系统 – 用户态带缓存(与文件系统没有关系)
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器而定。
fopen, fclose, fread,fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
2.“非缓冲”文件系统 – 用户态不带缓存(与文件系统没有关系)
缓冲文件系统是借助文件结构体指针(FILE)来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据(openmode:r和ra)。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针(但是有文件描述符),只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它,只作简单介绍。
open, close, read,write, getc, getchar, putc, putchar 等
1.1 典型函数
用户态的文件操作,主要分为两类。
POSIX文件接口操作:
# 打开文件,flags 必须包含O_RDONLY, O_WRONLY, or O_RDWR中的任何一个
int open(const char *pathname, intflags);
# 打开文件,mode只是在flags中包含O_CREAT时才有效
int open(const char *pathname, intflags, mode_t mode);
# 定位文件位置
off_t lseek(int fd, off_t offset,int whence);
# 读取文件内容,文件位置会随读取的字节数移动
ssize_t read(int fildes, void *buf,size_t nbyte);
# 写入文件内容,文件位置会随读取的字节数移动
ssize_t write(int fildes, const void*buf, size_t nbyte);
# 关闭文件
int close(int fd);
# 文件同步
int fsync(int fd);
# 预置文件大小
int ftruncate(int fd, off_t length);
# 获得文件的基本信息
int fstat(int fd, struct stat *buf);
C99标准文件操作:
# 文件打开操作
FILE *fopen(const char *path, constchar *mode);
#文件定位操作
int fseek(FILE *stream, long offset,int whence);
# 查询当前光标位置
long ftell(FILE *stream);
# 将光标位置移动到文件头部
void rewind(FILE *stream);
# 文件读操作
size_t fread(void *ptr, size_t size,size_t nmemb, FILE *stream);
# 文件写操作
size_t fwrite(const void *ptr,size_t size, size_t nmemb,FILE *stream);
# 判断文件是否已经读完
int feof(FILE *stream);
# 按格式读取文件流,还有scanf家族的其他函数,比如sscanf可以读取字节流
int fscanf(FILE *stream, const char*format, ...);
# 按格式将内容写入到文件中,还有sprintf,vprintf等等
int fprintf(FILE *stream, const char*format, ...);
# 直接将不定参数写入到文件,相对应的还有读取函
int vfprintf(FILE *stream, constchar *format, va_list ap);
# 强迫将缓冲区内的数据写回参数stream 指定的文件中.
int fflush(FILE *stream);
# 从文件结构体指针stream中读取数据,每次读取一行,读到换行符或EOF时停止
char *fgets(char *s, int size, FILE*stream); NT
# 取得参数stream指定的文件流所使用的文件描述符
int fileno(FILE *stream);
# 向指定的文件写入一个字符串
int fputs(const char *s, FILE*stream);
两者区别:
1. 前者属于低级IO操作,后者是高级IO操作。
2. 前者返回一个文件描述符,后者返回一个文件指针。
3. 前者无用户态缓冲,后者有用户态缓冲。
4. 前者与read, write 等配合使用, 后者与 fread, fwrite等配合使用。
5. 后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
其他的文件操作:
文件权限类操作
# 删除指定路径的文件
int remove(const char *pathname);
# 重命名指定文件
int rename(const char *old, constchar *new);
#修改文件的存取时间
int utime(const char *path, conststruct utimbuf *times);
# 获得文件的详细信息
int stat(const char *restrict path,struct stat *restrict buf);
#打开文件夹
DIR *opendir(const char *name);
# 读取目录内容操作
int readdir_r(DIR *dirp, structdirent *entry, struct dirent **result);
# 关闭文件夹
int closedir(DIR *dirp);
# 获得当前的绝对路径
char *getcwd(char *buf, size_tsize);
# 改变文件权限
int chmod(const char *path, mode_tmode);
# 改变当前的工作目录
int chdir(const char *path);
1.2 典型场景
用户操作的电影场景如下:最常用的
fd = open(…)
lseek(fd…)
write(fd…)
# 或read(fd)
close(fd)
或
FILE = fopen(…)
fseek(FILE…)
fwrite(FILE…)
# 或fread(FILE)
fclose(FILE)
未完,待续
- [IO系统]02 用户态的文件IO操作
- 文件IO的原子操作
- IO操作 文件的读取
- 第一章 文件IO的操作
- 文件IO操作的意义
- 【Linux系统编程】文件IO操作
- linux系统编程-文件IO操作
- 文件操作,标准IO,系统调用
- IO操作(文件操作)
- 标准文件IO和系统文件IO的区别
- Linux系统IO操作
- 系统io操作
- 文件IO、目录操作和标准IO\涉及的函数
- 标准IO与文件(系统)IO 的区别
- 标准IO与文件(系统)IO 的区别
- C#文件IO操作
- 标准IO文件操作
- IO文件操作
- [Android 知识点] RxAndroid的使用(六)(待更新)
- Hibernate的继承关系
- [Android 知识点] RxAndroid的使用(七)(待更新)
- Path与ClassPath
- Android中网络请求 Volley
- [IO系统]02 用户态的文件IO操作
- 解决Win7下苹果笔记本键盘不亮问题
- java-05:笔记
- 路由配置与管理——OSPF路由配置与管理2
- google的只能指针scoped_refptr
- java提高篇(二三)-----HashMap
- Android 图片处理
- JSP三种页面跳转方式的比较
- linux作业-day 03