基础:

标准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库-总结的更多相关文章

  1. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

  2. UNIX系统高级编程——第四章-文件和目录-总结

    文件系统: 以UNIX系统V文件系统为例: 磁盘分为区,每个分区都有自己的文件系统: ​ i节点是固定长度的记录项,包含了文件的相关信息.目录项包含文件名和i节点号.stat结构中除文件名和i节点编号 ...

  3. UNIX系统高级编程——第六章-系统数据文件和信息-总结

    口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...

  4. 《UNIX环境高级编程》(APUE) 笔记第五章 - 标准I/O库

    5 - 标准I/O库 Github 地址 1. 标准 I/O 库作用 缓冲区分配 以优化的块长度执行 I/O 等 使用户不必担心如何选择使用正确的块长度 标准 I/O 最终都要调用第三章中的 I/O ...

  5. UNIX环境高级编程 第6章 系统数据文件和信息

    UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...

  6. UNIX环境高级编程 第2章 UNIX标准及实现

    在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易. ISO C 1989年,C语言首个标准得到批准,其为C89.次年,一个带有小改动 ...

  7. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  8. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  9. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

随机推荐

  1. MySQL_索引原理与慢查询优化

    索引原理与慢查询优化 创建/删除索引的语法 #方法一:创建表时 CREATE TABLE 表名 ( 字段名1 数据类型 [完整性约束条件…], 字段名2 数据类型 [完整性约束条件…], [UNIQU ...

  2. jquery.nicescroll.min.js滚动条插件的用法

    1.jquery.nicescroll.min.js源码 /* jquery.nicescroll 3.6.8 InuYaksa*2015 MIT http://nicescroll.areaaper ...

  3. 10、Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking-----基于记忆注意的潜在关系度量协同排序

    一.摘要: 本文模型 LRML(潜在相关度量学习)是一种新的度量学习方法的推荐.[旨在学习用户和项目之间的相关关系,而不是简单的用户和项目之间的push和pull关系,push和pull主要针对LMN ...

  4. [HDU1052]Tian Ji -- The Horse Racing(田忌赛马)

    题目大意:田忌赛马问题,给出田忌和齐威王的马的数量$n$和每匹马的速度$v$,求田忌最多赢齐威王多少钱(赢一局得200,输一局扣200,平局不得不扣). 思路:贪心. 1.若田忌最慢的马可以战胜齐王最 ...

  5. 基于LXC的虚拟网络自动部署

    一.问题: 在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐.面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络.因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令. ...

  6. VUE使用中踩过的坑

    前言 vue如今可谓是一匹黑马,github star数已居第一位!前端开发对于vue的使用已经越来越多,它的优点就不做介绍了,本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结, ...

  7. QT_圆_直线_三角t

    MyImgTest.h: #ifndef MYIMGTEST_H#define MYIMGTEST_H #include <QWidget> class MyImgTest : publi ...

  8. S3C6410 LCD Overlay Test Program

    测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作.内核选项的Windows至少要为2. 具体支持如下操作:1 ...

  9. React:关于虚拟DOM(Virtual DOM)

    Virtual DOM 是一个模拟 DOM 树的 JavaScript 对象. React 使用 Virtual DOM 来渲染 UI,当组件状态 state 有更改的时候,React 会自动调用组件 ...

  10. Tomcat example 应用信息泄漏漏洞及修复

    Tomcat 是一款开源的 Web 应用服务器软件.Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选. 漏洞描述 Tomcat 在 ...