1.文件的概念

  文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现。

                

  系统调用、文件IO、标准IO的关系如下:

              

2.linux系统的文件分类

  a.普通文件(-):ELF文件,文本文件

  b.目录(d)

  c.字符设备文件(c):访问字符设备

  d.块设备文件(b):访问块设备

  e.连接文件(l):相当于快捷方式

  f.管道文件(p):用于管道通信

  g.套接字文件(s):用于socket通信

3.文件缓冲区

  文件缓冲区是在访问文件时不会每次操作都要去同步到访问磁盘中的文件,而是到达某种条件后才合并访问,根据同步的条件不同,文件的缓冲方式有三种:

  a.全缓冲

    当缓冲区满了才同步(刷新缓冲区)

  b.行缓冲

    当遇到换行符"\n"才同步缓冲区

  c.无缓冲

    没有缓冲区

  标准输入、标准输出属于行缓冲,标准错误属于无缓冲,缓冲区大小在512bytes~4Kbytes之间的效率最高。

  PS:printf函数会同步到缓冲区的情形(输出)

    a.遇到换行符"\n"

    b.程序正常结束

    c.遇到scanf函数

    d.缓冲区满了

    e.调用了fflush函数

  修改缓冲区的大小

    setbuf()/setvbuf()

    等价于

    

    

    参数:stream  要修改缓冲区的文件

       buf  缓冲区手地址

       mode  缓冲区类型

       

       size  缓冲区的大小

       成功返回0,失败返回非0。

4.标准IO

  标准IO属于C标准库中的关于文件操作的可函数,只要有C的环境就可以使用,文件的操作都是按照以下步骤进行:打开文件  >  操作文件  >  关闭文件。

  a.打开文件  fopen函数

    

    参数:  pathname  要打开的文件路径,要用双引号括起来

         mode  打开的方式          

              "r" - 以只读方式方式打开,文件必须存在

           "r+" - 以读写方式方式打开,文件必须存在

           "w" - 以只写方式方式打开,文件不存在则创建,存在则清空文件内容

            "w+" - 以读写方式方式打开,文件不存在则创建,存在则清空文件内容

            "a" - 以只写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)

              "a+" - 以读写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)

                   fopen默认以文本方式打开,如果希望以二进制打开可以加"b"("rb+" "r+b")

      成功返回文件流指针(代表一个打开的文件),失败返回NULL。

  b.关闭文件  fclose函数

    

   传入fopen的返回值

     注:不再访问的文件应该关闭,在程序结束时候所有打开的文件都会被自动关闭,但是要手动关闭。

c.文件读写

    1)非格式化读写

      I:按字符读写  fputc/fgetc

      

      参数:c - 要写的字符(字符数据)

        stream - 要写的文件流指针

         成功返回写入的字符,失败返回EOF

      

      参数就是要读的文件流指针

      成功返回读到的字符,失败或者读到末尾就返回EOF

      II:按行读写  fputs/fgets

      

      参数:  s - 要写入的字符串(不包括\0)

       stream - 要写的文件流指针

        成功返回非0数据,失败返回EOF

      

      读到换行符/文件结束/size-1大小 为止,在最后加上结束符

     参数:  s - 读文件内容存储首地址

       size - s指向空间的大小

       stream - 要读的文件流指针

        成功返回读到的内容,失败/读到末尾返回NULL

      注:从键盘读取字符串不要用scanf,而要用fgets(buf,size,stdin);

      gets函数从标准输入读取字符串,但是不检查越界,不允许使用,puts函数输出字符串到标准输出,也不常用

      III:按块读写  fwrrite/fread

      

      参数: ptr - 读/写的内存地址

       size - 读/写单个数据大小

      nmemb - 希望读/写数据个数

       stream - 读/写的文件流指针

    返回成功读/写的数据个数(成功个数小于希望的个数,出错/到末尾)

     如何区分读到末尾和出错 ------------- 使用ferror函数和feof函数

      

      如果出错,ferror函数返回真

     如果读到末尾,feof函数返回真

      if(ferror(fp)){

       //出错

      }

      if(feof(fp)){

     //读到文件末尾

      }

  

PS:如果有错误麻烦指出来,大家互相学习 0-0

文件的概念、标准IO其一的更多相关文章

  1. 文件IO和标准IO的区别【转】

    一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...

  2. 标准IO与文件IO 的区别【转】

    本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一 ...

  3. 标准IO与文件IO 的区别

    先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存 ...

  4. C5 标准IO库:APUE 笔记

    C5 :标准IO库 在第三章中,所有IO函数都是围绕文件描述符展开,文件描述符用于后续IO操作.由于文件描述符相关的操作是不带缓冲的IO,需要操作者本人指定缓冲区分配.IO长度等,对设备环境要求一定的 ...

  5. 为什么需要标准IO缓冲?

    (转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...

  6. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  7. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  8. UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作

    标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题.   1 ...

  9. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

随机推荐

  1. c++ (翁恺浙大公开课)前言、目录

    c++语言比较复杂,学习起来相对难一些,加之特性繁多,很难全部掌握:特别是工作几年之后,每次温故都有很大的收获,之前不懂的地方随着工作的积累和重新的学习,都会慢慢的解开,当然我现在还是很菜... 之所 ...

  2. Memcached 最新版本发布,不再仅仅是个内存缓存了

    导读 Memcached 1.5.18和之后版本可以在服务重启时恢复内存缓存.新版本还通过DAX文件系统挂载来实现缓存持久性功能. 可以通过在启动选项使用该功能: -e /tmpfs_mount/me ...

  3. 插入和查询HBase速度都比较慢

    表层问题:插入和查询HBase速度比较慢 排查一,查看HBase节点状态,发现正常运行: 排查二,查看访问HBase服务的状态,发现服务停止: 依次点击服务实例,查看服务状态 133和135节点上的服 ...

  4. 关于MySQL连接Navicat Premium 12失败的解决方法

    出现问题的原因:MySQL8.0之后更换了加密方式,而这种加密方式客户端不支持 解决:更改加密方式 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysq ...

  5. Day10 - D - 矿场搭建 HYSBZ - 2730

    煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖 ...

  6. Day3-P - Matrix POJ3685

    Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i ...

  7. 「Luogu1231」教辅的组成

    传送门 Luogu 解题思路 看到种匹配问题,马上想到最大流所以这就是一道SB题. 但是有一个小问题,就是每一本书都只能匹配一次,那么我们对所有书进行拆点即可,这个操作类似于这题 细节注意事项 细节有 ...

  8. 【rabbitmq】Queueingconsumer被废止后老代码如何做的解决方案

    amqp-client 3.x之前的rabbitmq版本有个消费者的写法是借助于Queueingconsumer的: QueueingConsumer consumer = new QueueingC ...

  9. python-python基础4

    本章内容: 装饰器 生成器 迭代器 json & pickle 模块 软件目录结构规范 一.装饰器 装饰器 在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数 ...

  10. Ubuntu操作系统编写zabbix的启动管理脚本

    Ubuntu操作系统编写zabbix的启动管理脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改zabbix的pid存放路径 1>.创建存放zabbix的pid目录 ...