_011_C的文件操作函数在linux下的使用

==============================================================

这一篇非常详细,具体可以看这个https://www.cnblogs.com/fnlingnzb-learner/p/7040726.html

下面就对上面的文章进行简化修改

open和fopen的区别


  1,fread是带缓冲的,read不带缓冲.
  2,fopen是标准c里定义的,open是POSIX中定义的.
  3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
  4,fopen不能指定要创建文件的权限.open可以指定权限.
  5,fopen返回文件指针,open返回文件描述符(整数).

open系统调用(linux)


  需要包含头文件:

  #include<sys/types.h>
  #include<sys/stat.h>
  #include<fcntl.h>

  函数原型

  int open( const char * pathname, int oflags);
  int open( const char * pathname,int oflags, mode_t mode);

mode仅当创建新文件时才使用,用于指定文件的访问权限

pathname 是待打开/创建文件的路径名;

oflags用于指定文件的打开/创建模式

   O_RDONLY       只读模式 
   O_WRONLY      只写模式 
   O_RDWR          读写模式

以上三者是互斥的,即不可以同时使用。

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量选用,选用方式O_RDONLY|O_APPEND
   O_APPEND         每次写操作都写入文件的末尾 
   O_CREAT            如果指定文件不存在,则创建这个文件 
   O_EXCL               如果要创建的文件已存在,则返回 -1,并且修改 errno 的值,所以要判断文件是否存在,要O_CREAT和O_EXCL一起用
   O_TRUNC           如果文件存在,并且以只写/读写方式打开,则清空文件全部内容 
   O_NOCTTY         如果路径名指向终端设备,不要把这个设备用作控制终端。
   O_NONBLOCK   如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)。
//以下用于同步输入输出
   O_DSYNC          等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。 
   O_RSYNC          read 等待所有写入同一区域的写操作完成后再进行
   O_SYNC            等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

第三个参数mode
这些标志在头文件sys/stat.h中定义,和文件的权限是一样的,可以用数字来代替,比如0777,0是代表8进制

但是填写了第3个参数后,得出来的文件的权限依然不是我们指定的,因为会有一个掩码,这个0777会和掩码取反后进行与的计算

得到实际权限,umask可以显示掩码,umask 数字 可以修改掩码,以下完全可以用数字代替
  S_IRUSR:    读权限,文件属主
  S_IWUSR:   写权限,文件属主
  S_IXUSR:    执行权限,文件属主
  S_IRGRP:    读权限,文件所属组
  S_IWGRP:   写权限,文件所属组
  S_IXGRP:    执行权限,文件所属组
  S_IROTH:   读权限,其它用户
  S_IWOTH:  写权限,其它用户
  S_IXOTH:   执行权限,其它用户

返回值:成功则返回文件描述符,否则返回 -1。  返回文件描述符(整型变量0~255)
错误代码
  EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
  EACCESS 参数pathname所指的文件不符合所要求测试的权限。
  EROFS 欲测试写入权限的文件存在于只读文件系统内。

EFAULT 参数pathname指针超出可存取内存空间。

 EINVAL 参数mode 不正确。
  ENAMETOOLONG 参数pathname太长。

 ENOTDIR 参数pathname不是目录。
  ENOMEM 核心内存不足。
  ELOOP 参数pathname有过多符号连接问题。
  EIO I/O 存取错误


 write函数

  #include <unistd.h>

  ssize_t write(int fd, const void *buf, size_t count);

  参数:   
  fd:要进行写操作的文件描述词。
  buf:需要输出的缓冲区
  count:最大输出字节计数  

  返回值:成功返回写入的字节数,出错返回-1并设置errno


 read函数

  #include <unistd.h>

  ssize_t read(int fd, void *buf, size_t count);  
  参数:      
  buf:需要读取的缓冲区
  count:最大读取字节计数 

  返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0 。


以下摘自:https://blog.csdn.net/songyang516/article/details/6779950

lseek函数

   #include <sys/types.h>

  off_t lseek(int filedes, off_t offset, int whence);

  返回值:新的偏移量(成功),-1(失败)

  所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数

  参数 offset 的含义取决于参数 whence:

  1. 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。
  2. 如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo 加上 offset,
         offset 可以为正也可以为负。
     3. 如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,
         offset 可以为正也可以为负。

  SEEK_SET、SEEK_CUR 和 SEEK_END 使用之前是 0、1 和 2。

  lseek 的以下用法返回当前的偏移量:

    off_t    currpos;
        currpos = lseek(fd, 0, SEEK_CUR);

  lseek还有一个作用,就是文件的扩展,但是文件扩展需要对文件最后进行一次写的操作

  lseek(fd, 2000, SEEK_END);

  write(fd,"a",1);


 

 

 

  



猜你喜欢

转载自www.cnblogs.com/huangtiandi/p/9163352.html