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);

 

posted @ 2021-05-12 23:23  博客员_小李  阅读(112)  评论(0)    收藏  举报