【Linux系统编程】:文件IO

目录

1.C文件接口

1.1 当前路径是什么?

1.2 "w"和"a"​编辑

 2.系统文件I/O

2.1 "比特宏"标识符的实现:

2.2 open

1.系统默认创建文件的权限只写

2.设置新建文件的权限 

3. 覆盖写/清空写/追加写

3.访问文件的本质

3.1 文件描述符

3.2 使用文件描述符

3.3 C库中的标准输出输入 

 3.4 文件描述符的分配规则

4.文件重定向 

4.1 dup2 

4.2 追加重定向 

4.3 输入重定向 

5. 模拟shell实现文件重定向功能

6.为什么文件描述符1和2都指向屏幕 

7. 理解“Linux下一切皆文件”


1.C文件接口

1.1 当前路径是什么?

我们之前学习了fopen,当我们用读方式打开一个不存在的文件时,会在当前目录创建所需文件。第一个参数表示文件路径,如果只写一个文件名,没有写路径,默认在当前目录下打开该文件。

如果写了绝对路径或相对路径,就会去对应的路径下打开所需文件。

那么,这里的当前路径,到底是什么意思呢?如果我们只学习了C语言,没有学习操作系统相关的知识,是很难理解的。这里的当前路径,其实是指程序运行后的进程所在的当前工作目录。

如何证明这一点呢?

我们先在当前目录用fopen的"w"创建一个文件,

然后用chdir更改当前目录,

更改当前目录后,在proc目录下查询对应进程标识符的目录,可以看到cwd发生了改变。

1.2 "w"和"a"

w会截短文件的长度为0或创建一个文件。 我们用"w"的方式在当前目录创建文件,每次运行该程序都会覆盖原log.txt的内容,这说明"w"写入文件前会清空文件。就像重定向一样,我们可以利用重定向清空文件,

但我们还有一个问题,strlen("要写入的字符串")要不要加1,要把"\0"写入到文件中吗?

答案是不需要。因为C语言在内存里没办法标定字符串的结束,没有字符串类型,只好用“\0”来标识字符串的结尾,跟文件没有关系,仅仅是C语言的规定,我们把字符串写到文件里,字符串可能被java、python等语言编写的程序或者其他编译器或者文本编辑器读取,文件又没有规定字符串必须用“\0”结尾。所以我们只要把字符串的内容写入文本中,不用写入“\0”。

如果我们要向文件中“追加写”,可以用“a”。

【C语言】:与文件通信-优快云博客

 2.系统文件I/O

2.1 "比特宏"标识符的实现:

每一个比特位表示不同的功能,用宏来表示不同的比特位,函数体中用if语句判断"标识符&宏"的真假,通过向函数传递单个或多个按位或的宏,从而实现单个或多个不同的功能。

2.2 open

 第一个参数pathname,表示要打开或要新建的文件名或文件名的路径(包括相对路径或绝对路径,不写路径默认是文件名),

第二个参数flags表示访问文件的格式,

O_RDONLY: 只读打开

O_WRONLY: 只写打开

O_RDWR  : 读,写打开这三个常量,必须指定一个且只能指定一个

O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限

O_TRUNC:在写之前清空文件,将文件内容的长度截断位0

第三个参数表示创建文件的默认权限.

返回值:打开文件的文件描述符。(详情请往下浏览)

举例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值