一,open函数
概述:
打开或者创建文件。成功返回file descriptor文件描述符(fd),失败返回(-1)。
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);
//用于创建文件(一般不用)
int creat(const char *pathname, mode_t mode);
const char *pathname: 文件的路径
int flags: 标志
一般用:
O_CREAT -> 文件不存在时创建文件。
O_APPEND -> 写文件时加到文件的尾部,不会把之前写的内容覆盖。
O_RDONLY -> 仅可读。
O_WRONLY -> 仅可写。
O_RDWR -> 可读可写。
mode_t mode: 权限
一般用:
S_IRUSR(代表数字为4) -> 可读 4
S_IWUSR(代表数字为2) -> 可写 2
S_IXUSR(代表数字为1) -> 可执行 1
S_IRWXU(代表数字为7) -> 可读,可写,可执行 7
二,write函数
概述:
根据open函数的文件描述符(fd),往里面写入内容。成功返回写入内容的字符串大小(与strlen返回值相同),失败返回(-1)。
write函数原型:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
//sszie_t 与 long int相同类型
const void *buf:缓冲区,用于临时存储写入文件的内容
(注意是无类型指针,不要局限于一种{char}类型)
size_t count: 写入文件内容大小(可以用strlen来计算)
三,read函数
概述:
根据open函数的文件描述符(fd),读取里面的内容。成功返回读取内容的字符串大小(与strlen返回值相同),失败返回(-1)。
read函数原型:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
size_t count:在read函数中建议用sizeof计算
四,lseek函数
概述:
重新定位读和写文件的偏移量,就是移动光标。成功返回当前位置到开始的长度,失败返回(-1)。
lseek函数原型:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
int whence:
一般用:
SEEK_SET:The offset is set to offset bytes. offset为0时表示文件开始位置。
SEEK_CUR:The offset is set to its current location plus offset bytes. offset为0时表示当前位置。
SEEK_END:The offset is set to the size of the file plus offset bytes. offset为0时表示结尾位置。
五,close函数
概述:
根据open函数的文件描述符,关闭open函数打开的文件。成功返回(0),失败返回(-1)。
close函数的原型:
#include <unistd.h>
int close(int fd);
六,动态文件和静态文件
静态文件:
保存在磁盘的文件。
动态文件:
当我们(open)打开一个(file)静态文件的时候,会在linux内核里产生一个结构体来记录文件的(fd)文件描述符,(buf)内容,信息节点等,所有的read()和write()都是对动态文件进行操作,当调用close()的时候,就会把动态文件的内容保存在静态文件里。
为什么对动态文件操作,不对静态文件操做?
因为操作静态文件是按块(100个字节)读写的,不够灵活方便。操作动态文件是按字节读写,可以随机操作。
七,文件描述符
概述:
对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。
系统默认文件描述符:
0 标准输入
1 标准输出
2 标准错误
下面为一个小练习,创建一个文件,往文件内写入"you hen shuai~":
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a;
int write_nu;
char* readbuf;
int read_nu;
char* buf = "you hen shuai!\n";
a = open("./file1",O_RDWR);
if(a>0)
{
printf("OK!~~~~\n");
printf("%d\n",a);
}
if(a<0)
{
printf("NO!~~now create!\n");
printf("----------------\n");
creat("./file1",0600);
a = open("./file1",O_RDWR);
printf("OK NOW!~~~~\n");
printf("%d\n",a);
}
write_nu = write(a,buf,strlen(buf));
if(write_nu != -1)
{
printf("this file has %d bye\n",write_nu);
}
int num = lseek(a,0,SEEK_END);//计算文件里的内容大小
printf("num = %d\n",num);
readbuf = (char*)malloc(sizeof(char)*num);
lseek(a,0,SEEK_SET);//把光标移到文件最前面,再读
read_nu = read(a,readbuf,sizeof(readbuf));
printf("read:%d,context:%s\n",read_nu,readbuf);
close(a);
return 0;
}
结果为: