文件I/O

Linux环境下,进行I/O操作有两种方法,一种通过标准I/O实现,另一种通过文件I/O实现。
标准I/O是C标准中定义了一组用来实现I/O的函数,遵循ANSI C相关标准,只要开发环境中有标准I/O库,就可以调用标准I/O实现I/O操作。
文件I/O称之为不带缓存的IO,遵循POSIX相关标准,任何兼容POSIX标准的操作系统上都支持文件I/O。(Linux 中使用的是GLIBC,它是标准C库的超集。不仅包含ANSI C中定义的函数,还包括POSIX标准中定义的函数。因此,Linux下既可以使用标准I/O,也可以使用文件I/O)。
文件I/O中用文件描述符表现一个打开的文件,可以访问不同类型的文件如普通文件、设备文件和管道文件等。而标准I/O中用FILE(流)表示一个打开的文件,通常只用来访问普通文件。

标准I/O文件I/O
ANSICPOSIX
带缓冲无缓冲
流 FILE文件描述符 fd

文件I/O

  • POSIX(可移植操作系统接口)定义的一组函数,只有遵循POSIX规范的操作系统下才能使用文件I/O
  • 不提供缓冲机制,每次读写操作都引起系统调用
  • 核心概念是文件描述符
  • 访问各种类型文件,Linux里的7种文件类型都能访问(一般来说标准I/O只能访问普通文件或者是终端文件)
  • Linux下,标准I/O是基于文件I/O实现,文件I/O更底层一点,标准I/O更上层,或者可以把标准I/O看成在文件I/O基础上封装了一个缓冲机制,文件IO直接调用了系统接口不需要依赖标准C库。文件I/O是不带缓冲的,对于Linux内核来讲,所有打开文件都由文件描述符表示。

文件描述符
每个打开的文件都对应一个文件描述符
文件描述符是一个非负整数,Linux为程序中每个打开的文分配一个文件描述符
文件描述符从0开始分配,依次递增
文件I/O操作通过文件描述符来完成
0,1,2对应标准输入,标准输出,标准错误

open
#include <fcntl.h>
int open(const char *path, int oflag, …);
第一个参数是打开路径,第二个参数是打开方式
成功时返回文件描述符,出错时返回EOF
打开已经存在的文件时使用两个参数
创建文件时第三个参数指定新文件的权限
只能打开设备文件,不能创建
close
#include <unistd.h>
int close(int fd);
成功时返回0;出错时返回EOF
程序结束时自动关闭所有打开的文件
文件关闭后,文件描述符不在代表文件
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
成功时返回实际读取的字节数;出错时返回EOF
读到文件末尾时返回0
buf是接收的缓冲区
count不应超过buf大小
write
#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);
成功时返回实际写入的字节数;出错时返回EOF
buf是发送数据的缓冲区
count不应超过buf大小
lseek
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
成功时返回当前的文件读写位置;出错时返回EOF
参数偏移量和基准点同fseek完全一样
opendir
#include <dirent.h>
DIR *opendir(const char *name);
DIR是用来描述一个打开的目录文件的结构体类型
成功时返回目录流指针;出错时返回NULL
readdir
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent是用来描述目录流中一个目录项的结构体类型
包含成员char d_name[256]
成功式时返回目录流dirp中的下一个目录项
出错或者到末尾时返回NULL
closedir
#include <dirent.h>
int closedir(DIR *dirp);
关闭目录文件,成功返回0,出错时返回EOF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值