UNIX系统高级编程——第五章-标准I/O库-总结
基础:
标准I/O库在ANSI C中定义,可移植在不同的系统
文件指针(FILE):标准I/O库操作的不是文件描述符,而是流。FILE文件指针包含的是维护流所需的信息
通过函数fileno获取流的文件描述符
标准输入、输出、出错流:每个进程预定义了三个流。分别用stdin,stdout,stderr表示三个文件指针。STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO表示文件描述符
缓存:
标准I/O缓存的目的是尽可能减少read/write函数的调用
- 全缓存:当缓存被填满的时候才执行实际的I/O操作。在一个流上第一次执行I/O操作时,相关的标准I/O函数会使用malloc申请缓存
- 行缓存:在输入和输出遇到新行的时候才进行实际的I/O操作。有两种情况下不遇到换行符就会刷新:1.行缓存满。2.通过标准I/O库从一个不带缓存的流或者一个行缓存的流得到输入数据。
- 不缓存
ANSI C要求:
- 当且仅当标准输入输出不涉及交互作用设备时才是全缓存的
- 标准出错不是全缓存
SVR4和4.3+BSD实现:
- 标准出错不缓存
- 涉及终端设备的其他流是行缓存的,否则是全缓存的
函数setbuf/setvbuf设置缓存类型
- setbuf打开或关闭缓存,指定缓存空间。参数为文件指针和缓存空间buf。打开缓存的时候通常是全缓存,但是如果和某终端设备相关某些系统也会设置为行缓存
- setvbuf可以设置缓存类型。参数为文件指针和buf、size。buf和size可以用于为流指定一个缓存,但是如果buf是NULL而流是需要指针的,那么标准I/O库将会自动的为流分配适当长度的缓存。长度指文件stat中的st_blksize指定的值。如果无法以此指定,那么使用BUFSIZ指定大小
SVR4将会使用缓存的一部分用于自身的管理,所以实际可用的字节数会少于指定大小。通常应由系统自动分配缓存,之后系统会自动释放空间
fflush函数强制刷新某文件的流。ANSI C要求如果参数是NULL,将刷新所有的流
打开流:
FILE *fopen(const char *pathname, const char * type) ;
FILE *freopen(const char *pathname, const char * type, FILE * fp) ;
FILE *fdopen(int filedes, const char * type) ;
- fopen:打开路径名指定的文件
- freopen:在一个指定的流上重新打开指定的文件,如果之前的流已经打开就先关闭。通常用于将指定文件打开到预定义的流
- fdopen:将一个流结合到现有的文件描述符
fdopen的type参数有所不同:fdopen为写打开不会截短文件,标准I/O添加方式不会用于创建文件
读写方式打开文件的限制:
- 中间没有fflush、fseek、fsetpos、rewind,那么输出之后不能直接输入
- 中间没有fseek、fsetpos、rewind或者一个输出操作没有到达文件尾,那么输入之后不能直接输出
通过w/a创建新文件的时候无法指定权限位,POSIX.1要求默认权限:用户/组/其他-读写权限
流不引用终端设备则默认全缓存,否则默认行缓存
fclose关闭流:文件关闭之前刷新缓存中的输出数据,丢弃输入数据,释放自动分配的缓存
程序正常结束时(return/exit)关闭所有流
读写流:
三种类型非格式化I/O:
单字符I/O:
输入函数:
int getc(FILE *fp)
int fgetc(FILE *fp)
int getchat(void)
成功返回字符,出错或者到达文件尾则返回EOF
getchar相当于getc(stdin)
getc可以被实现为宏,而fgetc不能:
- getc的参数不能是有副作用的表达式
- fgetc可以获取函数指针作为参数
- 如果getc实现为宏,那么它的效率更高
将返回值扩展为整数就可以返回EOF指示值
使用函数ferror/feof判断是出错还是文件尾
FILE结构中通常由出错标志和文件结束标志,使用clearerr清楚两个标志
ungetc将字符送回流(以类似栈的顺序)。无法回送EOF。到达文件为之后仍可回送一个字符,下次将读取该字符,再下一次读将是EOF。因为ungetc将会清除流的文件结束指示
输出函数:
int putc(int c,FILE *fp)
int fputc(int c,FILE *fp)
int putchar(int c)
成功返回c,出错返回EOF
和输入函数相应的特点类似
行I/O:如fgets,fputs
输入函数:
char *fgets(char *buf,int n,FILE *fp)
char *gets(char *buf)
成功返回buf,失败或者到达文件尾返回null
fgets读取一行,但是至多n-1个字符,存到buf并以null结尾
gets读取一行,无法预测长度,会舍弃换行符存到buf中并以null结尾。(不安全,不建议使用)
输出函数:
int fputs(const char *str,FILE *fp)
int puts(const char *str)
fputs输出str中null之前的内容,可能不是一行
puts输出str中null之前的内容,并在尾部扩展换行符
直接I/O:如fread,fwrite
如果是二进制文件在使用字符读取的时候可能会解析为null从而意外的终止,所以需要使用直接I/O的方式
size_t fread(void *ptr,size_t size,size_t nobj,FILE *fp)
size_t fwrite(const void *ptr,size_t size,size_t nobj,FILE *fp)
返回读或写的对象数
如果返回数字少于nobi,那么对于读可能是读到文件尾或者出错,使用ferror/feof判断那种情况,对于写就意味着出错
定位流:
ftell/fseek:假定文件可以存储在长整型中
long ftell(FILE *fp):成功返回当前文件位置指示,出错返回-1L
int fseek(FILE *fp,long offset,int whence):成功返回0,出错返回非0
void rewind(FILE *fp)
ANSI C不要求二进制文件支持SEEK_END,因为某些系统可能要求二进制文件长度尾某个幻数的整数倍,非实际内容部分填充0
rewind函数将流设置到文件起始位置
fgetpos/fsetpoe:ANSI C引入的函数
int fgetpos(FILE *fp,fpos_t *pos)
int fsetpos(FILE *fp,const fpos_t *pos)
成功返回0,出错返回非0
格式化I/O:
标准输出:
printf:输出到标准输出。成功返回输出的字节数,出错返回负值
fprintf:写到指定流。成功返回输出的字节数,出错返回负值
sprintf:返回存入数组的字节数。将格式化的字符放到参数指定的字符数组中,在数组的尾端自动加上null字节,但是不统计在返回值中
标准输入:scanf/fscanf/sscanf
临时文件:
char *tmpnam(char *ptr)
FILE *tmpfile(void)
每次调用tmpnam将会生成一个和当前文件名不同的有效路径名字符串,最多调用TMP_MAX次
如果ptr是null,那么产生的文件名将存放在静态区,返回的指针指向该内容。每次调用重写该区域
如果ptr不是null,那么长度最小是L_tmpnam
tmpfile创建一个临时二进制文件,关闭该文件或者程序结束时将会删除该文件
tmpnam的变体:tempnam,允许调用者为生成的路径指定目录和前缀。将按照以下顺序设置目录:
- 如果定义了环境变量TMPDIR,那么将其作为目录
- 如果参数directory非NULL,那么将其作为目录
- 本地目录,通常是/tmp.作为目录
prefix非NULL,应包含至多5个字符的字符串,作为文件名的开头几个字符
UNIX系统高级编程——第五章-标准I/O库-总结的更多相关文章
- UNIX环境高级编程 第5章 标准I/O库
本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...
- UNIX系统高级编程——第四章-文件和目录-总结
文件系统: 以UNIX系统V文件系统为例: 磁盘分为区,每个分区都有自己的文件系统: i节点是固定长度的记录项,包含了文件的相关信息.目录项包含文件名和i节点号.stat结构中除文件名和i节点编号 ...
- UNIX系统高级编程——第六章-系统数据文件和信息-总结
口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...
- 《UNIX环境高级编程》(APUE) 笔记第五章 - 标准I/O库
5 - 标准I/O库 Github 地址 1. 标准 I/O 库作用 缓冲区分配 以优化的块长度执行 I/O 等 使用户不必担心如何选择使用正确的块长度 标准 I/O 最终都要调用第三章中的 I/O ...
- UNIX环境高级编程 第6章 系统数据文件和信息
UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...
- UNIX环境高级编程 第2章 UNIX标准及实现
在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易. ISO C 1989年,C语言首个标准得到批准,其为C89.次年,一个带有小改动 ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
随机推荐
- MySQL_索引原理与慢查询优化
索引原理与慢查询优化 创建/删除索引的语法 #方法一:创建表时 CREATE TABLE 表名 ( 字段名1 数据类型 [完整性约束条件…], 字段名2 数据类型 [完整性约束条件…], [UNIQU ...
- jquery.nicescroll.min.js滚动条插件的用法
1.jquery.nicescroll.min.js源码 /* jquery.nicescroll 3.6.8 InuYaksa*2015 MIT http://nicescroll.areaaper ...
- 10、Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking-----基于记忆注意的潜在关系度量协同排序
一.摘要: 本文模型 LRML(潜在相关度量学习)是一种新的度量学习方法的推荐.[旨在学习用户和项目之间的相关关系,而不是简单的用户和项目之间的push和pull关系,push和pull主要针对LMN ...
- [HDU1052]Tian Ji -- The Horse Racing(田忌赛马)
题目大意:田忌赛马问题,给出田忌和齐威王的马的数量$n$和每匹马的速度$v$,求田忌最多赢齐威王多少钱(赢一局得200,输一局扣200,平局不得不扣). 思路:贪心. 1.若田忌最慢的马可以战胜齐王最 ...
- 基于LXC的虚拟网络自动部署
一.问题: 在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐.面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络.因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令. ...
- VUE使用中踩过的坑
前言 vue如今可谓是一匹黑马,github star数已居第一位!前端开发对于vue的使用已经越来越多,它的优点就不做介绍了,本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结, ...
- QT_圆_直线_三角t
MyImgTest.h: #ifndef MYIMGTEST_H#define MYIMGTEST_H #include <QWidget> class MyImgTest : publi ...
- S3C6410 LCD Overlay Test Program
测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作.内核选项的Windows至少要为2. 具体支持如下操作:1 ...
- React:关于虚拟DOM(Virtual DOM)
Virtual DOM 是一个模拟 DOM 树的 JavaScript 对象. React 使用 Virtual DOM 来渲染 UI,当组件状态 state 有更改的时候,React 会自动调用组件 ...
- Tomcat example 应用信息泄漏漏洞及修复
Tomcat 是一款开源的 Web 应用服务器软件.Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选. 漏洞描述 Tomcat 在 ...