文件I/O

文件I/O

  • 文件I/O介绍
  • open()
  • close()
  • read()
  • write()
  • lseek()

1.文件I/O– 介绍

文件I/O

(1)不带缓冲

  • 不带缓冲指的是每个read和write都调用内核中的相应系统调用
  • 不带缓冲的I/O函数不是ANSI C的组成部分,但是是POSIX和XPG3的组成部分

(2)通过文件描述符来访问文件

文件I/O常用函数

  • open()/creat()
  • close()
  • read()
  • write()
  • lseek()

 

文件I/O –文件描述符

  • 对于内核而言,所有打开文件都由文件描述符引用。
  • 文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。
  • 当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
  • 在posix.1应用程序中,幻数0、1、2应被代换成符号常数STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。这些常数都定义在头文件<unistd.h>中。

 

 

2.文件I/O– open()/creat()

调用open()/creat()函数可以打开或者创建一个文件。


  • open()和creat()调用成功返回文件描述符,失败返回-1,并设置errno。
  • open()/creat()调用返回的文件描述符一定是最小的未用描述符数字
  • creat()等价于open(pathname, O_CREAT|O_WRONLY|O_TRUNC, mode)
  • open()可以打开设备文件,但是不能创建设备文件,设备文件必须使用mknod()创建。

原型

int open(const char *pathname, int flags, mode_t mode);

参数

pathname

被打开的文件名(可包括路径名)。

flags

O_RDONLY:只读方式打开文件。

这三个参数互斥

O_WRONLY:可写方式打开文件。

O_RDWR:读写方式打开文件。

O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。

O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。

O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。

O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。

O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行。

mode

被打开文件的存取权限,为8进制表示法。

 

 

3.文件I/O– close()

调用close()函数可以关闭一个打开的文件。


  • 调用成功返回0,出错返回-1,并设置errno。
  • 当一个进程终止时,该进程打开的所有文件都由内核自动关闭。
  • 关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁。

 

 

4.文件I/O– read()

调用read()函数可以从一个已打开的可读文件中读取数据。


  • read()调用成功返回读取的字节数,如果返回0,表示到达文件末尾,如果返回-1,表示出错,通过errno设置错误码。
  • 读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读取的字节数。
  • buf参数需要有调用者来分配内存,并在使用后,由调用者释放分配的内存。

 

 

5.文件I/O– write()

调用write()函数可以向一个已打开的可写文件中写入数据。


  • write()调用成功返回已写的字节数,失败返回-1,并设置errno。
  • write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件。
  • write()出错的常见原因:磁盘已满或者超过了一个给定进程的文件长度限制。
  • 对于普通文件,写操作从文件的当前位移量处开始,如果在打开文件时,指定了O_APPEND参数,则每次写操作前,将文件位移量设置在文件的当前结尾处,在一次成功的写操作后,该文件的位移量增加实际写的字节数。

 

 

6.文件I/O– lseek()

调用lseek()函数可以显示的定位一个已打开的文件。


原型

off_t lseek(int fd,off_t offset,int whence);

参数

fd:文件描述符。

offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)

whence

(当前位置基点)

SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。

SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。

SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。

返回值

成功:文件的当前位移

-1:出错

  • 每个打开的文件都有一个与其相关的“当前文件位移量”,它是一个非负整数,用以度量从文件开始处计算的字节数。
  • 通常,读/写操作都从当前文件位移量处开始,在读/写调用成功后,使位移量增加所读或者所写的字节数。
  • lseek()调用成功为新的文件位移量,失败返回-1,并设置errno。
  • lseek()只对常规文件有效,对socket、管道、FIFO等进行lseek()操作失败。
  • lseek()仅将当前文件的位移量记录在内核中,它并不引起任何I/O操作
  • 文件位移量可以大于文件的当前长度,在这种情况下,对该文件的写操作会延长文件,并形成空洞。

 

课件搬运了一下。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值