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 ...
随机推荐
- PowerShell中进行文件读取,信息排序,分类计数。
这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...
- Elasticsearch的javaAPI之get,delete,bulk
Elsasticsearch的javaAPI之get get API同意依据其id获得指定index中的基于json document.以下的样例得到一个JSON document(index为twi ...
- C语言 · 三角形
算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长 ...
- C语言 · 第二大整数
算法提高 第二大整数 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二 ...
- pthread_setschedparam
#include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <sched.h&g ...
- udev规则以及编写
主要内容: udev简介 如何配置和使用udev 如何编写udev规则 字符串替换和匹配 udev主要作用 编写udev规则实例 难点解析 1. udev简介 1.1 什么是udev? udev是Li ...
- System.map
System.map是一个特定内核的内核符号表.它是你当前运行的内核的System.map的链接. 内核符号表是怎么创建的呢? System.map是由“nm vmlinux”产生并且不相关的符号被滤 ...
- Yarn NodeManager restart
一.介绍默认Yarn NodeManager重启后会断开所有当前正在运行的container的状态,这意味着重启后需要重新启动container进程,该特性的作用就是把NM的状态临时保存到本地,重启后 ...
- ubuntu 12.10 默认安装php5-fpm无监听9000端口,nginx无法链接php5-fpm修正
升级php5的时候,发现nginx无法链接到php5,怀疑是php5端口的问题. netstat -an未发现监听9000端口. 查看/var/log/php5-fpm.log一切正常. 随后查看/e ...
- Windoows窗口程序四
子窗口的创建 .创建时要设置父窗口句柄 .创建风格要增加WS_CHILD|WS_VISIBLE HWND CreateChild(LPSTR lpClassName,LPSTR lpWndName,H ...