Linux应用编程-文件(I/O)操作

1.open() 打开文件

open打开或创建文件的两种函数原型

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);  //打开文件
int open(const char *pathname, int flags, mode_t mode);  //创建文件

函数参数和返回值含义如下: 

  • pathname字符串类型,用于标识需要打开或创建的文件,可以包含路径(绝对路径或相对路径)信息。譬如:"./src_file"(当前目录下的 src_file 文件)
  • flags调用 open 函数时需要提供的标志,包括文件访问模式标志以及其它文件相关标志,这些标志使 用宏定义进行描述,都是常量,open 函数提供了非常多的标志,我们传入 flags 参数时既可以单独使用某一 个标志,也可以通过位或运算(|)将多个标志进行组合
例:
open("./src_file", O_RDONLY) //单独使用某一个标志
open("./src_file", O_RDONLY | O_NOFOLLOW) //多个标志组合
  • mode此参数用于指定新建文件的访问权限,只有当 flags 参数中包含 O_CREAT O_TMPFILE 标志 时才有效(O_TMPFILE 标志用于创建一个临时文件)

用二进制表示:

即每个(SUGO)各有 3 bit 位,按照 rwx 顺序来分配权限位(特殊权限除外)。
111000000 (二进制表示):表示文件所属者具有读、写、执行权限,而同组用户和其他用户不具有任 何权限;
100100100 (二进制表示):表示文件所属者、同组用户以及其他用户都具有读权限,但都没有写、执 行权限。
  • 返回值:成功将返回文件描述符,文件描述符是一个非负整数;失败将返回-1

 2.write()写文件

 write 函数可向打开的文件写入数据,其函数原型:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
函数参数和返回值含义如下:
  • fd文件描述符。关于文件描述符,我们需要将进行写操作的文件所对应的文件描述符传递给 write 函数。
  • buf指定写入数据对应的缓冲区。
  • count指定写入的字节数。
  • 返回值: 如果成功将返回写入的字节数( 0 表示未写入任何字节),如果此数字小于 count 参数,这不
    是错误,譬如磁盘空间已满,可能会发生这种情况;如果写入出错,则返回 -1

3. read 读文件

调用 read 函数可从打开的文件中读取数据,其函数原型:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
函数参数和返回值含义如下:
  • fd文件描述符。与 write 函数的 fd 参数意义相同。
  • buf指定用于存储读取数据的缓冲区。
  • count指定需要读取的字节数。
  • 返回值:如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于 count 参数指定的字节 数,也有可能会为 0,譬如进行读操作时,当前文件位置偏移量已经到了文件末尾。实际读取到的字节数少 于要求读取的字节数,譬如在到达文件末尾之前有 30 个字节数据,而要求读取 100 个字节,则 read 读取成 功只能返回 30

4.close 关闭文件

调用 close 函数关闭一个已经打开的文件,其函数原型:
#include <unistd.h>
int close(int fd);
函数参数和返回值含义如下:
  • fd文件描述符,需要关闭的文件所对应的文件描述符。
  • 返回值:如果成功返回 0,如果失败则返回-1

5.lseek

对于每个打开的文件,系统都会记录它的读写位置偏移量,我们也把这个读写位置偏移量称为读写偏移 量,记录了文件当前的读写位置,当调用 read() write() 函数对文件进行读写操作时,就会从当前读写位置偏移量开始进行数据读写。(即改变读写偏移量)
函数原型:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
函数参数和返回值含义如下:
  • fd文件描述符。
  • offset偏移量,以字节为单位。
  • whence用于定义参数 offset 偏移量对应的参考值
  • 返回值:成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1

whence:

  • SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);
  • SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
  • SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负, 如果是正数表示往后偏移、如果是负数则表示往前偏移。
(1)将读写位置移动到文件开头处:
off_t off = lseek(fd, 0, SEEK_SET);
if (-1 == off)
    return -1;

(2)将读写位置移动到文件末尾:
off_t off = lseek(fd, 0, SEEK_END);
if (-1 == off)
    return -1;

(3)将读写位置移动到偏移文件开头 100 个字节处:
off_t off = lseek(fd, 100, SEEK_SET);
if (-1 == off)
    return -1;

(4)获取当前读写位置偏移量:
off_t off = lseek(fd, 0, SEEK_CUR);
if (-1 == off)
    return -1;
函数执行成功将返回文件当前读写位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值