Linux是基于文件来管理系统,包括I/O设备文件。Linux操作系统中有两类主要的设备,一类是字符设备,另一类是块设备。
字符设备是以字节为单位进行I/O操作的设备。一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。
块设备是利用一块系统内存作为缓冲区。
1、不带缓冲的设备文件I/O操作(基于文件描述符)
2、带缓冲的设备文件I/O操作(基于流)
- 三种缓冲类型:全缓冲:如磁盘操作
行缓冲:在输入和输出遇换行符时才进行实际的I/O操作,如stdin 、stdout
无缓冲:如stderr
- 打开流、关闭流
FILE * fopen(const char * path, const char *mode);//失败返回NULL
FILE * fdopen(int fd, const char * mode); //失败返回NULL
FILE * freopen(const char *path, const char * mode, FILE * stream);//失败返回NULL
int fclose(FILE * stream); //成功返回0,失败返回EOF(-1)
注:调用fopen()其实就是为设备文件分配一个设备文件的信息区(FILE结构体) 和 缓冲区 的内存空间,返回一 个 内存空间的指针,若分配失败返回NULL
调用fclose关闭一个设备文件,其实就是释放之前分配的信息区和缓冲区,是fp不再指向那块内存区
fclose先将缓冲区中的信息输出到设备文件,才撤销文件信息区
- 读取、写入一个字符
int fgetc(FILE *stream); //从设备文件中读取一个字符,,,失败返回EOF
int fputc(int c, FILE * stream); //向设备文件写入一个字符,,,失败返回EOF
它的特殊化
int getchar(void); //从特殊的设备文件(键盘)中读取一个字符
int putchar(int c); //向特殊的设备文件(显示器)写入一个字符
- 读取、写入一行字符
char * fgets(char *s, int n, FILE * stream); //从设备文件中最多读取n-1个字符放到s,失败返回NULL
int fputs(const char *s, FILE * stream); //向设备文件写入字符串s,失败返回EOF
它的特殊化
int puts(const char * s); //向特殊设备文件(显示器)写入字符串s,再多输出个换行,失败返回EOF
- 按指定格式读写设备文件(通常来处理二进制文件)
size_t fread/fwrite(void * ptr, //存放读取/写入记录的ptr
size_t size, //读取/写入的记录的大小
size_t nmemb, //读取/写入的记录数
FILE * stream); //要读取/写入的设备文件
- 刷新流
强制刷新一个流,是该流所有未写的缓冲区数据写入到实际的设备文件中
int fflush(FILE * stream); //成功返回0,失败返回-1
- 设备文件的定位 (成功返回0,失败返回-1)
fseek/rewind可以改变流的读写位置,ftell返回一个流的当前读/写位置
void rewind(FILE *stream); //使位置指针重新指向设备文件的开始
int fseek(FILE * stream, long offset, int whence); //以起始点whence为基准移动offset的字节数
long ftell(FILE *stream); //返回一个设备文件的当前读/写位置