基于Linux的I/O操作

来源:互联网 发布:贵州广电网络开户费 编辑:程序博客网 时间:2024/06/07 22:03

Linux文件的I/O编程

Linux中文件及文件描述符简介

  • 在Linux中对目录和涉笔的操作都等同于文件的操作
  • Linux中的文件主要有以下4种:普通文件、目录文件、连接文件和设备文件
  • 在Linux下,所有对设备和文件的操作都使用文件描述符来进行的
  • 一个进程的启动,一般伴随三个文件的打开:标准输入(STDIN_FILENO)、标准输出(STDOUT_FILENO)、标准错误(STDERR_FILENO)

基本I/O操作函数——>不带缓存:

  • open、read、write、lseek以及close

    • open、close函数

      • open函数用于打开或创建文件,可以同时指定属性
      • close函数用于关闭打开的文件
      • 语法格式:

        头文件:    #include<sys/types.h>    #include<sys/stat.h>    #include<fcntl.h>    #include<unistd.h>
      • open函数:

        int open(const char *pathname, flags, int perms);pathname:被打开的文件名(可包含路径)flag(打开方式):(常用方式)    O_RDONLY:只读方式    O_WRONLY:可写方式    O_RDWR:读写方式    O_CREATE:如果文件不存在,就创建一个新的文件,并用第三个参数为其设置权限    --------------------------------    O_EXCL:用于测试文件是否存在    O_TRUNC:如果文件已经存在,并且以只读或只写成功打开,那么会先全部删除文件中原有数据    O+APPEND:以添加的方式打开文件,打开时,文件指针指向文件的末尾perms:被打开文件的存取权限,为8禁止表示法flag参数可以通过"|"连接多个组合形式返回值:    成功返回文件描述符,失败返回-1
      • close函数:

        int close(int fd);fd:文件描述符返回值:    成功返回0,失败返回-1
    • 如:mathod_01.c

      #include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>int main(void){    int fd;     //定义文件描述符    //调用open函数,以可读写的方式打开,使用“|”符号链接    if((fd=open("/home/my/myTest.c", O_CREATE | O_TRUNC | O_RDWR, 0666)) < 0){        perror("open:");    //打印出错信息        exit(1);    }else{        //注意:open函数返回的文件描述符一定是最小的未用文件描述符        printf("Open file:myTest.c %d\n", fd);    }    if(close(fd) <0){        perror("close:");        exit(1);    }else{        printf("Close myTest.c\n");    }    exit(0);}
    • read、write及lseek函数

      • 函数作用:
        • read:从指定的文件描述符中读出数据
        • write:用于向打开的文件写入数据,写操作从文件的当前位移量处开始,超出则返回失败
        • lseek:用于在指定的文件描述符中将文件指针定位到相应的位置
      • 语法格式:

        • 头文件

          #include<unistd.h>#include<sys/types.h>
        • read函数

          ssize_t read(int fd, void *buf, size_t count);fd:文件描述符buf:指定存储器读出数据的缓冲区count:指定读出的字节数返回值:成功返回读到的字节数;0表示读到文件尾;-1表示出错
        • write函数

          ssize_t write(int fd, void *buf, size_t count);fd:文件描述符buf:指定存储器写入数据的缓冲区count:指定写入的字节数返回值:成功,返回已写字节数;失败,返回-1
        • lseek函数

          off_t lseek(int fd, off_t offset, int whence);fd:文件描述符offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量。可正(前移)可负(后移)whence(当前位置的基点):    SEEK_SET:当前位置为文件的开头,新位置为便宜量的大小    SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量    SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小返回值:成功,返回当前位移;失败返回-1
    • 如:method_02.c

      #include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXSIZEint main(void){    int i, fd, size, len;    char *buf = "Hello! Welcom to Linux World!";    char buf_read[10];    len = strlen(buf);    //打开文件并制定权限    if((fd = open("/home/my/myTest.c", O_CREAT | O_TRUNC | O_RDWR, 666)) < 0 ){        perror("Open:");        exit(1);    }else{        printf("open file:myTest.c\n", fd);                     }    //write函数将buf中的内容写入到打开的文件中    if((size = write(fd, buf, len)) < 0){        perror("write:");        exit(1);    }else{        printf("Write:%s\n", buf);    }    //调用lseek函数移动指针,并调用read读取文件    lseek(fd, 0, SEEK_SET);    if((size = read(fd, buf_read, 10)) < 0){        perror("read:");        exit(0);    }else{        printf("read from file:%s\n", buf_read);    }    //关闭close()    if(close(fd) < 0){        perror("close:");        exit(1);    }else{        printf("Close myTest.c\n");    }    exit(0);}
  • fcntl函数:操作文件描述符的特性

    • 函数格式

      • 头文件

        #include <sys/types.h>#include <unistd.h>#include <fcntl.h>
      • 函数原型:

        int fcntl(int fd, int cmd, struct flock *lock);fd:文件描述符cmd:(常见的有以下几个)    F_DUPFD:复制文件描述符    F_GETFL:得到open设置的标志    F_SETFL:改变open设置的标志    F_GETTFK:根据lock描述,决定是否上文件锁    F_SETFK:设置lock描述的文件锁    F_SETOWN:设置进程号或进程组号lock:设置记录锁的具体状态    lock的结构:        struct flock{            short l_type;       //取值:F_RDLCK(读取锁→共享锁)、F_WRLCK(写入锁→排斥锁)、F_UNLCK(解锁)            short l_start;      //相对位移量(字节)            short l_whence;                 off_t l_len;        //加锁区域长度            pid_t l_pid;        }返回值:成功,返回0,;失败返回-1

标准I/O开发——>基于缓冲

  • 目的:
    减少使用read与write调用的数量
  • 三种类型的缓冲存储:
    • 全缓冲
      当填满标准I/O缓存后才进行实际的I/O操作。
    • 行缓冲
      当输入和输出有新的行符时,标准I/O库执行I/O操作。
    • 不带缓冲
      不对字符进行缓冲,如:能够尽快显示错误信息
  • 打开与关闭文件

    • 打开文件标准函数:fopen、fdopen、freopen,返回一个指向FILE的指针
      • fopen:指定打开文件的路径和模式
      • fdopen:指定打开的文件描述符合模式
      • freopen:可指定打开的文件、模式、指定特定IO流
    • 函数格式定义

      • 头文件

        #include<stdio.h>
      • fopen、fdopen、freopen

        FILE* fopen(const char* path, const char* mode);FILE* fdopen(int fd, const char* mode);FILE* freopen(const char* path, const char* mode, FILE* stream);path:包含要打开的文件的路径及文件名fd:要打开的文件描述符mode:文件打开状态,取值:    r/rb:打开只读文件,文件必须存在    r+/r+b:打开可读写文件,文件必须存在    w/wb:打开只写文件,覆盖的方式(会清空存在的文件内容)    w+/w+b:打开可读写文件,覆盖的方式    a/ab:附加的当时打开只写文件,添加方式(在文件内容后添加内容)    a+/a+b:附加的当时打开读写文件,添加方式stream:已打开的文件指针返回值:成功,返回指向FILE的指针,失败返回NULL
    • 关闭文件函数:fclose

      • 功能:缓冲区内的数据写入文件中,并释放文件资源
      • 格式:

        int fclose(FILE* stream);stream:已打开的文件指针返回值:成功:0,失败:EOF
    • 如:

      #include<stdio.h>int main(void){    FILE *fp;    //调用fopen函数    fp = fopen("/home/test/hello.c", "w");    if(fp != NULL){        printf("Open Success!");    }    //关闭文件指针    fclose(fp);}
  • 文件的读与写

    • 头文件:

      #include <stdio.h>
    • 读文件:fread函数

      • 格式:

        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptr:存放读入记录的缓冲区size:读取的记录大小nmemb:读取的记录数stream:要读取的文件流返回值:成功,返回实际读到的nmemb,失败返回EOF
    • 写文件:fwrite函数

      • 格式

        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);ptr:存放写入记录的缓冲区size:写入的记录大小nmemb:写入的记录数stream:要写入的文件流返回值:成功,返回实际写入的nmemb数目,失败返回EOF
    • 如:

      #include <stdio.h>int main(void){    FILE *stream;    char str[5] = {'H', 'e', 'l', 'l', 'o'};    //先打开文件    stream = fopen("test", "w");    int number = fwrite(str, sizeof(char), nmemb, stream);    printf("number = %d", number);    //关闭文件流    fclose(stream);}
0 0
原创粉丝点击