当前位置:   article > 正文

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

open read write

文件系统调用

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

打开文件—open()

int open(filename,int flags);
int open(filename,int flags,mode_t mode);
  • 1
  • 2
标志含义
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
  • 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);
  • 1

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

写文件—write()

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

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

关闭文件—close()

int close(int fd); //成功返回0,否则返回-1
  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/183024
推荐阅读
相关标签
  

闽ICP备14008679号