Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1774898
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 17:16:28

在第三章,所有的I/O函数都集中在文件描述符。当一个文件被打开时,会返回一个文件描述符,然后这个描述符会被所有的后续I/O操作使用。对于标准 I/O库,讨论主要集中在流(stream)。

(不要把标准I/O的术语“流”和作为System V的一部分的STREAMS I/O系统相混淆,后者在SUS的XSI STREAMS选项里被标准化。)当我们用标准I/O库打开或创建一个文件时,我们说我们有一这个文件的关联的流。


根据ASCII字符集,一个单一的字符由一个字节表示。根据国际字符集,一个字符可以由一个以上的字节来表示。标准I/O文件流可以用来操作单字节和多字 节(宽,wide)字符集。一个流的方向(orientation)决定了字符是以单字节还是多字节的方式读取。

初始地,当一个流被创建时,它没有方向。 如果一个多字节I/O函数(参考)用在了没有方向的流上,那么流的方向会设为面向宽字符的。如果一个字节I/O函数用在一 个没有方向的流上,那么流的方向会设为面向字节的。只有两个函数可以在设置后改变这个方向。freopen函数(简单说明)将会清除一个流的方向,而 fwide函数用来设置一个流的方向。


  1. #include <stdio.h>

  2. #include <wchar.h>

  3. int fwide(FILE *fp, int mode);

  4. 流面向宽字符返回正值、面向字节返回负值、没有方向则返回0。


fwdie函数根据mode参数的值,执行不同的任务:

1、如果mode参数为负值,fwide将会尝试让流面向字节;

2、如果mode参数为正值,fwide将会尝试让流面向宽字符;

3、如果mode参数为0,fwid将不会设置方向,而是返回一个表示流的方向的值。


注意fwide不会改变一个已经有方向的流的方向。同样注意它不会返回错误。考虑如果流无效时会发生什么。我们仅有的资源是在调用fwide之前清除errno,然后在它返回时查看errno的值。在本文的剩余部分,我们将只处理面向字节的流。


当我们打开一个流时,标准I/O函数fopen返回一个指向一个FILE对象的指针。这个对象通常是一个包含所有标准I/O库管理流所需的所有信息的结构 体。它包含:真实I/O使用的文件描述符、指向流的缓冲区的指针、缓冲区的大小、缓冲区当前字符数的计数器、一个错误标志,等等。


应用软件不应该需要检查FILE对象。为了引用流,我们把FILE指针作为一个参数传给每个标准I/O函数。在本文,我们将用一个FILE对象的指针(FILE *)作为文件指针。


在本章,我们在UNIX系统的上下文讲述标准I/O库。正如我们提到的那样,这个库已经广泛移植到其它操作系统上。然而为了展示这个库是怎么实现的,我们将讨论它在UNIX系统上的典型实现。

阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~