手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

第三章--文档I/O

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


统Ⅴ之前,whence被指定为0(绝对位移量),1(相对于当前位置的位移量)或2(相对

文档尾端

的位移量)。很多软件仍直接使用这些数字进行编码。

在lseek中的字符l表示长整型。在引入off[CD#*2]t数据类型之前,offset参数和

返回值是

长整型的。lseek是由Version 7引进的,当时C语言中增加了长整型。(在Version

6中,用

函数seek和tell提供类似功能。)

实例



程式31测试其标准输入能否被配置位移量。

程式31〓测试标准输入能否被配置位移量。

假如我们用交互方式调用此程式,则可得:

$ aout < /etc/motd

seek OK

$ cat < /etc/motd |aout

cannot seek

$ aout < /var/spool/cron/FIFO

cannot seek

通常,一个文档的当前位移量应当是个非负整数,但是,某些设备也可能允许负

的位移量

。但对于普通文档,则其位移量必须是非负值。因为位移量可能是负值,所以在比

较lseek

的返回值时应谨慎,不要测试他是否小于0,而要测试他是否等于-1。

在80386上运行的SVR4支持/dev/kmem设备能够具备负的位移量。

因为位移量是带符号数据类型(off[CD#*2]t)(见图28),所以最大文档长度减少

一半。例

如,若off[CD#*2]t是32位整型,则最大文档长度是231字节。

lseek仅将当前的文档位移量记录在系统核内,他并不引起任何I/O操作。然后,该

位移量用

于下一个读或写操作。

文档位移量能够大于文档的当前长度,在这种情况下,对该文档的下一次写将延长

该文档,

并在文档中构成一个空调,这一点是允许的。位于文档中但没有写过的字节都被读

为0。

实例

程式32创建一个具备空洞的文档

程式32创建一个具备空洞的文档

运行该程式得到:

$ aout

$ ls -1 filehole 〓〓〓〓〓〓〖WB〗检查其大小

-rw-r--r--〓1 stevens〓50 Jul 31 05:50 filehole

$ od -c filehole〖DW〗观察实际内容

000000〓〖WB〗a〓b〓c〓d〓e〓f〓g〓h〓i〓j \0〓\0〓\0〓\0〓\0

〓\0

000020〖DW 剑埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊?nbsp;

0〓\

0〓\0〓\0〓\0〓\0

000040〖DW 剑埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊痢隆谩?nbsp;

D〓E〓

F〓G〓H

000060〖DW〗I〓J

000062

我们使用od(1)命令观察该文档的实际内容。命令行中的-C标志表示以字节方式打

印文档内

容。从中能够看到,文档中间的30个未写字节都被读成为0。每一行开始的一个七

位数是以

八进制形式表示的字节位移量。在本例中,我们调用了将在38节中说明的write

函数。在4

12节中我们将对具备空洞的文档进行更多说明。

37〓read函数

用read函数从打开文档中读数据。

#include <unistdh>

ssize[CD#*2]t read(int filedes,void *buff,size[CD#*2]t nbytes

);

返回:读到的字节数,若已到文档尾为0,出错为-1

如read成功则返回读到的字节数。假如已到达文档的尾端,则返回0。

有多种情况可使实际读到的字节数少于需要读字节数:

读普通文档时,在读到需要字节数之前已到达了文档尾端。例如,若在到达文档尾

端之前还

有30个字节,而我们却需要读100个字节,则read返回30,下一次我们再调用read

时,他将

返回0(文档尾端)。

·当从终端设备读时,通常一次最多读一行(在第十一章中将介绍如何改变这一点

)。

·当从网络读时,网络中的缓冲机构可能造成返回值小于所需要读的字节数。

·某些面向记录的设备,例如磁带,一次最多返回一个记录。

读操鞔游牡档牡鼻拔灰屏看迹诔晒Ψ祷刂埃梦灰屏吭黾邮导识恋玫淖?nbsp;

节数。

POSIX1在几个方面对此函数的原型作了更改。其经典定义是:

int read(int fildes,char *buff,unsigned nbytes);

首先,为了和ANSI C一致,其第2个参数由char *改为void *。在ANSI C中,类型

void *用

于表示类属指针。其次,其返回值必须是个带符号整数(ssize[CD#*2]t),以返

回正字节

数、0(表示文档尾端)或-1(出错)。最后,第3个参数在历史上是个不带符号整数,

以允许一

个16位的实现能够一次读或写至65534个字节。在1990 POSIX1标准中,引进了新

的基本系

统数据类型ssize[CD#*2]t以提供带符号的返回值,size[CD#*2]t则被用于第3个参

数(回忆

图27中的SSIZE〖CD#*2]MAX常数。)

38〓write函数

用write函数向打开文档写数据。

#include <unistdh>

ssize[CD#*2]t write(int filedes,const void *buff,size[CD#*2]t 

nbytes

);

返回:若成功为已写的字节数,出错为-1

其返回值通常导于参数nbyte,否则表示出错。write出错的一个常见原因是:或

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!