Linux系统学习–文件编程(open,write,read、光标lseek)

导读:本篇文章讲解 Linux系统学习–文件编程(open,write,read、光标lseek),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

常用对文件编程的操作如open、read、write

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 : 待打开 / 创建文件的路径名
flags : 用于指定打开文件 / 创建文件的方式
mode : 仅当创建新文件(在flags中使用了O_CREAT)时才使用,用于指定文件的访问权限

flags类型有:

  1. O_RDONLY :只读方式打开
  2. O_WRONLY : 只写方式打开
  3. O_RDWR : 可读可写方式打开 (这个较为常用)

除了以上三种权限需指定一种,还有如下权限常数可选择使用:

  1. O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
  2. O_EXCL 如果同时制定了 O_CREAT,而文件已经存在,则出错
  3. O_APPEND 每次添加数据给文件,都会加到文件的尾端,不会覆盖数据
  4. O_TRUNC 用该权限去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则原来的数据会被清除,新数据重新添加进来

代码样例:

int fa;  //给文件起的编号

//可读可写打开
fa = open(./fire1”,O_RDWR); 

//可读可写,不存在这个文件则会重新创建它
fa = open(./fire1”,O_RDWR|O_CREAT.0600);
//( 0600-> 文件权限 )	

//如果之前这个文件已经存在数据,那么O_TRUNC会将原来的数据归0(删除),重新录入
fa = open(./fire1”,O_RDWR|O_TRUNC);
//如果之前这个文件已经存在数据,那么O_APPEND会在原来数据基础上换行,加入新的数据。
fa = open(./fire1”,O_RDWR|O_APPEND);

//如果已经存在这个文件,那么O_EXCL会报错
fa = open(./fire1”,O_RDWR|O_EXCL);

write解析

头文件:

 #include <unistd.h>

原型函数

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

fd:要进行写操作的文件描述词。
buf:需要输出的缓冲区(读入数据的地方,例如字符串等)
count:最大输出字节计数 
返回值:成功返回写入的字节数,出错返回-1并设置errno

代码演示:

//(文件编号,从3开始)
int fa;	

// 输出的缓冲区
char *buf =”liuzheng hen shuai”; 

//(这里不可用sizeof() 测长度 会出问题)
int n_write = write(fa , buf , strlen(buf) );


read解析

头文件:

#include <unistd.h>

函数原型:

read(int fd, void *buf, size_t count);
buf:需要读取的缓冲区
count:最大读取字节计数        
返回值:成功返回读取的字节数(也就是上面write中输入缓冲区buf的数据长度大小),出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0 。  

代码演示:

//给文件起个编号名字
int fa;

// 创建输出的缓冲区
char *buf =”liuzheng hen shuai”; 

//(这里不可用sizeof() 测长度 会出问题)
int n_write = write(fa , buf , strlen(buf) );	//n_write –> 写入多少个字节

//创建读取的缓冲区
char *readBuf;	//readBuf -> 读取文件内容
readBuf = (char *)malloc(sizeof(char) * n_write);

int n_read = read(int fa,readBuf,n_write);	//n_read –> 读取文件内容字节大小

补充说明读数据光标位置处理

光标解析

头文件:

#include<sys/types.h>
#include<unistd.h>

函数类型如下:

  • lseek(fa,0,SEEK_SET);(光标从开头第0个位置开始)

  • lseek(fa,-n_write ,SEEK_CUR); (光标从当前位置开始, -n_write -> 往前面移动 )

  • lseek(fa,-n_write ,SEEK_END);(光标从结尾开始, -n_write -> 往前面移动 ),此时这里的n_write就是你写入文件的数据长度,正负号表明光标向前面移动还是向后面移动

前面write读入数据后,如果要使用read读取数据和数据长度大小,需要用lseek函数将光标重新调整到开头位置进行测量

获取文件指针当前位置:int len = lseek(fd, 0, SEEK_CUR);
获取文件长度:int len = lseek(fd, 0, SEEK_END);

补充说明:

打开的文件一定要记得使用!!!close(文件编号)!!来关闭文件,防止对文件造成损害或者破坏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68488.html

(0)
newbe的头像newbebm

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!