GUN C中的流
当我们要对文件(在Linux环境中一切皆文件,包括硬件设备、资源等)进行操作(读、写、读写)时,必须连接文件或形成通信管道。这个过程称为打开文件。打开文件后可以进行读、写、读写操作。
打开的文件可以称作为流,或者是文件描述符。可以通过传递参数给实际执行操作的函数,告知它们操作哪些文件。一些函数期待操作流,一些函数设计时就指定了操作文件描述符。
当读取文件或写入完毕后需要关闭文件操作符(在进程结束时,内核会关闭该进程打开的所有文件描述符)。一旦关闭流或文件描述符时,就不能再对它进行操作了。
当想对文件进行操作时,必须从文件描述符或流这两种机制中选择其一,建立程序与文件之间的联系。文件描述符为int类型的数据对象,而流则为FILE * (stdio.h中定义)数据对象(一种struct数据结构,而非高级语言中的对象)。
文件描述符为输入和输出提供了一种原始的、底层的接口。文件描述符和流都可用于设备文件、管道或套接字文件以便于同其他进程或普通文件进行通信。但是,如果想要与特殊设备进行操作,必须选用设备描述符,因为他没有提供流方面的服务。在一些特殊的操作中输入输出也必须使用文件描述符进行操作,如非阻塞(或轮询)。
流提供了一种高级的接口(相当于文件描述符的底层接口),流接口处理所有类型的文件--唯一的例外是缓冲区。
使用流来进行操作(与实际操作相反)的主要优点是相对于文件描述符更丰富、更强大。文件描述符只提供了字符操作,而流则还提供了格式化输入输出(printf scanf),以及面向行和面向字符操作的函数。因为流是在文件描述符的基础之上进行封装,所以可以直接从流中提取文件描述符,或者直接对文件描述符进行底层操作。也可以仅打开一个文件描述符,而后在其之上创建一个与之相关联的流操作。通常在我们开发中除了要对字符进行操作,我们都应当使用流。在初学时如果不太清楚选择什么函数进行操作,那么最好选择格式化输入输出。
如果考虑兼容性,而非仅使用于GUN环境,那么也应该清楚文件描述符并不如流那样好移植,因为文件描述符大多定义在posix标准之中。
打开文件的一个属性是它的文件位置,它可以跟踪下一个字符在文件中的位置是读还是写。在GNU系统和所有POSIX上。一个系统,文件位置是一个整数,表示从文件开始时的字节数。
文件位置通常设置为打开文件时的起始位置,每当读取或写入字符时,文件位置就会递增。换句话说,对文件的访问通常是连续的。
普通文件允许在文件内的任何位置读写操作。其他类型的文件也可以允许这样做。允许这种情况的文件有时被称为随机访问文件。您可以使用在流上的fseek函数(见文件定位)或在文件描述符上的lseek函数来更改文件位置(见I / O原语)。如果您尝试更改不支持随机访问的文件中的文件位置,则会得到ESPIPE错误。
为append访问打开的流和描述符是专门用于输出的:对这些文件的输出总是按顺序追加到文件的末尾,而不管文件的位置如何。但是,文件位置仍然用于控制文件读取操作的位置。
如果仔细想想,会发现一些程序可以同时读取一个给定的文件。为了使每个程序能够以自己的速度读取文件,每个程序都必须有自己的文件指针,而其他程序所做的任何事情都不会影响到它。
事实上,每个文件的打开都会创建一个单独的文件位置。因此,如果您在同一个程序中两次打开一个文件,就会得到两个独立文件位置的流或描述符。
相反,如果您打开一个描述符,然后复制它以得到另一个描述符,那么这两个描述符共享相同的文件位置:更改一个描述符的文件位置将影响另一个描述符。
GUN C中的流的更多相关文章
- [Node.js] Node.js中的流
原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- ASP.NET Core SignalR中的流式传输
什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- Java中IO流中的装饰设计模式(BufferReader的原理)
本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...
随机推荐
- win7上搭建ruby开发环境
1. 安装ruby 可使用windows下的ruby安装工具rubyinstaller来方便地安装ruby解释器,可以http://rubyinstaller.org/网站上下载得到.安装时,看清安装 ...
- netty参考
前言 问题 现如今我们使用通用的应用程序或者类库来实现系统之间地互相访问,比如我们经常使用一个HTTP客户端来从web服务器上获取信息,或者通过web service来执行一个远程的调用. 然而,有时 ...
- 模式识别之Earley算法入门详讲
引言:刚学习模式识别时,读Earley算法有些晦涩,可能是自己太笨.看了网上各种资料,还是似懂非懂,后来明白了,是网上的前辈们境界太高,写的最基本的东西还是非常抽象,我都领悟不了,所以决定写个白痴版的 ...
- zoj How Many Sets I(组合计数)
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4535 一个集合s有n个元素,求满足这种集合序列{s1,s2....sk}使S ...
- Array,Vector,List,Deque的区别与联系【转+改】
数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...
- Activity具体解释(生命周期、启动方式、状态保存,全然退出等)
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的A ...
- mybatis+oracle的批量插入
// 批量插入,手动控制事务 SqlSession batchSqlSession = null; try { batchSqlSession = sqlSessionTemplate.getSqlS ...
- applicationContext.xml 文件头报错Referenced file contains errors
问题如下:原先运行正常的项目,突然在applicationContext.xml 文件头报错 内容:Referenced file contains errors (http://www.spring ...
- spring学习笔记(四)
1.aop编程 a.前置通知 .... <!-- 配置被代理的对象 --> <bean id="test1Service" class="com. ...
- WCF RIA Services使用详解(转载)
理解领域服务和领域操作 本文目录: 3.1 WCF Ria Services简介 3.1.1 什么是WCF Ria Services 3.1.2 WCF Ria Services如何生成客户端代码 3 ...