文件IO——文件IO相关概念

1、API

(1)基于linux做应用开发,其实就是通过调用linux系统提供的API来实现。

(2)API 是一些由linux系统提供的函数,给应用层使用,以完成一定的功能。

(3)常用的文件IO的API 有open,close,write,read,lseek等。

2、文件描述符(fd)

文件描述符的本质

文件描述符本质就是一些非负整数,它是进程表中文件描述符表的一个表项,用来表示以及区分一个程序打开的多个文件。进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表。

换言之,文件描述符表是个数组,fd是index,文件表指针是value。

文件描述符的作用域

文件描述符的作用域是当前进程,不同进程下打开的文件的文件描述符可以是相同的数字。

其他描述

(1)文件描述符,是open系统调用时内部由操作系统自动分配的,它会从文件描述符表中挑选一个最小的未被使用的数字返回。

(2)其中0、1、2已经被stdin、stdout、stderr这3个文件占用。当运行一个程序时,默认打开上述三个文件,即把键盘、屏幕、标准错误当做文件。

(3)printf函数默认输出到标准输出stdout上,而fpirntf函数可以指定输出到哪个文件描述符中。

3、文件IO和标准IO的异同

两者的概念

文件IO,即使用open、close、write、read等API函数构成的一套用来读写文件的体系。这套体系可以很好的完成文件读写,但是效率并不是最高的。

标准IO,是一套由C库函数提供文件操作函数来完成文件读写的体系。标准IO由一系列的C库函数(fopen、fclose、fwrite、fread)构成,这些标准IO函数其实是由文件IO封装而来的(fopen内部其实调用的还是open,fwrite内部还是通过write来完成文件写入的)。

标准IO加了封装之后主要是为了在应用层添加一个缓冲机制。我们通过fwrite写入的内容不再直接进入内核中的buf,而是先进入应用层标准IO库维护的buf中,然后标准IO库根据操作系统单次write的最佳count来选择好的时机,将内容write到内核中的buf。然后内核中的buf再根据硬盘的特性来选择好的时机去最终写入硬盘中。

文件IO的API和标准IO的库函数

(1)文件IO的API有open,close,write,read,lseek,dup,dup2,fcntl等等。

(2)标准IO的库函数有fopen、fclose、fwrite、fread、ffulsh、fseek等。

文件IO和标准IO的异同

(1)都是使用函数,但标准IO是C库函数,文件IO是Linux系统提供的API;

(2)C库函数由API封装而来,但是C库函数因为多了一层封装,比API要好用一些。

(3)C库函数具有移植性,而API是针对具体的系统设计的,不同操作系统之间不能通用。

(4)标准IO带有缓存,而文件IO没有缓存。

4、man手册的查询

(1)man  1  xxx    查询linux的shell命令

(2)man  2  xxx    查询API

(3)man 3   xxx    查询库函数

5、退出进程

打开文件时如果出错,后面的操作就不应该继续进行。

有两种方法退出进程:

(2)在main中用return,正常return 0,异常return -1。

(3)典型的终止进程应该用exit、_exit、_Exit之一。前者是库函数,后二者是系统API。 

6、文件重定位

可以把向屏幕输出的内容,输出到某个文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git使用小记

1. 基本操作 全局配置: git config --global user.name xx git config --global user.email xxx 初始化一个仓库: git init 添加: git add "file1.txt" git commit -m "添加文件1" 比较:分别列出每个文件…

LINUX内核之普通自旋锁

LINUX内核之普通自旋锁 CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author:WenHui,WuHan University,2012-6-15 PDF版阅读地址:http://www.docin.com/p1-424285718.html 普通自旋锁 自旋锁…

MFC COMBO-BOX最详细教程

找了好多,这是讲的最清楚的,与大家共享! 转:https://blog.csdn.net/fym0121/article/details/7515862 当你只需从一列对象中选出一个时,使用COMBO BOX是一个好主意,因为它节省空间。这篇文章讲述了如何使…

uboot源码——主Makefile的分析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客:u-boot Makefile完全解读_williamwang2013的博客-CSDN博客 参考博客:U-boot主Makefile分析_XiaoBaWu的博客-CSDN博客 参考博客:U-boot配置及编译阶段…

Designing Virtual Connect for vSphere 5.x

Designing Virtual Connect for vSphere 5.x如何在 HP C7000刀笼使用VC以满足vSphere 5.x 英文视频连接如下:http://professionalvmware.com/2013/05/vbrownbag-follow-up-designing-virtual-connect-for-vsphere-with-joe-clark-elgwhoppo/1:首先介绍一…

VMware vCenter Converter 关闭SSL加密,提高35-40%性能

