在Linux系统中,系统默认认为每个进程打开了3个文件,即每个进程默认可以操作3 个流,即标准输入了流(/dev/stdin),标准输出流(/dev/stdout),标准错误输出流(/dev/stderr),每个进程默认从标准 输入流中读取数据,从标准输出流些正确的信息,向标准错误输出流些错误信息。

·缓冲文件操作:高级文件操作,将在用户空间中自动为正在使用的文件开辟内存缓冲区。POSIX标准的系统调用I/O函数使用的就是非缓冲文件操作。

如果采用非缓冲区的文件访问方式,每次在对文件进行任何一次的读写操作时,都需要使用读写文件系统调用来处理该操作,因此,如果用户程序需要访问磁盘空间中的某个文件,则每次访问都需要执行一次系统调用。执行系统调用将涉及CPU的状态切换,即从用户态切换到内核态,即从用户空间切换到内核空间,实现上下文的切换,这将损耗一定的CPU时间,频繁的磁盘访问对程序的执行效率将造成很大的影响。

ANSI标准的C库函数建立在底层系统的调用之上,即C函数库文件访问函数的实现中使用了低级的文件I/O系统调用。ANSI标准的C库中的文件处理函数为了减少使用系统调用的次数,提高效率,根据应用的不同,采用缓冲区机制
这样,在对磁盘文件进行读写操作时,可以一次性地从文件中读出大量数据到缓冲区中,以后对这部分数据的访问就不需要再使用系统调用了,即整个读写操作值需
要少量的CPU状态的切换。在对磁盘文件进行操作时,可以先将内容存储在文件缓冲区中,待文件缓冲区满后,或者确实需要更新的时候再调用系统调用将文件一
次性写入磁盘。

ANSI标准C库函数为实现这一特性,采用了流的概念,因为数据的输入与输出就像物质的流动一样,在流的实现中,缓冲区是最重要的单元,根据使用需求的不同,可以选择使用全缓冲区,行缓冲区和无缓冲区3种缓冲区处理方式。

(1)全缓冲区:这种缓冲区默认大小为BUFSIZ,具体大小与系统定义有关。在缓冲区满或者调用刷新函数fflush()后才进行I/O系统调用操作。用于普通磁盘文件的流通常使用全缓冲区访问

//come from  /usr/include/stdio.h

#ifndef
BUFSIZ

# define
BUFSIZ _IO_BUFSIZ

#endif

//come from /usr/include/libio.h

#define
_IO_BUFSIZ _G_BUFSIZ

//come from
/usr/include/_g_config.h

#define
_G_BUFSIZ 8192

(2)行缓冲区:当遇到换行符或者缓冲区满时,行缓冲材刷新,大小根据系统有所差异,部分系统默认行缓冲区大小为128字节,标准I/O库将执行I/O系统调用操作。终端即行缓冲区

(3)不带缓冲区:标准I/O库不对字符进行缓存。如果用标准I/O函数写若干字符到不带缓冲区的流中,则相当于用write()系统调用将这些字符写至相关联的打开文件。标准出错流stderr通常是不带缓冲区的,这使得出错信息能够尽快的显示出来。

对于标准输入输出设备,ANSI C要求具有以下缓冲区特征:

·标准输入输出设备:当且仅当不涉及交互作用设备时,标准输入流和标准输出流才是全缓冲区的。

·标准错误输出设备:标准处错决不会是全缓冲区的。

C文件流的更多相关文章

  1. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  2. Java总结——文件&流

    最近学习了Java的输入输出,脑子里有两点乱,不过比之前的思路好像清晰了很多.脑子刚刚接收这些信息的时候,整个就是懵逼的,又是文件又是流的,文件到底干嘛的,流到底干嘛的?恩,后来,想了想,其实也不难理 ...

  3. C++文件流类与文件流对象

    文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...

  4. c# 根据文件流查看文件真实格式

    今天在做图片注册的功能的时候,测试提出一个问题:将随便一个非图片文件将后缀名改为jpg或其他,上传时应检验图片合法性.然后同事给提供了根据文件流前两个字节判断文件真实格式的思路,代码如下: publi ...

  5. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  6. iOS - OC NSStream 文件流

    前言 @interface NSStream : NSObject @interface NSOutputStream : NSStream 1.文件流的使用 NSString *filePath = ...

  7. RABBITMQ/JAVA 客户端测试(再补:利用文件流)

    (一)这里可以先复习一下java输入输出流和文件操作--- 1.File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当前文件的路径名.判断指定文件是否存在.获取 ...

  8. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  9. 文件流StreamReader和StreamWriter的使用

    using (StreamReader sr = new StreamReader(@"C:\Users\shuai\Desktop\文件流读取.txt", Encoding.De ...

  10. FileStream文件流的读取和写入(为以后聊天工具的设计基础)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

随机推荐

  1. SharePoint自动化系列——Set MMS field value using PowerShell.

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 本章将总结一下设置SharePoint list中item的Managed Metadata fi ...

  2. hdu1429(bfs+状态压缩)

    思路:有十个门,有十把钥匙,每把钥匙对应一个门,相同的门可以有多个.这样,我们就得按照状态来搜索,用0000000001代表第一个门有钥匙了,1000000000代表第十个门钥匙有了.......一次 ...

  3. ajax的datatype选项的值

    jquery ajax方法 1."xml":返回 XML 文档,可用 jQuery 处理. 2."html"::返回纯文本 HTML 信息:包含的 script ...

  4. CentOS 7 系统下安装gnome图形界面

    在安装Gnome 包之前,我们需要先检查下安装源是否正常,因为我们要通过yum命令来安装gnome包, 而yum命令式通过yum 源来下载安装包的. 1.在命令行下输入下面的命令来安装 Gnome 包 ...

  5. 【Unity笔记】将角色的碰撞体朝向鼠标点击方向——角色朝向鼠标

    int floorMask; // 自动寻路层 void Awake() { floorMask = LayerMask.NameToLayer("Floor"); } void ...

  6. linux下获取服务器硬件信息的脚本

    这是个简单的脚本,便于查询服务器的硬件信息: #!/bin/bash # # Description: # Used to get the hardware config information. # ...

  7. cocos2dx3.2利用ProgressTimer组合成评分控件

    一.制作背景 如今非常多游戏或者应用须要评分,就是一般来说满分10分,一般用星星来表示. 那么cocos2dx里面怎样制作评分这种控件呢? 我的打算是进度条组合成即可了. 二.材料准备 如上图所看到的 ...

  8. HTML(二):表格元素

    表格元素的作用:用来格式化显示数据. 一.表格的基本结构 表格的基本语法:<TABLE border="设置表格边框尺寸大小" width="" cell ...

  9. WPF教程四:布局之DockPanel面板

    DockPanel:停靠面板 DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中.停靠面板类似于WinForm中控件的Dock属性.D ...

  10. java-TokenProcessor令牌校验工具类

    TokenProcessor令牌校验工具类 public class TokenProcessor { private long privious;// 上次生成表单标识号得时间值 private s ...