UNIX环境高级编程之第5章:标准I/O库
来源:互联网 发布:怎么用语法创建数据库 编辑:程序博客网 时间:2024/06/06 20:27
5.1 引言
标准I/O库处理很多细节,如缓冲区分配,以优化的块长度执行I/O。这些处理用户不必担心如何选择使用正确的块长度
5.2 流和FILE对象
在第3章,所有I/O函数都是围绕文件描述符(file desctriptor)的。而对于标准I/O库,他们的操作是围绕流(stream)进行的。当标准I/O库打开或创建一个文件是,我们以使一个流与一个文件相关联。
流的定向(stream's orientation)决定了所读,写的字符是单字节还是多字节
fwide函数可用于设置流的定向
#include <stdio.h>#include <wchar.h>int fwide(FILE *fp, int mode);
(1) mode 为负数,fwide将试图使指定的流是字节定向的
(2) mode为正数,fwide将试图使指定的流是宽定向的
(3) mode 为0,fwide将不试图设置流的定向,但返回标示该流定向的值
5.3 标准输入、标准输出和标准错误
对一个进程预定义了3个流,并且这3个流可以自动地被进程使用,他们是标准输入,标准输出和标准错误
5.4 缓冲(Buffering)
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数
标准I/O提供了以下3种类型的缓冲
(1)全缓冲:再填满标准I/O缓冲区后才进行实际I/O操作。对于驻留再磁盘上的文件通常是由标准I/O库实施全缓冲的。标准I/O函数通常调用malloc获得需使用的缓冲区。
(2)行缓冲:当在输入和输出中遇到换行符是,标准I/O库执行I/O操作
(3)不带缓冲:标准I/O库不对字符进行缓冲储存,例如标准I/O函数fputs,就是立即讲字符输出
例如标准错误流,就是不带缓冲的,一旦有错误就尽快输出
大多数系统默认使用一下的类型
(1)标准错误是不带缓冲的
(2)如果指向终端设备的流是行缓冲,其他都是全缓冲
我们可以使用setbuf和setvbuf来改变缓冲类型
#include<stdio.h>void setbuf(FILE *restrict fp, char *restrict buf);void setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
可以使用setbuf函数打开或关闭缓冲机制,为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ的缓冲区。关闭缓冲讲buf设置为NULL
任何时候,我们可以强制冲洗一个流
#include<stdio.h>
int fflush(FILE *fp);
此函数使该流所有未写的数据都传到内核(kernel),作为一种特殊情景,若fp是NULL,则次韩式将导致所有的输出流被冲洗。
5.5 打开流
下列3个函数打开一个标准I/O流
#include <stdio.h>FILE *fopen(const char *restrict pathname, const char *restrict type);FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);FILE *fdopen(int fd, const char *type);
这三个函数的区别如下:
(1)fopen函数打开路径名为pathname的一个制定的文件
(2)freopen函数再一个指定的流上打开一个指定的文件,如果该流已经打开,则先将其关闭。若该流已经定向,则使用freopen清除该定向。此函数一般用于讲一个制定的文件打开为一个预定义的流:标准输入、标准输出、标准错误。
(3)fdopen函数区一个已有的文件描述符(file descriptor),并使一个标准的I/O流与该描述符相结合。
type参数指定对该I/O流的读写方式
调用fclose关闭一个打开的流
#include<stdio.h>
int fclose(FILE *fp);
5.6 读和写流
#include <stdio.h>int getc(FILE *fp);int fgetc(FILE *fp);int getchar(void);
getc可以实现为宏,fgetc则不能
#include <stdio.h>int ferror(FILE *fp);int feof(FILE *fp);void clearerr(FILE *fp);
从流中读取数据以后,可以调用ungetc将字符再压送回流中
#include <stdio.h>int ungetc(int c, FILE *fp);
2. 输出函数
#include<stdio.h>int putc(int c,FILE *fp);int fputc(int c, FILE *fp);int putchar(int c);
同样putchar(c)等同于putc(c,stdout),putc可被实现为宏,而fputc不能
5.7 每次一行I/O
#include <stdio.h>char *fgets(char *restrict buf, int n, FILE *restrict fp);char *gets(char *buf);
这两个函数都指定了缓冲区的地址,将读入的行送入其中。gets从标准输入读,而fgets则从指定的流读。
#include<stdio.h>int fputs(const char *restrict str, FILE *restrict fp);int puts(const char *str);
函数fputs将一个以null字节终止的字符串写到指定流中,尾端终止符null不写出。
5.8 标准I/O的效率
5.9 二进制I/O
#include <stdio.h>size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
这些函数有一下两个常见的用法
float data[10];if(fwrite(&data[2], sizeof(flaot),4,fp)!=4) err_sys("fwrite eerror");
size为每个数组元素的长度,nobj为欲写的元素的个数
(2)读或写一个结构
struct { short count; long tatal; char name[NAMESIZE];}item;if(fwrite(&item, sizeof(item), 1, fp)!=1) err_sys("fwrite error");
5.10 定位流
有三种方法定位标准I/O流(1)ftell和fseek函数,但它们都假定文件的位置可以存放在一个长整型中
#include <stdio.h>long ftell (FILE *fp);int fseek(FILE *fp, long offset, int whence);void rewind(FILE *fp);
ftell用于二进制文件时,其返回值就是这种字节位置
为了用fseek定位一个二进制文件,必须制定一个字节offset,以及解释这种偏移量的方式。whence的值lseek函数的相同:
SEEK_SET:表示从文件的起始位置开始
SEEK_CUP:表示从当前文件位置开始
SEEK_END:表示从文件的尾端开始
使用rewind函数也可以讲一个流设置到起始位置
(2)ftello和fseeko函数使文件偏移量可以不必为长整型,使用off_t数据类型代替
#include <stdio.h>off_t ftello(FILE *fp);int fseeko(FILE *fp, off_t offset, int whence);除了用off_t替换了long剩下的和ftell一样
(3)fgetpos和fsetpos函数。它们使用一个抽象数据类型fpos_t记录文件的位置。这种数据类型可以更具需要定义为一个足够大的数,用以记录文件的位置
#include <stdio.h>int fgetpos(FILE *restrict fp, fpos_t *restrict pos);int fsetpos(FILE *fp, const fpos_t *pos);fgetpos将文件位置指示器的当前值存入由pos指向的对象中。以后调用fsetpos时,可以使用此值将流重新定位到该位置
5.11 格式化I/O
1.格式化输出
#include <stdio.h>int printf(const char *restrcit format, ...);int fprintf(FILE *restrict fp, const char *restrict format, ...);int dprintf(int fd, const char *restrict format, ...);int sprintf(char *restrict buf, const char *restrict format);int snprintf(char *restrict buf, size_t n, const char *restrict);
printf将格式化数据写到标准输出。
2.格式化输入
#include<stdio.h>int scanf(const char *restrict format, ...);init fscanf(FILE *restrict fp, const char *restrict format);int sscanf(const char *restrict buf, const char *restrict format);
5.12 实现细节
#include<stdio.h>int fileno(FILE *fp);如果要调用dup(获得新的文件描述符)或fcntl(改变已经打开的文件的属性)等函数,则需要此函数
5.13 临时文件
IOS C标准I/O库提供了两个函数以帮助创建临时文件
#include <stdio.h>char *tmpnam(char *ptr);FILE *temfile(void);
tmpnam函数产生一个与现有的文件名不同的一个有效路径名字字符串
若ptr是NULL,则产生的路径名存放再一个静态区中,指向该静态去的指针作为函数值返回
若ptr不是NULL,则认为它应该是指向长度至少是L_tmpnam个字符的数组,所产生的路径名存放在该数组中
对一个文件解除链接并不删除其内容,关闭该文件是才删除内容
5.14 内存流
#include <stdio.h>FILE *fmemopen(void *restrict buf, size_t size, const char *restrict type);fmemopen函数允许调用者提供缓冲区用于内存流
- UNIX环境高级编程之第5章:标准I/O库
- UNIX环境高级编程之第5章:标准I/O库-习题
- UNIX环境高级编程(第5章 标准I/O库)
- UNIX环境高级编程-第5章- 标准 I/O 库
- 《Unix环境高级编程》之 标准I/O库
- UNIX环境高级编程----标准I/O
- UNIX环境高级编程--标准I/O
- UNIX环境高级编程---标准I/O库
- unix环境高级编程-5.2~3标准I/O库。
- UNIX环境高级编程---标准I/O库
- unix环境高级编程----标准I/O库
- UNIX环境高级编程——标准I/O库
- UNIX环境高级编程——标准I/O库
- UNIX环境高级编程--标准I/O库(二)
- 《UNIX环境高级编程》五标准I/O库读书笔记
- UNIX环境高级编程<六>: 标准I-O库
- 《UNIX环境高级编程》学习笔记之标准I/O库
- UNIX环境高级编程学习之路(三)----标准I/O库
- BaseAdapter的getView方法中对setOnclickListener优化
- Linux 查看ERROR日志方法
- 135. Candy
- UVA 11426 GCD - Extreme (II) (数论|欧拉函数)
- Can't find keyplane that supports type 4 for keyboard iPhone-PortraitChoco-NumberPad; using 27057872
- UNIX环境高级编程之第5章:标准I/O库
- 关于对象深拷贝的一个方法(非Cloneable方式)
- ant安装配置,一个ant的简单实例
- netty学习(二)--传统的bio编程
- java和mysql进行连接
- 多态
- Foundation框架—结构体
- 水仙花数
- Centos 安装后无法使用ipv4地址