Linux文件编程open、read、write操作
- 常用对文件编程的操作如open、read、write
- open解析:
- write解析
- read解析
- 补充说明读数据光标位置处理
- 光标解析
- 补充说明:
常用对文件编程的操作如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类型有:
- O_RDONLY :只读方式打开
- O_WRONLY : 只写方式打开
- O_RDWR : 可读可写方式打开 (这个较为常用)
除了以上三种权限需指定一种,还有如下权限常数可选择使用:
- O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
- O_EXCL 如果同时制定了 O_CREAT,而文件已经存在,则出错
- O_APPEND 每次添加数据给文件,都会加到文件的尾端,不会覆盖数据
- 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(文件编号)!!来关闭文件,防止对文件造成损害或者破坏