4. 文件IO操作
1.创建文件
#include <fcntl.h>
int creat(const char* path, mode_t mode);
path:文件路径。可以是绝对路径,也可以是相对路径。
mode:创建模式,指定用户操作权限(针对三种用户设置:所处用户,所处用户组,其他用户。权限:读,写,执行)
(0表示没有任何权限
S_IRUSR可读,1
S_IWUSR可写,2
S_IXUSR可执行,4
S_IRWXR可读、写、执行)7(也可以用数字代替,如0777)
返回值:文件描述符,值为一个整数,发生错误时返回-1。
例子:
int fd = creat("./test.txt", 0777);
2.关闭文件
#include <fcntl.h>
int close(int fd);
当关闭一个文件会释放该进程加在该文件上的所有记录锁。当进程终止时会关闭本进程打开的所有文件。
3.文件偏移量
每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加.
off_t lseek(int fd, off_t offset, int whence);
函数说明:
函数用来控制该文件的读写位置. 参数fd为已打开的文件描述词, 参数offset 的解释与whence有关:
参数 whence 为下列其中一种:
SEEK_SET:将该文件的偏移量设置为距文件开始处offset个字节的位置。
SEEK_CUR:将该文件的偏移量以目前的读写位置往后增加offset 个位移量。(offset可正可负)
SEEK_END:将读写位置指向文件尾后再增加offset 个位移量。(offset可正可负)
返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误则返回-1, errno 会存放错误代码。
说明:
- 不允许lseek()对管道,FIFO,网络套接字作用, 此项动作会令lseek()返回ESPIPE。
- 大多数文件不允许有负的文件偏移量,但也有少部分设备支持负的偏移量。
- 文件偏移量可以大于当前文件的长度,在这种情况下,下一次写改文件将对文件进行加长,并在文件中形成一个空洞,这样会占用更多的磁盘空间。
4.读文件
ssize_t read(int fd, void* buf, size_t nbytes);
函数说明:
fd:已经打开的文件句柄。
buf:要读的缓冲区。
nbytes:缓冲区大小。
返回值:实际读取到的字节数,到达文件尾返回0,出错则返回-1。
5.写文件
ssize_t write(int fd, const void* buf, size_t nbytes);
函数说明:
fd:已经打开的文件句柄。
buf:要写入的缓冲区数据。
nbytes:要写入的长度
返回值:返回写入的字节数,若出错,返回-1。
6.删除文件
在unix系统中,文件管理器中的一个文件会有一个i节点,但是一个i节点并不一定只对应一个目录项。解释:
现在有1.txt和2.txt两个文件,这两个文件可能指向同一个i节点,也就是说在磁盘中这两个文件的内容其实只有一份,此时修改1.txt会导致2.txt的内容同时改变(因为实际对应的是一个磁盘地址)。
此时删除1.txt那么unit不会对应磁盘的内容,只是把对应的i节点中的计数-1,当计数为0的时候,磁盘空间才被释放。
#include<unistd.h> int unlink(const char *pathname);
此函数并不一定删除指定的文件,只有当执行unlink后对应的计数减为0时,并且没有进程打开该文件时才会真正的删除该文件。
如果此时有进程在使用该文件,那么在此进程退出时才会由系统删除该文件。
与此相似功能的函数:
#include<stdio.h> int remove(const char *pathname);
对于文件,remove函数的功能和unlink相同,对于目录,remove函数的功能和rmdir相同。
7.重命名文件
#include<stdio.h> int rename(const char *oldname, const char* newname);

浙公网安备 33010602011771号