5.7 文件I/O(文件IO打开和关闭)

目录

 文件描述符

open

open-示例1

open-示例2

close

笔记


 文件描述符

每个打开的文件都对应一个文件描述符。

文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。

文件描述符从0开始分配,依次递增。

文件IO操作通过文件描述符来完成。 0, 1, 2 的含义?

open

open函数用来创建或打开一个文件:  

 #include <fcntl.h>
 int open(const char *pathname, int flags);
 int open(const char *pathname, int flags, mode_t mode);
 //成功时返回文件描述符;出错时返回EOF

打开文件时使用两个参数

创建文件时第三个参数指定新文件的权限,(只有在建立新文件时有效)此外真正建文件时的权限会受到umask 值影响,实际权限是mode-umaks

可以打开设备文件,但是不能创建设备文件(创建设备mknode 驱动部分会讲)

原型

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进制表示法。

    r                O_RDONLY

    r+                O_RDWR

    w                O_WRONLY | O_CREAT | O_TRUNC, 0664

    w+                O_RDWR | O_CREAT | O_TRUNC, 0664

    a                O_WRONLY | O_CREAT | O_APPEND, 0664

    a+                O_RDWR | O_CREAT | O_APPEND, 0664 

umask :用来设定文件或目录的初始权限

文件和目录的真正初始权限

文件或目录的初始权限 = 文件或目录的最大默认权限 - umask权限

open-示例1

以只写方式打开文件1.txt。如果文件不存在则创建,如果文件存在则清空:

int  fd;

if ((fd  = open(“1.txt”, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
    perror(“open”);
    return  -1;
}

open-示例2

以读写方式打开文件1.txt。如果文件不存在则创建,如果文件存在则报错:

int  fd;

if ((fd  = open(“1.txt”, O_RDWR|O_CREAT|O_EXCL, 0666)) < 0) {
    if (errno == EEXIST) { 
       perror(“exist error”);
    } else {
       perror(“other error”);
    }
}

close

 close函数用来关闭一个打开的文件:

 #include  <unistd.h>

 int  close(int fd);

  成功时返回0;出错时返回EOF

程序结束时自动关闭所有打开的文件

文件关闭后,文件描述符不再代表文件


笔记

文件IO的概念:

什么是文件IO,又称系统IO,系统调用

是操作系统提供的API接口函数。

POSIX接口 (了解)

注意:文件IO不提供缓冲机制

文件IO的API

open  close read read

文件描述符概念:

英文:缩写fd(file descriptor)

是0-1023的数字,表示文件。

0, 1, 2 的含义 标准输入,标准输出,错误

文件IO 打开

open

int open(const char *pathname, int flags);   不创建文件

int open(const char *pathname, int flags, mode_t mode);  创建文件,不能创建设备文件

成功时返回文件描述符;出错时返回EOF

文件IO和标准的模式对应关系:

r O_RDONLY

r+ O_RDWR

w O_WRONLY | O_CREAT | O_TRUNC, 0664

w+ O_RDWR | O_CREAT | O_TRUNC, 0664

a O_WRONLY | O_CREAT | O_APPEND, 0664

a+ O_RDWR | O_CREAT | O_APPEND, 0664

umask概念:

umask 用来设定文件或目录的初始权限

文件的关闭

int close(int fd)

关闭后文件描述符不能代表文件

文件IO的读写和定位

容易出错点:

求字符串长度使用sizeof,对二进制数据使用strlen

printf 的字符最后没有\0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值