目录
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”。
2.系统文件I/O
2.1 "比特宏"标识符的实现:
每一个比特位表示不同的功能,用宏来表示不同的比特位,函数体中用if语句判断"标识符&宏"的真假,通过向函数传递单个或多个按位或的宏,从而实现单个或多个不同的功能。
2.2 open
第一个参数pathname,表示要打开或要新建的文件名或文件名的路径(包括相对路径或绝对路径,不写路径默认是文件名),
第二个参数flags表示访问文件的格式,
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_TRUNC:在写之前清空文件,将文件内容的长度截断位0
第三个参数表示创建文件的默认权限.
返回值:打开文件的文件描述符。(详情请往下浏览)
举例: