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的简介 流按操作数据分为两种:字节流与字符流. 流 ...
随机推荐
- Python图像处理(8):边缘检測
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 此前已经得到了单个区域植株图像,接下来似乎应该尝试对这些区域进行分类识别.通过外形和叶脉进行植物种 ...
- Spark(十二) -- Spark On Yarn & Spark as a Service & Spark On Tachyon
Spark On Yarn: 从0.6.0版本其,就可以在在Yarn上运行Spark 通过Yarn进行统一的资源管理和调度 进而可以实现不止Spark,多种处理框架并存工作的场景 部署Spark On ...
- Centos6.0 通过devtoolset-2工具安装gcc 4.8
详细步骤: 1.Save repository information as /etc/ yum .repos.d/slc6- devtoolset.repo on your system.then ...
- CocoSourcesCS 4
/*------------------------------------------------------------------------- ParserGen.cs -- Generati ...
- EffectiveJava(23)为什么不能在新生代码中使用原生态类型
泛型类和泛型接口 声明一个或者多个类型参数的类或者接口. 为什么不要在新代码中使用原生态类型 原生态类型,即泛型不带参数的类型 如List的list,list就是其原生态类型 1.使用原生态类型,插入 ...
- 使用Python发送电子邮件
使用python发送邮件并不难,这里使用的是SMTP协议. Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可. 代码如下: # coding:utf-8 im ...
- Uni2D 入门
原地址:http://blog.csdn.net/kakashi8841/article/details/17599505
- Android - 错误:Unable to instantiate application
错误:Unable to instantiate application 本文地址: http://blog.csdn.net/caroline_wendy 错误:java.lang.RuntimeE ...
- SQL Server 2008R2发布与订阅的配置
使用SQL Server的发布与订阅可以将一个数据库的数据实时传送到另一个数据库中,使用这种方式与Link Server相比可以减少对数据库的连接次数.下面介绍SQL Server 2008R2发布与 ...
- 来自oaim的一些推广信息
笔者几年工作经历亲身走访过一些玻璃深加工企业,发现很重要的一种工具装载玻璃的铁架.而许多企业由于缺少实际操作的经验,导致部分铁架从被制作出来就让我们的成品存在质量缺陷的隐患,最常见的是装好中空玻璃,当 ...