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的简介 流按操作数据分为两种:字节流与字符流. 流 ...
随机推荐
- Netty源码细节-accept、read(Linux os层 + Netty层代码细节)(转)
原文:http://budairenqin.iteye.com/blog/2215899 这篇分析一下accept的细节, 我觉得网络IO相关开发很多时候不能仅仅局限于java层, 尤其从accept ...
- Win7如何修改开机动画
1 使用魔方美化大师可以替换WIN7的开机画面,我们用该软件打开一个开机动画,居然是一张BMP的图片. 2 在PS中可以发现,这张有21000像素长,大小12MB,可见所谓的动画其实是一个一个动作 ...
- float过后 高度无法自适应的解决方法
float过后 高度无法自适应的解决方法: 在float层最外面包一层div即可.
- loadrunner两个函数:取参数长度和时间戳函数
出自中国IT实验室2014-05-23 00:01 1.web_save_param_length 函数 函数原型:int web_save_param_length( const char *Par ...
- (二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
1. 依赖配置 1.1 依赖配置主要包含如下元素: <!--添加依赖配置--> <dependencies> <!--项目要使用到junit的jar包,所以在这里添加ju ...
- list操作总结. dict操作及文件操作
1: 列表的操作 help(list) # 列表的帮助,列出所有列表的用法 type(name) # type判断数据类型是列表还是字典或者元组 isinstance("字符", ...
- js判段URL是否可用(js判段网络是否不可用)
下面亲自測试可行: 兼容全部浏览器,用JQuery的方法,能够判段URL是否可用.也能够判段网络是否不可用(前提:假设URL可用.返回也不是200,那就说明是网络不可用.能够以此作为网络是否可用的判段 ...
- JDBC的常用API
一.Connection接口: 1.createStatement():创建数据库连接 2.prepareStatement(Stringsql):创建预处理语句 3.prepareCall(Stri ...
- Atitit.导出excel报表的设计与实现java .net php 总
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...