linux高级编程(文件I/O)
创始人
2024-09-25 08:22:17
0

标准I/O与文件I/O的区别:

文件操作:
         缓存           操作对象                具体操作
标准IO  全缓存/行缓存   文件指针(流指针)FILE *  1.打开 --fopen  
                                                2.读写 
                                                  fgetc/fputc 
                                                  fgets/fputs 
                                                  fread/fwrite 
                                                3.关闭 
                                                  fclose 
                                                4.定位 
                                                  fseek/ftell/rewind 
                                                                                          
                                                  
文件IO  不带缓存        文件描述符 (整数)       1.打开 --open 
                                                2.读写 --read/write
                                                3.关闭 --close 
                                                4.定位 --lseek 

特性:

        .1 没有缓存区 (//可以认为数据直接交给了内核 )
        .2 操作对象不在是流(FILE *),而是文件描述符(整数)
        .3文件描述符
          很小的非负的整数    int   0-1023
          内核每打开一个文件就会获得一个文件    描述符   

         每个程序在启动的时候操作系统默认为其打开
            三个描述符与流对象匹配:
               0 ==>STDIN_FILENO === stdin
               1 ==>STDOUT_FILENO == stdout
               2 ==>STDERR_FILENO == stderr
      
          stdin,stdout,stderr,===>FILE*

优缺点:

标准I/O:

优点:

  1. 缓冲:标准I/O使用了缓冲区,可以减少对文件的直接访问,提高性能。
  2. 格式化输出:标准I/O函数如printfscanf提供了强大的格式化功能,可以方便地处理格式化输入输出。
  3. 跨平台:标准I/O函数在大多数操作系统上都是可用的,提高了代码的可移植性。

缺点:

  1. 性能:与文件I/O相比,标准I/O可能会有额外的性能开销,因为它包含了额外的缓冲和格式化处理。
  2. 复杂性:标准I/O函数可能比文件I/O函数更复杂,需要更多的参数和错误处理。

文件I/O:

优点:

  1. 性能:文件I/O直接操作文件描述符,没有额外的缓冲和格式化处理,因此通常比标准I/O更快。
  2. 灵活性:文件I/O提供了更多的控制和灵活性,允许程序员直接操作文件和文件描述符。
  3. 无缓冲:文件I/O可以直接读写文件,无需缓冲区,这使得它可以用于处理非常大的文件或需要实时处理的数据。

缺点:

  1. 复杂性:文件I/O函数通常比标准I/O函数更复杂,需要更多的参数和错误处理。
  2. 格式化:文件I/O不提供格式化功能,需要程序员手动处理数据格式。
  3. 跨平台:文件I/O函数在不同的操作系统上可能有不同的行为,这降低了代码的可移植性。

一般在没有特殊要求的情况下,在linux下优先选择文件I/O

open()

1.open
        open("1.c",O_WRONLY|O_CREAT,0666 );
        
        int open(const char *pathname, int flags,int mode);
        功能:
            获得一个文件描述符
        参数:
            pathname:文件名
            flags:
            必须项:他们之间是互斥的,所以有且只能有一个 
                O_RDONLY
                O_WRONLY
                O_RDWR
            可选项:
            O_CREAT, 创建文件  //这个标志量存在,则需要指定参数 mode
            O_EXCL,  需要和O_CREAT同时使用,表示新建的文件不存在,成功,否则open就会失败
            O_TRUNC  文件内容清空
            O_APPEND追加
            
            //后面
            O_NOCTTY,不是终端设备
            O_ASYNC 异步io,什么时候io不确定,
            O_NONBLOCK 非阻塞 

一般在创建文件时,都加入截断操作,标准io中w=O_CREAT | O_WRONLY | O_TRUNC

write()

    2.write
        char buf[1024];
        ssize_t write(int fd,  const  void *buf, size_t count);
        功能:
            通过文件描述符向文件中写一串数据
        参数:
            fd:文件描述符
            buf:要写入文件的字符串的首地址
            count:要写入字符的个数
        返回值: 
            成功返回实际写入的个数
            失败返回-1

read()

3.read
        ssize_t read(int fd, void *buf, size_t count);
        功能:
            通过文件描述符读取文件中的数据
        参数:
            fd:文件描述符
            buf:存放数据空间的首地址
            count:要读到数据的个数
        返回值:
            成功返回读到数据的个数
            失败返回-1
            读到文件结尾返回0

lssek()

4.lseek  ==  fseek, rewind ftell
        off_t lseek(int fd, off_t offset, int whence);
        功能:
            定位文件的位置
        参数:
            fd:文件描述符
            offset:偏移量
                        正:向后偏移
                        负:向前偏移
                        零:不偏移
            whence:
                SEEK_SET
                SEEK_CUR
                SEEK_END
                         正 空洞 
        返回值:
            成功返回偏移量
            失败返回-1
            lseek(fd,0,SEEK_END);

文件描述符与流指针的转换:

filino:

int fileno(FILE *stream);
功能:
    获得一个文件流指针中的文件描述符
参数:
    stream:文件流指针
返回值:
    成功返回文件描述符
    失败返回-1

fdopen:

2.fdopen    int fd -> FILE *fp
 FILE *fdopen(int fd, const char *mode);
 功能:
    将文件描述符转化为文件流指针
 参数:
    fd:已经打开的文件描述符
    mode:
        "r"
        "r+"
        "w"
        "w+"
        "a"
        "a+"
 返回值:
    成功返回文件流指针
    失败返回NULL    

相关内容

热门资讯

安卓系统可以分享视频吗,安卓系... 你有没有想过,手机里的视频怎么才能和朋友一起分享呢?尤其是当你发现了一个超级搞笑的短视频,或者是一部...
安卓系统上安装pc软件,跨平台... 你是不是也和我一样,对安卓系统上的那些PC软件垂涎欲滴呢?想象在手机上就能享受到电脑上的强大功能,是...
安卓原生系统怎么折腾,深度定制... 你有没有想过,你的安卓手机其实就像一个等待你发挥创意的画布呢?没错,就是那个安卓原生系统,它可是隐藏...
安卓作业系统耗电,深度解析耗电... 手机电量告急,是不是你也和我一样,对安卓作业系统的耗电问题头疼不已?别急,今天就来聊聊这个让人又爱又...
宝宝浙江游戏安卓系统,乐享童年 最近有没有发现你家的小宝贝对手机上的游戏越来越感兴趣了呢?尤其是那些在浙江地区特别受欢迎的安卓系统游...
安卓系统程序放在那,安卓系统程... 你有没有发现,手机里的安卓系统程序总是乱糟糟的,有时候找起来就像大海捞针一样?别急,今天就来给你揭秘...
手表怎么装上安卓系统,轻松安装... 你有没有想过,你的安卓手机那么智能,那你的手表呢?是不是也想给它来个升级,让它也能玩转各种应用,变身...
碧蓝航线在安卓系统,安卓平台上... 你知道吗?最近在安卓系统上,有一款游戏可是火得一塌糊涂,那就是《碧蓝航线》!这款游戏不仅画面精美,剧...
安卓系统设置分辨率,解锁屏幕显... 亲爱的手机控们,你是不是也和我一样,对手机屏幕的分辨率有着超乎寻常的执着呢?分辨率,这个看似简单的数...
安卓超市收银系统下载,高效便捷... 你有没有想过,逛超市的时候,收银员那熟练的操作是不是让你也跃跃欲试呢?现在,机会来了!安卓超市收银系...
安卓系统升级清理,深度清理与性... 亲爱的手机控们,你是不是也和我一样,对安卓系统的升级清理充满了好奇和期待呢?每次系统更新,都仿佛是给...
安卓如何绕过系统安装,深度解析... 你是不是也和我一样,对安卓系统的安装限制感到有些头疼?有时候,我们可能需要安装一些特殊的软件或者游戏...
安卓系统跟linux系统怎么样... 你有没有想过,你的手机里那个默默无闻的安卓系统,和电脑上那个稳如泰山的Linux系统,它们之间到底有...
凤凰系统用安卓软件很卡,凤凰系... 最近是不是发现你的凤凰系统用安卓软件时总是卡得要命?别急,让我来给你细细道来,看看这其中的原因和解决...
安卓系统怎么玩脸书,脸书应用攻... 你有没有想过,在安卓系统上怎么玩转脸书呢?这个全球最大的社交平台,可是让很多人沉迷其中哦!别急,今天...
虚拟机系统安卓11,虚拟机系统... 你有没有想过,手机里的安卓系统竟然也能变成电脑上的虚拟机?没错,就是那个我们每天不离手的安卓11系统...
钻石vip微信安卓系统,畅享无... 你知道吗?在微信这个庞大的社交世界里,钻石VIP可是个让人羡慕的身份呢!尤其是对于那些安卓系统的用户...
安装安卓系统后蓝屏,安卓系统安... 你刚刚升级了安卓系统,是不是觉得自己的手机焕然一新,充满了科技感?就在你沉浸在新系统的美好体验中时,...
安卓系统如何调出返回键,安卓系... 你是不是也和我一样,有时候在使用安卓手机时,突然发现那个神秘的返回键怎么就消失了?别急,今天就来手把...
荣耀8安装原生安卓系统,体验纯... 你有没有想过,让你的荣耀8手机焕发新生?别再让它被那些臃肿的第三方系统拖累啦!今天,就让我带你一起探...