zoukankan      html  css  js  c++  java
  • linux中文件I/O操作(系统I/O)

    我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作。

    用到的文件I/O有以下几个操作:打开文件、读文件、写文件、关闭文件等,对应用到的函数有:open、read、write、close、lseek(文件指针偏移)

    文件描述符:对于内核而言,所有打开的文件都通过文件按描述符引用。文件描述符是一个非负整数。
                          当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
                          当读、写一个文件时,使用open/creat返回的文件描述符标识该文件,将其作为参数传送给read或write。

    linux系统下文件描述符0是标准输入,1是标准输出,2是标准出错,所以一般打开文件的时候文件描述符都是从3开始。 这里read和write是不能格式化读取和写入,如果想了解文件怎么格式化读取和写入的话,可以看看我以前写的一篇随笔。

    一、打开文件1)头文件
           #include <sys/types.h>
           #include <sys/stat.h>
           #include <fcntl.h>2)函数原型    int open(const char *pathname, int flags);
    
          参数:
          a、pathname:打开或者创建的文件名字,如"text"
          
          b、 flags:
             O_RDONLY:只读打开
             O_WRONLY:只写打开
             O_RDWR:读、写打开
             O_CREAT:若此文件不存在则创建它,使用O_CREAT时后面要跟文件的访问权限位,如O_CREAT,0777
             O_APPEND:每次写时都追加到文件的尾端
             O_EXCL :如果同时指定了O_CREAT,而文件已经存在,则出错,用此可以测试一个文件是否
                      存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作
             O_DSYNC:使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的
                      数据,则不需等待文件属性被更新
             O_NONBLOCK :如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则
                          此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
             O_NOCTTY:如果path引用的是  终端设备,则将该设备分配为此进程的控制终端
             O_SYNC:使每次write要等待物理I/O操作完成,包括有该write引起的文件属性更新所需的I/O
             O_TRUNC:如果文件存在,并且是常规文件而且以读写或者只写打开,则将其长度截断为0,
                      如果文件是FIFO或终端设备文件,O_TRUNC标志被忽略,否则O_TRUNC不明确
             O_DIRECTORY:如果pathname引用的不是目录,则出错
    
    (3)返回值:
         成功:文件描述符
         失败:-1     
            
    二、读取文件1)头文件  #include <unistd.h>2)函数原型   ssize_t read(int fd, void *buf, size_t count);
         参数:
         a、fd:调用open后返回的文件描述符
         b、buf:用来存放从文件中读到的数据的缓冲区
         c、count:读取的字节数
         
    (3)返回值:
         成功:读到的字节数,如果读到文件尾端,则返回0
         失败:-1
         
    三、写数据1)头文件 #include <unistd.h>2)函数原型   ssize_t write(int fd, const void *buf, size_t count);
         参数:
         a、fd:调用open后返回的文件描述符
         b、buf:从来存放数据的缓冲区
         c、count:写入数据的字节数
    
    (3)返回值:
         成功:返回已写的字节数
         失败:-1
         
    四、关闭文件1)头文件  #include <unistd.h>2)函数原型  int close(int fd);
         参数:
         a、fd:调用open后返回的文件描述符
    
      
    五、文件偏移1)头文件  #include <sys/types.h>
                  #include <unistd.h>2)函数原型   off_t lseek(int fd, off_t offset, int whence);
          参数:
          a、fd:调用open后返回的文件描述符
          b、offset  和参数whence有关,通常设置为0 (according  to  thedirective whence as follows)
          c、whence:
             SEEK_SET: 将文件的偏移量设置为距文件开始处offset个字节
             SEEK_CUR:将文件的偏移量设置为其当前值加offset个字节,offset可为正或负
             SEEK_END: 将文件的偏移量设置为文件长度加offset,offset可为正或负
             
    (3)返回值:
         成功:返回新的文件偏移量
         失败:-1

     

    下面是代码:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/fcntl.h>
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    
    #define PATHNAME "text.txt"
    #define LENGTH 4096
    
    void error(char *name) //错误提示
    {
        perror(name);
        exit(1);
    }
    
    int main(int argc,char *argv[])
    {
        
        int fd ; //存放文件描述符
        int size1; //读操作时的返回值
        int size; //写操作时的返回值
        int offset; //文件偏移量
            
        //打开文件
        /*O_REWR表示已读写权限打开文件,O_CREAT表示如果文件不存在则创建
        *创建的新文件的权限为0777,即是可读可写可执行,O_APPEND表示
        *写入数据时从文件尾端写入*/
        if((fd = open(PATHNAME,O_RDWR|O_CREAT|O_APPEND,0777)) == -1)       
        {
            error("open");
        }        
        
        
        char buf[LENGTH];
        bzero(buf,sizeof(buf));
        
        //从文件中读取数据
        if((size1 = read(fd,buf,sizeof(buf))) == -1)
        {
            error("read");
        }
        
        printf("%s
    ",buf);
      
      
       char buf1[LENGTH] = "小世界";
       //写入数据到文件中
       if((size = write(fd,buf1,strlen(buf1))) == -1)
       {
           error("write");
       }
    
        char buf3[LENGTH] = "hello world";
        if((size = write(fd,buf3,strlen(buf3))) == -1)
        {
            error("write");
        }
        
        //因为写入数据到文件中的时候已经把文件指针偏移到文件尾端了,所以要重新把文件指针偏移到文件头,方便下面的读操作
        if((offset = lseek(fd,0,SEEK_SET)) == -1)
        {
            error("lseek");
        }
        
        bzero(buf,sizeof(buf));
        if((size1 = read(fd,buf,sizeof(buf))) == -1)
        {
            error("read");
        }
        printf("%s
    ",buf);
        
        //关闭文件
        close(fd);
        return 0;
    }
    View Code
    • 用cat命令打开文件
    • 终端输出
    鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
  • 相关阅读:
    测试用例设计方法——等价类划分法
    软件测试方法--错误推测法
    测试用例设计方法--因果图法
    测试用例设计方法--判定表法
    测试用例设计方法--边界值分析法
    测试用例设计方法--场景法
    软件测试分类介绍
    软件测试模型
    软件开发过程模型
    m3u8视频流下载方案
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/7500867.html
Copyright © 2011-2022 走看看