unix环境高级编程复习)——标准I/O库(1)

流和FILE对象

当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件关联。对于ASCII字符集,一个字符用一个字节表示。对于国际字符集,一个字符可以用多个字节表示。标准I/O文件流可用于单字节或多字节字符集。流的定向决定了所读、写的字符是单字节还是多字节的。

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

根据mode参数的不同值,fwide函数执行不同的工作:

  • 如若mode参数值为负,fwide将试图使指定的流是字节定向的。
  • 如若mode参数值为正,fwide将试图使指定的流是宽定向的。
  • 如若mode参数值为0,fwide将不试图设置流的定向,但返回标识该流定向的值。

标准I/O流通过预定义文件指针stdin、stdout和stderr引用标准输入、标准输出和标准出错。这三个指针定义在头文件<stdio.h>中。

缓冲

标准I/O库提供缓冲的目的是尽可能的减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。

标准I/O提供了三种类型的缓冲:

  1. 全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作。
  2. 行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。当流涉及一个终端时,通常使用行缓冲。
  3. 不带缓冲。标准I/O库不对字符进行缓冲存储。

对任何一个给定的流,如果我们并不喜欢这些系统默认的情况,则可调用下列两个函数中的一个更改缓冲类型:

#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的缓冲区。通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可将其设置为行缓冲。为了关闭缓冲,将buf设置为NULL。

使用setvbuf,我们可以精确地指定所需的缓冲类型。这是用mode参数实现的:

  • _IOFBF 全缓冲
  • _IOLBF 行缓冲
  • _IONOBF 不带缓冲

如果指定一个不带缓冲的流,则忽略buf和size参数。如果指定全缓冲或行缓冲,则buf和size可选择地指定一个缓冲区及其长度。如果流时带缓冲的,而buf是NULL,则标准I/O库将自动地为该流分配适当长度的缓冲区。适当长度指的是由常量BUFSIZ所指定的值。


任何时候,我们都可以强制冲洗一个流。

#include<stdio.h>
int fflush(FILE *fp);
返回值:若成功则返回0,否则返回EOF

打开一个流

下列三个函数打开一个标准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 filedes,const char *type);
三个函数返回值:若成功则返回文件指针,否则返回NULL
这三个函数的区别:

  1. fopen打开一个指定的文件。
  2. freopen在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。
  3. fdopen获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。
    打开标准I/O流的type参数
    type说明 
    r或rb为读而打开 
    w或wb把文件截短为0,或为写而创建 
    a或ab添加为在文件尾写而打开,或为写而创建 
    r+或r+b或rb+为读和写而打开 
    w+或w+b或wb+把文件截短为0或为读和写而创建 
    a+或a+b或ab+为在文件尾读和写而打开或创建 

使用字符b作为type的一部分这使得标准I/O系统可以区分文本文件和二进制文件。因为unix内核并不对这两种文件进行区分,所以在unix系统环境下指定字符b作为type的一部分实际上并无作用。

可以调用fclose关闭一个打开的流。

#include<stdio.h>
int fclose(FILE *fp);
返回值:若成功则返回0,否则返回EOF


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值