文件系统调用(open、read、write、close)

文件系统调用

文件使用方式:打开文件→文件读/写→关闭文件

打开文件—open()

int open(filename,int flags);
int open(filename,int flags,mode_t mode);
标志含义
O_RDONLY以只读的方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以读写方式打开文件
O_APPEND以追加的方式打开文件
O_CREAT如没有要打开的文件,创建该文件
O_EXEC若使用了O_CREATE而且文件以及存在,就会发生一个错误
O_NOBLOCK以非阻塞的方式打开一个文件
O_TRUNC若文件已经存在,则删除文件的内容

mode为八进制数表示文件权限,例如:0640表示-rw-r-----

打开文件示例:

open("test",O_RDONLY|O_CREATE,0640); //成功则返回一个文件描述符,否则返回-1

文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。

文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象关联,这些信息被称作文件的上下文。

内核利用文件描述符(file descriptor)来访问文件,在形式上它是一个非负整数,代表一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。习惯上,标准输入(standard input)的文件描述符是0,标准输出(standard output)是1,标准错误(standard error)是2。POSIX定义了STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO来代替0、1、2,这三个符号常量位于头文件unistd.h中。

读文件—read()

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

说明:从文件描述符fd所指文件中读取count字节的数据,放到缓冲区buf中。如果成功则返回读取的字节数,出错返回-1;若在调read之前已到达文件末尾,则这次read返回0。

写文件—write()

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

说明:将缓冲区bufcount个字节写入文件描述符fd所指文件中去。若调用成功返回实际写入的字节数;若发生fd有误或者磁盘已满等问题,返回值 < count;若没有写出任何数据,则返回值为0;调用不成功返回-1,并将错误代码存入errno中。

关闭文件—close()

int close(int fd); //成功返回0,否则返回-1

关闭文件和打开文件是配对的,即打开的文件最好要显式的关闭。

读写文件示例

编程,打开文件a.txt,将文件中的内容复制到文件b.txt中

#include<stdio.h>
#include<fcntl.h> //文件信息控制
#include<unistd.h> //类UNIX系统的系统调用
#include<stdlib.h>
#define count 1
int main(int argc,char*argv[])
{
        int fd1,fd2;
        long len=0;
        char *p,ch;
        p=(char*)malloc(sizeof(char)*count); //指向缓冲区
        fd1=open("a.txt",O_RDONLY); //以只读方式打开文件
        if(fd1==-1){ //打开失败
                printf("Open a.txt fail!");
                exit(1);
        }
        fd2=open("b.txt",O_RDWR|O_CREAT|O_TRUNC,0640);//可读可写方式
        if(fd2==-1){
                printf("Open b.txt fail!");
                exit(1);
        }
        while(read(fd1,p,count)==1){ //读取一个字符到p所指向的空间
                write(fd2,p,count); //向fd写入数据
                len++;
        }
        close(fd1);
        close(fd2);
        free(p); //释放空间
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhugenmi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值