C文件流
在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文件流的更多相关文章
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- Java总结——文件&流
最近学习了Java的输入输出,脑子里有两点乱,不过比之前的思路好像清晰了很多.脑子刚刚接收这些信息的时候,整个就是懵逼的,又是文件又是流的,文件到底干嘛的,流到底干嘛的?恩,后来,想了想,其实也不难理 ...
- C++文件流类与文件流对象
文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...
- c# 根据文件流查看文件真实格式
今天在做图片注册的功能的时候,测试提出一个问题:将随便一个非图片文件将后缀名改为jpg或其他,上传时应检验图片合法性.然后同事给提供了根据文件流前两个字节判断文件真实格式的思路,代码如下: publi ...
- c语言中的文件流
一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...
- iOS - OC NSStream 文件流
前言 @interface NSStream : NSObject @interface NSOutputStream : NSStream 1.文件流的使用 NSString *filePath = ...
- RABBITMQ/JAVA 客户端测试(再补:利用文件流)
(一)这里可以先复习一下java输入输出流和文件操作--- 1.File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当前文件的路径名.判断指定文件是否存在.获取 ...
- 文件_ _android从资源文件中读取文件流并显示的方法
======== 1 android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...
- 文件流StreamReader和StreamWriter的使用
using (StreamReader sr = new StreamReader(@"C:\Users\shuai\Desktop\文件流读取.txt", Encoding.De ...
- FileStream文件流的读取和写入(为以后聊天工具的设计基础)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
随机推荐
- Android开发日记(五)
从服务器端传递多个数据 先在服务器端设置cs文件 using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using Syst ...
- 计时器,主要讲了setInterval()和Date()方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 一款基于jquery ui漂亮的可拖动div实例
今天要给大家带来一款基于jquery ui漂亮的可拖动div实例.这款实例用了图片当背景,div层采用了幽灵透明效果.div拖动是基于jquery ui的.界面非常漂亮.一起看下效果图: 在线预览 ...
- 【C#】List<T>对象的深复制
一.List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List<T>(); old ...
- Linux 网络子系统之网络协议接口层(一)
Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_ ...
- linux挂载根文件系统过程
linux-2.6.36内核 start arch/arm/boot/compressed/head.S arch/arm/kernel/head.S start_kernel() ...
- [转]ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- mac安装IDEA
Mac上安装Java7 首先我们需要去oracle下载最新的jdk,笔者拿到的最新的版本是1.7.0_45-b18,这里没有什么好说的,直接下载安装即可,安装完毕后需要在.bash_profile或者 ...
- [oracle] 安装卸载及常见问题
(1)安装oracle10g备注: ① 检查安装版本是否复合安装主机的硬件要求,避免版本不兼容.如64位的oracle就不能在x86的机器上运行安装. ② 检查安装主机是否满足oracle的硬件要求, ...
- 第三百一十七节,Django框架,缓存
第三百一十七节,Django框架,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返 ...