VMware vCenter Converter 关闭SSL加密,提高35-40%性能原文:http://www.vmwarearena.com/2013/07/improving-transfer-rate-of-p2v-and-v2v.htmlVMware vCenter Converter Standalone 5.0 is a free tool from VMware to easily perform P2V(Physical to virtual co…

图像拼接算法及实现

第一章 绪论 1.1 图像拼接技术的研究背景及研究意义 图像拼接(image mosaic)是一个日益流行的研究领域,他已经成为照相绘图学、计算机视觉、图像处理和计算机图形学研究中的热点。图像拼接解决的问题一般式,通过对齐一系列空间重叠的图像,构…

程序员,你还在 Select * 吗?

应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程…

学习笔记-记ActiveMQ学习摘录与心得(二)

上个周末被我玩过去了,罪过罪过,现在又是一个工作日过去啦,居然有些烦躁,估计这几天看的东西有点杂,晚上坐下来把自己首要工作任务总结总结。上篇学习博客讲了ActiveMQ的特性及安装部署,下面先把我以前启动…

谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)

C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高。 以下是msdn中对new,virtual和override的定义: …

unsigned char s1 : 2的用法

#include<stdio.h> #include<stdlib.h> //默认按照四字节对齐 //#pragma pack(1) union V {struct X{unsigned char s1 : 2;unsigned char s2 : 3;unsigned char s3 : 3;} x;unsigned char c; } v; //#pragma pack()int main(void) {v.c 100;//对应的二进制数字是…

juc线程池原理(六):jdk线程池中的设计模式

一、jdk中默认线程池中的代理模式 单例类线程池只有一个线程&#xff0c;无边界队列&#xff0c;适合cpu密集的运算。jdk中创建线程池是通过Executors类中提供的静态的方法来创建的&#xff0c;其中的单例类线程池的方法如下&#xff1a; public static ExecutorService newSin…

Code First :使用Entity. Framework编程(6) ----转发 收藏

Chapter6 Controlling Database Location,Creation Process, and Seed Data 第6章 控制数据库位置&#xff0c;创建过程和种子数据 In previous chapters you have seen how convention and configuration can be used to affect the model and the resulting database schema.…

计算多个文档之间的文本相似程度

首先我们上代码&#xff1a; from sklearn.feature_extraction.text import CountVectorizer corpus [ UNC played Duke in basketball, Duke lost the basketball game, I ate a sandwich ] vectorizer CountVectorizer(binaryTrue,stop_wordsenglish)#设置停用词为英语&…

双边滤波

双边滤波 高斯滤波是最常用的图像去噪方法之一&#xff0c;它能很好地滤除掉图像中随机出现的高斯噪声&#xff0c;但是在之前的博客中提到过&#xff0c;高斯滤波是一种低通滤波&#xff08;有兴趣的点击这里&#xff0c;查看之前的博客&#xff09;&#xff0c;它在滤除图像中…

用SQL语句更改数据库名,表名,列名

参考SQL Server联机丛书的 sp_renamedb与sp_rename一、更改数据库名sp_renamedb更改数据库的名称。语法sp_renamedb [ dbname ] old_name ,[ newname ] new_name 参数[ dbname ] old_name 是数据库的当前名称。old_name 为 sysname 类型&#xff0c;无默认值…

Gabor滤波器原理

一、什么是Gabor函数&#xff08;以下内容含部分翻译自维基百科&#xff09; 在图像处理中&#xff0c;Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现&#xff0c;Gabor滤波器十分适合纹理表达和分离。在空间域中&#x…

Linux中的MAN命令

学习Linux的同学&#xff0c;都会使用man来查阅一些命令的帮助信息&#xff0c;常见的使用方法就是“man 命令名称”这样简单的格式。本文就对man命令简要介绍一下。 l man命令的章节 man就是manual的缩写&#xff0c;用来查看系统中自带的各种参考手册&#xff0c;但是手册页分…

全局曝光和卷帘曝光的区别

全局曝光和卷帘曝光是常见的相机曝光方式。一般来说&#xff0c;CCD相机是全局曝光&#xff0c;而CMOS相机则存在卷帘曝光。那么&#xff0c;这两种方式孰优孰劣呢&#xff1f;或者说&#xff0c;他们两者的差别在哪里呢&#xff1f;那么&#xff0c;先从两者的定义说起。 全局…

Titanium 列表显示TableView

效果&#xff1a; Titanium中列表显示需要创建TableView var tableView Ti.UI.createTableView({style: Ti.UI.iPhone.TableViewCellSelectionStyle.NONE //TableView样式}); TableView的每一个行叫做TableViewRow 设置TableViewRow的hasChild为true便可显示这样的效果&#x…