一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)

时间:2022-03-11 10:56:51

各位看官们,大家好,上一回中咱们说的是基于文件描述符进行文件操作的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们在上一回中介绍了文件描述符,今天我们将和大家一起看看如何通过文件操作符来操作文件。

文件操作主要有以下三个 步骤:

  • 1.打开文件
  • 2.读/写文件
  • 3.关闭文件

我称之为文件操作三步曲:打开,操作和关闭。在Linux系统中,这三步曲是借助系统调用实现的。接下来我们介绍与文件操作相关的系统调用。

打开文件的系统调用

int open(const char *pathname, int flags); 
int open(const char *pathname, int flags, mode_t mode);(新版本的open)
  • 该函数用来打开文件或者创建一个新文件;
  • 该函数的第一个参数是文件名,该文件名表示要打开的文件或者创建的文件;
  • 该函数的第二个参数是打开文件的方式,详见下面的说明;
  • 该函数的第三个参数是创建新文件后,新文件拥有的权限;
  • 该函数运行成功时返回一个文件描述符;运行失败时返回-1,并且设置设置全局变量error。

第二个参数的值可以是以下类型中的任意一个:

  • O_RDONLY(只读的方式打开文件),
  • O_WRONLY(只写的方式打开文件),
  • O_RDWR(读和写的方式打开文件),

另外,该参数的值还可以是 O_APPEND(在文件尾添加数据)和O_CREAT(创建新文件)。这两个值可以和上面三个值进行或操作,这样对文件进行操作时会包含两个值的意义。例如

open("test",O_WRONLY | O_CREATS_IRWXU )

会创建一个叫test的文件,并且可以对该文件进行写操作。

这里有两个open函数,我们用哪个呢?看官莫急,通常使用第一个open函数来打开文件,如果创建文件时那么就需要使用第二个open函数。这时也会用到第三个参数,该参数的值可以是 S_IRUSR类型的值,而且这些数据可以进行或操作。比如

S_IRWXU | S_IRWXG | S_IXOTH

操作文件的系统调用

ssize_t read(int fd, void *buf, size_t count);
  • 该函数用来从文件中读取数据;
  • 该函数的第一个参数是文件描述符,它会读取与该文件描述符相对应的文件中的数据;
  • 该函数的第二个参数是缓冲区,它会把读取到的数据存放到该缓冲区中;
  • 该函数的第三个参数是每次读取的字节数量;
  • 该函数运行成功时返回读取到的字节数量,如果为0说明已经到了文件末尾。如果运行失败返回-1.并且设置全局变量error
ssize_t write(int fd, const void *buf, size_t count);
  • 该函数用来向文件中写入数据;
  • 该函数的第一个参数是文件描述符,它会向与该文件描述符相对应的文件中的写入数据;
  • 该函数的第二个参数是缓冲区,它会把缓冲区中的数据写入到文件中;
  • 该函数的第三个参数是每次写入的字节数量;
  • 该函数运行成功时返回写入到文件中的字节数量,如果为0说明没有写入数据。如果运行失败返回-1.并且设置全局变量error。

关闭文件的系统调用

int close(int fd);
  • 该函数用来关闭文件;
  • 该函数的参数表示文件描述符,它会把与该文件描述符相关联的文件关闭掉,或者说释放该文件描述符。
  • 该函数运行成功时返回0,运行失败时返回-1.

各位看官,关于文件操作:基于文件描述符的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。