缓冲的几个基本概念

    缓冲的作用:减少系统read和write的次数。
全缓冲
        系统标准I/O缓冲区被写满时才进行真正的I/O操作。
        磁盘文件一般使用全缓冲
        全缓冲使用malloc来分配缓冲区
行缓冲
        系统遇到换行符时进行真正的I/O操作。

        Terminal一般使用行缓冲
        行缓冲有固定的size,当这个固定size的行缓冲区被填满时,不管有没有遇到换行符都开始进行一次I/O操作。
        行缓冲在得到输入数据时,会自动刷新输出流。这里说的得到数据,指的时数据在输入流中, 并不要求输入的数据一定被内核读取了。
不带缓冲的流
        没有缓冲区,直接写入文件。

        标准错误流默认使用不带缓冲。
刷新flush
        在使用全缓冲或者行缓冲时,即使我们的缓冲区未被写满(全缓冲)、或者还没遇到换行符(行缓冲),(也就是还没达到进行真正I/O的默认条件),只要我们使用flush,那么就会立即执行I/O操作,将数据流填入内核。

  1. #include <stdio.h>
  2. int fflush(FILE *fp);

ISO C的要求

        标准输入、输出流:当且仅当I/O操作不涉及交互式设备的时候,使用全缓冲
        标准错误:永远不适用全缓冲(ps:应该是考虑遇到特殊故障,如果使用全缓冲可能无法记录错误,比如突然断电,可能缓冲区内 
          数据就无法进行记录。)
一般情况(Most implementation):
        标准错误:使用不带缓冲区的流
        其它流:涉及到Terminal时使用行缓冲,其它情况使用全缓冲

改变数据流缓冲类型

    setbuf和setvbuf可以用来改变数据流的缓冲类型
 
#include <stdio.h>
void setbuf(FILE *restrict fp,char *restrict buf);
int setvbuf(FILE *restrict fp,char *restrictbuf,intmode,size_tsize);
Returns: 0 if OK, nonzero on error
intmode 可以取以下值:
_IOFBF fully buffered
_IOLBF line buffered
_IONBF unbuffered
setbuf和setvbuf的具体功能如Figure5.1所示:

    
        对于setbuf来说,如果buf参数为空,则关闭数据流的缓冲功能;如果buf的值不为空,指向一个缓冲区,那么就将缓冲类型设置为全缓冲(一些系统实现了当数据流来自Terminal时,设置为行缓冲)
        对于setvbuf的_IPFBF和_IOLBF,如果buf为空,则为系统默认缓冲区,如果buf不为空,则使用用户自定义的缓冲区。

        当一个文件被打开时,可以获得文件描述符。通过文件描述符可以对文件进行I/O操作。而I/O操作是通过流完成的。
流的定向:
        在Unix系统中,使用 ASCII标准时,一个字符可能用一个字节表示,这是流导向为字节导向;使用国际标准时,一个字节可能用两个字节表示,这是流定向为宽字符定向。

fwide

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp,intmode);

功能:
        设置流定向
参数:
        fp:打开的文件描述符
        intmode:带符号的int值,
            正数:表示宽字符定向
            负数:表示字节定向
            0: 
  表示不进行定向设置
返回值:
        流的定向,与intmode类似。

文件对象File object

        使用fopen打开文件时,会创建一个指向FILE型的的文件对象的指针。
        FILE对象几乎包括所有对文件的I/O操作所需要的信息。

APUE学习笔记——5缓冲Buffering、流、文件对象的更多相关文章

  1. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

  2. apue学习笔记(第三章 文件I/O)

    本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件.读写文件等 UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close open函数 ...

  3. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  4. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  5. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. APUE学习笔记——5.2流与文件对象、fwide

    1 流         当一个文件被打开时,可以获得文件描述符.通过文件描述符可以对文件进行I/O操作.而I/O操作是通过流完成的. 流的定向:         在Unix系统中,使用 ASCII标准 ...

  7. Java学习笔记(7)---流(Stream),文件(File)

    1.Stream流 a.定义: Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集 ...

  8. Java学习笔记之:Java 流

    一.介绍 Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一 ...

  9. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

随机推荐

  1. rowspan && colspan

    > 跨行 <html> <body> <table width="> <tr> <th>col1</th> &l ...

  2. Django学习笔记之Models与ORM操作

    一.ORM增加 from django.db import models class Publisher(models.Model): name = models.CharField(max_leng ...

  3. STC12C系列单片机PWM脉宽调制

    最近给别人做了一个小东西,MCU选的是STC12C5A60S2 ,需要用到PWM控制功能. 在网上找了一下,发现解释的不尽人意,无奈之下自己琢磨数据手册弄明白了. 首先,STC12C5A60S2内置有 ...

  4. MVC中 关于退出按钮的写法

    public ActionResult Logoff() { Session.Abandon(); Session.Clear(); FormsAuthentication.SignOut(); re ...

  5. 如何用纯 CSS 创作一个单元素抛盒子的 loader

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKwXbx 可交互视频 ...

  6. encoder-decoder环境部署问题

    pip -v    2.7 cp -r pip2.7 pip pip list appdirs (1.4.3)cycler (0.10.0)distribute (0.7.3)extern (0.1. ...

  7. 20144303 《Java程序设计》课程总结

    20144303 <Java程序设计>课程总结 每周读书笔记链接汇总 第一周:http://www.cnblogs.com/20144303sys/p/5248979.html 第二周:h ...

  8. [CF1051F]The Shortest Statement

    题目大意:给定一张$n$个点$m$条有权边的无向联通图,$q$次询问两点间的最短路 $n\le100000$,$m\le100000$,$1\le100000$,$m$-$n\le20$. 首先看到$ ...

  9. Mysql批量更新速度慢的解决方案

    批量更新的时候不能用子查询 where shop_orderform_id in( select shop_orderform_id from `shop_orderform` where user_ ...

  10. spark SQL学习(综合案例-日志分析)

    日志分析 scala> import org.apache.spark.sql.types._ scala> import org.apache.spark.sql.Row scala&g ...