UNIX环境高级编程--5
标准I/O库
流和FILE对象:
所有I/O函数都是围绕文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。当用标准I/O库打开或者创建一个文件时,我们已使得一个文件与流关联。
流的定向:决定了所读、写的字符是单字节还是多字节(宽)字符集。
freopen函数清楚一个流的定向;fwide函数可设置流的定向(返回+ : 宽定向 -:字节定向 0:未定向)。
缓冲:
标准I/O库提供缓存的目的是尽可能的减少使用能够read和write的次数。
(1)全缓存。当缓冲区满时,可以调用flush冲洗函数来将缓存的文件写入磁盘上。
(2)行缓冲。当在输入或输出中遇到了换行符,执行行缓冲。
(3)不带缓冲。标准错误流stderr通常是不带缓冲的,使得错误信息可以尽快的显示出来。
系统默认全缓冲,终端设备行缓冲。
打开流:
fopen函数打开路径名pathname的一个指定的文件。
freopen函数在一个指定的流上打开一个指定的文件,如该流已经打开,则先关闭流。如若该流已经定向,则使用freopen清楚该定向。
fdopen函数取一个已有的文件描述符,并使一个标准的I/O流与该描述符相结合。
每次一行I/O:
读入:
fgets和gets两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets从指定的流读。
char *fgets(char *restrict buf, int n, FILE *restrict fp):必须指定缓冲长度n。函数一直督导下一个换行符为止,但是不超过n-1个字符。、
如超过字符限制将会下次继续读取该行。
gets:函数不安全的原因在于没有制定缓冲区大小,可能导致缓冲区溢出。这种缺陷曾被利用,造成1988年的因特网蠕虫时间。
gets不将换行符放入缓冲区。
输出:
puts和fputs。
二进制I/O:
进行二进制I/O操作,我们更愿意一次读写一个完整的结构。如果使用getc或putc读、写一个结构那么必须循环通过整个结构,每次循环处理一个字节。一次读或者写一个字节。如果使用fputs和fgets那么因为fputs在遇到null字节停止,而在结构中可能包含null字节或换行符,则fgets也不能正常工作。因此,提出了执行二进制I/O操作的两种函数:
fread:
fwrite:
(1)读写一个二进制数组。例如,将一个浮点数组的第2-5个元素写到一文见上。
float data[10];
if (fwrite(&data[2], sizeof(float), 4, fp) != 4)
err_sys("fwrite error");
(2)读写一个结构。
struct{
short count;
}item;
if(fwrite(&item, sizeof(item), 1, fp) != 1)
err_sys("fwrite error");
定位流:
存储文件的位置以及文件的偏移量。
格式化I/O:
printf将格式化数据输出到标准输出;
fprintf将格式化数据输出到指定的流;
dprintf写至指定的文件描述符;
sprintf将格式化的字符送入数组buf,可能会造成缓冲区溢出。
snprintf缓冲区长度是一个显示参数。
临时文件:
tmpnam:函数产生一个与现有文件名不同的一个优先路径名字符串。每次调用它,都会产生一个不同的路径名,最多调用次数TMP_MAX。
tmpfile:创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件。
mkdtemp:创建一个目录
mkstemp:创建一个文件 不会自动删除 如果希望从文件系统空间中删除,必须自己对它解除链接。
内存流:
标准I/O库把数据缓存在内存中。我们也可以通过调用setbuf和setvbuf函数让I/O库使用我们自己的缓冲区。
注解:
restrict:C语言中的一种类型限定符。告诉编译器,对象已经被指针引用,不能通过该指针外其他直接或间接方式修改该对象的内容。
UNIX环境高级编程--5的更多相关文章
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...
- unix环境高级编程基础知识之第二篇(3)
看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...
- (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- Leetcode 87.扰乱字符串
扰乱字符串 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. 在扰乱这个字符串 ...
- github & Front-end JavaScript frameworks
github & Front-end JavaScript frameworks https://github.com/collections/front-end-javascript-fra ...
- [luoguP1220] 关路灯(DP)
传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP. f[i][j][0] 表示关完 i, j 这个区间且在 i 这个位置 f[i][j][1] 表示关完 i, j 这 ...
- codevs——1517 求一次函数解析式
1517 求一次函数解析式 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 相信大家都做过练习册上的这种 ...
- 奇偶数对调,保持顺序 —— 剑指Offer
这道题目 https://www.nowcoder.net/practice/beb5aa231adc45b2a5dcc5b62c93f593?tpId=13&tqId=11166&t ...
- Java基础:初始化和清理
转载请注明出处:jiq•钦's technical Blog (1) 初始化: 所以假设继承关系为:A导出B再导出C,在创建C对象的情况下的调用顺序是: * (1) A的静态域,B的静态域,C的静态域 ...
- oracle11g 手工建库步骤
#create oracle instance parameter vi initkevin.or db_name='kevin' memory_target=0 sga_max_size=5G sg ...
- LeetCode 206. Reverse Linked List (倒转链表)
Reverse a singly linked list. 题目标签:Linked List 题目给了我们一个链表,要求我们倒转链表. 利用递归,新设一个newHead = null,每一轮 把下一个 ...
- 5分钟APIG实战: 使用Rust语言快速构建API能力开放
序言:Rust语言简介 参与过C/C++大型项目的同学可能都经历过因为Null Pointer.Memory Leak等问题“被” 加班了不知道多少个晚上.别沮丧,你不是一个人,Mozilla Fir ...