标准I/O库

以下内容全部摘自UNIX环境高级编程(第3版)

流和FILE对象

当一个流最初被创建时,它并没有定向。如若在未定向的流上使用一个多字节I/O函数(见<wchar.h>),
则将该流的定向设置为宽定向的。若在未定向的流上使用一个单字节I/O函数,则将该流的定向设为字节定向的。
只有两个函数可改变流的定向。freopen函数清除一个流的定向;fwide函数可用于设置流的定向。

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp, int mode);
返回值:若流是宽定向的,返回正值;若流是字节定向的,返回负值;若流是未定向的,返回0

根据mode参数的不同值,fwide函数执行不同的工作。
* 如若mode参数值为负,fwide将试图使指定的流是字节定向的。
* 如若mode参数值为正,fwide将试图使指定的流是宽定向的。
* 如若mode参数值为0,fwide将不试图设置流的定向,但返回标识该流定向的值。

注意,fwide并不改变已定向流的方向。还应注意,fwide无出错返回。
可以在调用前先清除errno,从fwide返回时检查errno的值。

缓冲

标准I/O提供了以下3种类型的缓冲
1. 全缓冲。在填满标准I/O缓冲区后才进行实际I/O操作。
2. 行缓冲。当在输入和输出种遇到换行符时,标准I/O库执行I/O操作。
3. 不带缓冲。标准错误流stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来,而不管它们
是否含有一个换行符。

ISO C要求下列缓冲特征。
* 当且仅当标准输入和标准输出并不指向交互式设备时,它们才是全缓冲的。
* 标准错误绝不会是全缓冲的。

很多系统默认使用下列类型的缓冲:
* 标准错误是不带缓冲的。
* 若是指向终端设备的流,则是行缓冲的;否则是全缓冲的。

可以调用下列两个函数的一个更改缓冲类型。

#include <stdio.h>
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
返回值:若成功,返回0;若出错,返回非0

可以使用setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ的缓冲区(该常量定义在<stdio.h>中)。
通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可将其设置为行缓冲的。
为了关闭缓冲,将buf设置为NULL
使用setvbuf,我们可以精确地说明所需的缓冲类型。这是用mode参数实现的:
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲

setbuf

任何时候,我们都可强制冲洗一个流
#include <stdio.h>
int fflush(FILE *fp);
返回值:若成功,返回0;若出错,返回EOF

此函数使该流所有未写的数据都被传送至内核。作为一种特殊形式,如若fpNULL,则次函数将导致所有输出流被冲洗。

打开流

#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);
3个函数的返回值:若成功,返回文件指针;若出错,返回NULL

这3个函数的区别如下:
1. fopen函数打开路径名为pathname的一个指定的文件
2. freopen函数在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。若该流已经定向,则使用
freopen清除该定向。此函数一般用于将一个指定的文件打开为一个预定的流:标准输入、标准输出或标准错误。
3. fdopen函数取一个已有的文件描述符(可能从opendupdup2fcntlpipesocketsocketpairaccept
函数得到此文件描述符),并使一个标准的I/O流与该描述符相结合。此函数常用于由创建管道和网络通信通道函数返回的描述符。
因为这些特殊类型的文件不能用标准I/O函数fopen打开,所以我们必须先调用设备专用函数以获得一个文件描述符,然后用
fdopen使一个标准I/O流与该描述符相结合。
I/O values

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值