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的简介 流按操作数据分为两种:字节流与字符流. 流 ...
随机推荐
- webmagic的多线程及线程池的应用
- C# 多线程控制 通讯
一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...
- Windows如何自定义U盘盘符、文件夹图标、文件夹背景
自定义U盘盘符.文件夹图标.文件夹背景 注意对于Vista和Win7的用户不支持文件夹图标和文件夹背景的更换 1.自定义盘符:在U盘根目录下新建文件 autorun.inf(可先建.txt文本文档,再 ...
- HTTP——请求和响应格式
HTTP请求格式:<request-line><headers><blank line>[<request-body>]说明:第一行必须是一个请求行(r ...
- git 基于某个分支创建分支
1.拷贝源代码 git clone git@git地址 cd 项目目录 2.根据已有分支创建新的分支 git checkout -b yourbranchname origin/oldbranchna ...
- 用shell查找某目录下的最大文件(转)
这是一个很有趣的问题,因为作为一个shell菜鸟,我第一时间是没有任何想法的.心里纳闷为什么这样的操作Linux居然没有直接的命令实现这样的查询. 很自然地,第一感觉就是用awk去实现,因为菜鸟我看a ...
- css样式布局中position的那些事儿
哎,页面布局及设计开发.对于一个一直从事后台开发来说屌丝来说,确实是件非常费时.费力,非常艰难的一件事. 今晚是想实现把多张重叠在一起.或是标记一张图片中不同的位置然后赋以超链接.花了一晚上的时间,才 ...
- 【Python3 爬虫】06_robots.txt查看网站爬取限制情况
大多数网站都会定义robots.txt文件来限制爬虫爬去信息,我们在爬去网站之前可以使用robots.txt来查看的相关限制信息 例如: 我们以[CSDN博客]的限制信息为例子 在浏览器输入:http ...
- android-seekbar的thumb图片不居中显示的处理办法
seekbar更换图片后,发现thumb的图片不会居中(竖直方向)显示了,代码如下: <SeekBar android:id="@+id/wb_seekbar" androi ...
- 转: Your build settings specify a provisioning profile with the UUID, no provisioning profile was found
http://blog.csdn.net/rbyyyblog/article/details/12220875 在Archive项目时,出现了“Your build settings specify ...