POSIX标准下文件IO管理

本文详细介绍了文件操作的基础知识,包括文件的打开、关闭、读写、定位等操作,并讲解了目录的打开、关闭、读写、定位等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、打开文件:
  extern int open (__const char * __file, int __oflag, ...);
  成功则返回该文件的描述符;否则返回-1.
  flags:
        O_RDONLY:以只读方式打开文件
  O_WRONLY:以写方式打开文件
  O_RDWR:以可读可写方式打开文件
  O_CREATE:若打开的文件不存在,则自动建立文件
  O_EXCL:如果设置了O_CREATE,并且文件存在,则会导致打开文件错误。打开的文件为符号链接,也会导致打开失败。
  O_NOCTTY:如果欲打开的文件为终端设备时,则不会将该终端机当成进程控制终端机。
  O_TRUNC:若文件存在,且以可写的方式打开时,此标识令文件长度为0,该文件原来的数据将会丢失。
  O_APPEND:当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
  O_NONBLOCK:以不可阻断方式打开,也就是无论有无数据读取或等待,都会立即返回进程之中。
  O_NDELAY:同O_NONBLOCK
  O_SYNC:以同步方式打开文件。

  如果用O_CREATE打开方式,则需要用到第三个参数。它规定了文件的权限。在设置权限时,可采用直接设置为八进制的方式。如0666。也可以使用下表中的宏:
  S_IRWXU  00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
  S_IRUSR   00400权限,代表该文件所有者具有可读取的权限。
  S_IWUSR     00200 权限,代表该文件所有者具有可写入的权限。
  S_IXUSR        00100 权限,代表该文件所有者具有可执行的权限。
  S_IRWXG       00070权限,代表该文件用户组具有可读、可写及可执行的权限。
  S_IRGRP       00040 权限,代表该文件用户组具有可读的权限。
  S_IWGRP       00020权限,代表该文件用户组具有可写入的权限。
  S_IXGRP        00010 权限,代表该文件用户组具有可执行的权限。
  S_IRWXO       00007权限,代表其他用户具有可读、可写及可执行的权限。
  S_IROTH        00004 权限,代表其他用户具有可读的权限
  S_IWOTH        00002权限,代表其他用户具有可写入的权限。
  S_IXOTH         00001 权限,代表其他用户具有可执行的权限。

2.关闭文件:
  extern int close(int __fd);
  成功则返回0;否则返回-1

3.创建文件:
  extern int create(__const char * __file, __mode_t mode);
  这个函数等同于:
  open(const char * pathname, (O_CREATE|O_WRONLY|O_TRUNC), mode_t mode);
        成功则返该文件的描述符,有错误则返回-1.

4.文件控制:
  extern int fcntl (int __fd, int __cmd, ...);
  常用的cmd有:
  #define F_DUPFD 0
  #define F_GETFD 1
  #define F_SETFD 2
  #define F_GETFL 3
  #define F_SETFL 4
  (1)F_DUPFD:
    复制文件描述符仅仅在当前进程打开的文件表项新增一项,该项指向内核为该文件分配的文件表项(struct file 结构体),操作这两个文件描述符任意一个将会影响另一个。

  (2)F_SETFD与F_SETFL的区别:F_SETFD仅更改该文件描述符的信息,而F_SETFL则更改与该文件相关的所有文件描述符。

5.读取文件内容:
  extern ssize_t read (int __fd, void * __buf, size_t __nbytes);
  该函数从参数fd所指向的文件中读取__nbytes数据到buf指针所指的内存中,此函数返回值为实际读取到的字数。如果返回0,表示已经到达文件尾部或无数据可读。

6.写内容到文件:
  extern ssize_t write(int __fd, __const void * __buf, size_t __n);
  该函数尝试将以buf为起始地址的缓冲区前n个字节写入与打开文件描述符fd关联的文件内。成功则返回真正写入数据的大小;失败则返回-1。

7.文件定位:
  extern __off_t lseek(int __fd, __off_t __offset, int __whence);
  第一个参数为已经打开的文件描述符
  第二个参数offset为根据参考位置(第三个参数)来移动读写位置的位移数。
  第三个参数的值可有:
    #define SEEK_SET 0
    #define SEEK_CUR 1
    #define SEEK_END 2
  成功则返回当前读写位置距离文件头部的字节数;
  失败则返回-1.

8.同步刷新内核缓冲区。
  #include <unistd.h>
  void sync(viod);
  int fsync(int fildes);
  int fdatasync(int fildes);

9.打开|关闭目录
 #include <dirent.h>
    DIR * opendir(const char * dirname);//成功则返回DIR *;失败返回NULL
 int closedir(DIR * dirp);//成功返回0;失败返回-1

10.读写目录内容:
 struct dirent * readdir(DIR * dirp);//此方法在多线程操作中会不安全。
    struct dirent
    {
         long d_ino;    //inode值
   _kernel_off_t d_off;  //从目录开始到当前目录条的距离
         unsigned short d_reclen;  //用以存储文件名的空间大小,根据文件名长度而有差异
         char d_name[256];          //文件名,以'\0'结束.
    }

11.定位目录位置:
  long int telldir(DIR * dirp);
  成功则返回一个long类似的位置值以指示目录中的当前位置;失败则返回-1.
  void seekdir(DIR * dirp, long int loc);
  rewinddir(DIR * dirp);//重置位置到开头

12.添加目录:
  extern int mkdir(__const char * __path, __mode_t __mode);//成功则返回0,否则返回-1

13.删除目录:
  extern int rmdir (__const char *__path);//成功返回0;失败则返回-1

14.获取当前工作路径:
  #include <unistd.h>
  extern char * getcwd(char *__buf, size_t __size);
  将当前工作路径的绝对路径名置于由buf指定的数组中,并返回buf。size数值至少比所返回路径名的长度大1,否则返回NULL。如果设置buf为NULL,getcwd()将利用malloc()获取空间,此时,由getcwd返回的指针需要被释放。
  //在源文件的开头加和宏定义:#define _GNU_SOURCE 就不会出现编译警告了。
  extern char * get_current_dir_name(void);
  成功则返回路径;失败则返回NULL。

15.修改当前工作路径。
  extern int chdir(__const char *__path);//成功则返回0,失败则返回-1
  
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值