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 ...
随机推荐
- 基于jQuery左右滑动切换图片代码
分享一款基于jQuery左右滑动切换图片代码.这是一款基于jQuery实现的左右滑动切换焦点图代码.效果图如下: 在线预览 源码下载 实现的代码: <div class="v_ou ...
- 实战入侵(突破FCK+安全狗上传)
PS:有点尴尬,二次上传突破FCK,免杀马儿过狗. 刚开始和超霸一起弄,TMDGB.弄到四点多,早上尼玛七点多的又去考试,虽然考试还是睡着了,但是TMDGB感觉日子好充实啊! FCK上传地址如下所示: ...
- python -- 字符串和编码
字符串和编码 数字--文本 ascii(bg2312,shift_jis,eur_kr)--unicode--utf-8 ord(""),chr() 1 Python提供了ord ...
- MS-SQL 删除数据库所有的表
godeclare @tbname varchar(250)declare #tb cursor for select name from sysobjects where objectpropert ...
- 错误将UIViewController当做UITableViewController来用
- OC基础--常用类的初步介绍与简单实用之NSString
一.NSString:不可变字符串/NSMutableString:可变字符串 1>字符串的常用创建方式: (1)NSString *s1 = @"Chaos"; (2)NS ...
- 400错误,Required String parameter 'paramter' is not present
1.就拿简单的登录来说吧,这是开始的代码 @RequestMapping(value="/login")public ModelAndView login(@RequestPara ...
- 【转】【C++】C++ 中的线程、锁和条件变量
线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同 ...
- C# 将RichTextBox中内容的文档以二进制形式存
private void button1_Click(object sender, EventArgs e) { System.IO.MemoryStream mstream = new ...
- 关于对afx_msg的解释-----来源百度百科
1AFX前缀 Afx前缀是微软MFC一个小组的名称简写,并没有别的意义. MFC的很多代码,包括全局函数名.宏.头文件名都使用了"Afx". Afx*.h是一组MFC的核心头文件, ...