第10章 输入/输出函数库:io.h 在C程序中,常常需要对文件及文件流进行读取、输出及写入等操作,C语言专门提供了这样的函数库——输入/输出函数库(io.h)。 10.1 access()——文件访问权限设置函数 access()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\01

access()函数用于确定文件的访问权限。

语法

int access(const char *file, int auth);

access()函数的语法参数说明如下:

参数file为文件名。

参数auth值为0时测试文件是否存在,值为2时测试文件是否可写。

access()测试结果:允许时返回0,否则返回-1。

示例

本示例演示用access()函数确定文件是否存在,程序执行前保证d:\tc\01.c存在,d:\tc\02.c不存在。其具体代码如下:

img437

运行结果如图10.1所示。

img438

图10.1 使用access()函数确定文件是否存在 10.2 chmod()——改变文件访问方式函数 chmod()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\02

chmod()函数用于改变文件访问方式。

语法

int chmod(const char *file, int auth);

chmod()函数的语法参数说明如下:

参数file为要修改的文件名。

参数auth为要修改的权限,其值为:S_IREAD,S_IWRITE,S_IEXEC。

chmod()函数若修改成功返回0,否则返回-1。

示例

本示例演示用chmod()函数将文件设置为只读,程序执行前保证d:\tc\01.c存在,d:\tc\02.c不存在。其具体代码如下:

img439

img440

运行结果如图10.2所示。

img441

图10.2 用chmod()函数将文件设置为只读 10.3 close()——关闭文件函数 close()函数

实用程度:★★★☆☆

close()函数用于关闭由open()函数所打开的文件。

语法

int close(int handle);

close()函数的语法参数说明如下:

参数handle为打开文件时所返回的文件句柄。

close()函数成功关闭文件返回0,否则返回-1。

示例

示例参见10.13节。 10.4 creat()——创建文件函数 creat()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\04

creat()函数用于创建指定文件名的文件。以下为创建文件时指定的操作权限:

define FA_RDONLY 0x01  / 只读 /

define FA_HIDDEN 0x02  / 隐藏 /

define FA_SYSTEM 0x04  / 系统 /

define FA_LABEL  0x08  / 卷标 /

define FA_DIREC0x10  / 目录 /

define FA_ARCH  0x20  / 归档 /

语法

int creat (const char *file, int auth);

creat()函数的语法参数说明如下:

参数file为文件名。

参数auth为操作权限。

creat()函数成功执行时返回所创建文件的句柄,否则返回-1。

示例

本示例演示用creat()函数创建一个文件,然后输入内容。注意,creat()方法创建文件不能覆盖同名文件。其具体代码如下:

img442

运行过程如图10.3(a)所示。运行结果如图10.3(b)所示。

img443

图10.3 程序运行过程和结果 10.5 dup()——复制文件句柄函数 dup()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\05

dup()函数用于复制文件句柄,常用于由流式文件获取句柄。从这个角度来说,dup()函数的功能与fdopen()正好相对。fdopen()的功能是由句柄获取文件流。

语法

int dup(int *handle);

dup()函数的语法参数说明如下:

参数handle为要检测的文件句柄。

dup()函数的返回值:当函数成功执行时返回新的文件句柄,出错时返回-1。

示例

本程序演示怎样在流式文件操作时进行加锁和解锁的操作。主体操作都用流文件操作函数,加锁解锁时的文件句柄通过dup函数从流文件获得。其具体代码如下:

img444

img445 10.6 eof()——文件检测结束函数 eof()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\06

eof()函数用于检查文件是否结束。

语法

int eof(int *handle);

eof()函数的语法参数说明如下:

参数handle为要检测的文件句柄。

eof()到文件尾函数返回1,没到文件尾返回0,出错时返回-1。

示例

本示例演示用read()函数从文件读数据,用eof()函数测试文件尾。其具体代码如下:

img446

img447

运行结果如图10.4所示。

img448

图10.4 读数据 10.7 fdopen()——连接文件句柄函数 fdopen()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\07

fdopen()函数用于将流与文件句柄连接。stdio.h中的函数fopen()、fclose()、fscanf()和fprintf()是高级文件操作方式——以流的方式操作文件,fdopen()可以连接文件句柄和流。

语法

FILE fdopen(int handle, char type);

fdopen()函数的语法参数说明如下:

参数handle为要操作的句柄。

参数type指定流打开的方式。

fdopen()函数返回指向该流的文件指针。

示例

本示例演示用fdopen()函数连接文件句柄和流,以流的方式向文件中输入一行字符串。其具体代码如下:

img449

img450

运行结果如图10.5所示。

img451

图10.5 用流向文件写入字符串 10.8 filelength()——文件字节数统计函数 filelength()函数

实用程度:★★★★☆

filelength()函数用于统计由open()所打开文件的字节数。

语法

long filelength(int handle);

filelength()函数的语法参数说明如下:

参数handle为要统计的文件句柄。

filelength()函数返回打开文件的长度。

示例

示例见10.12节。 10.9 getftime()——获取文件时间函数 getftime()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\09

getftime()函数用于读取指定文件的时间。

语法

int getftime(int handle, struct ftime *ftimep);

getftime()函数的语法参数说明如下:

参数handle为要获取文件的句柄。

参数ftimep为存储文件时间的结构体。

getftime()函数的返回值:成功返回文件的修改时间,否则返回-1。

示例

本示例演示用getftime()函数获取文件最后访问时间。其具体代码如下:

img452

运行结果如图10.6所示。

img453

图10.6 使用getftime()函数获取文件时间 10.10 isatty()——设备类型检查函数 isatty()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\10

isatty()函数用于检查给定的设备类型。

常用设备名:

stdin  标准输入设备 键盘

stdout 标准输出设备 显示器

stderr 标准出错设备

stdaux 辅助设备

stdprn 打印机

语法

int isatty(int handle);

isatty()函数的语法参数说明如下:

参数handle为要检查的设备文件句柄。

isatty()函数对于设备返回非0整数,对于普通文件返回0。

示例

本示例演示用isatty()函数将字符串复制到新建的空间。其具体代码如下:

img454

运行结果如图10.7所示。

img455

图10.7 使用isatty ()函数判断设备和普通文件 10.11 lock()——文件共享锁设置函数 lock()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\11

lock()函数用于设置指定文件的文件共享锁。

语法

int lock(int handle, long offset, long length);

lock()函数的语法参数说明如下:

参数handle为要设置共享锁的文件句柄。

参数offset为要设置的开始位置。

参数length为要设置的长度。

lock()函数设置成功返回0,否则返回非0值。

示例

本示例演示用lock()函数为文件设置共享锁,用unlock()取消共享锁。其具体代码如下:

img456 10.12 lseek()——移动文件指针函数 lseek()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\12

lseek()函数用于移动打开文件指针。

语法

long lseek(int handle, long offset, int fromwhere);

lseek()函数的语法参数说明如下:

参数handle为要移动文件指针的文件句柄。

参数offset为要移动的偏移量。

参数fromwhere为文件指针的当前位置。

lseek()函数的返回值:移动文件指针后的文件指针位置。

示例

本示例演示先创建文件,内容为mingri book!。再打开文件,取前6个字符,再跳过空格取下面的4个字符(跳过空格时,文件指针位置应为7)。其具体代码如下:

img457

运行结果如图10.8所示。

img458

图10.8 移动文件指针的操作 10.13 open()——打开文件函数 open()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\13

open()函数用于打开文件。

文件属性如下:

define O_RDONLY   1  只读

define O_WRONLY   2  只写

define O_RDWR    4  读写

define O_CREAT  0x0100  /新建文件/

define O_TRUNC  0x0200  /独占打开/

define O_EXCL  0x0400  /执行文件/

define O_APPEND 0x0800  /追加到文件尾/

define O_TEXT  0x4000  /文本文件/

define O_BINARY 0x8000  /二进制文件/

语法

int open(char *path, int access[, int auth]);

open()函数的语法参数说明如下:

参数path为要打开的包含路径的文件名。

参数access为打开方式。

参数auth为访问权限。

open()函数的返回值:该文件句柄。

示例

本示例演示用open()函数打开文件,用read()函数读取数据,程序运行前确保d:\a.txt存在。其具体代码如下:

img459

img460

运行结果如图10.9所示。

img461

图10.9 使用read ()读数据 10.14 read()——读文件函数 read()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\14

read()函数用于读取打开文件的内容。

语法

int read(int handle, void *buf, int len);

read()函数的语法参数说明如下:

参数handle为要读取的文件。

参数buf为要将读取的内容保存的位置。

参数len为要读取文件的长度。

read()函数的返回值:读取的字节数。

示例

示例参见10.6节。 10.15 setmode()——设置文件打开方式函数 setmode()函数

实用程度:★★★★☆

实例位置:配套资源\SL\10\15

setmode()函数用于设置打开文件的模式。文件模式如下:

define O_RDONLY   1  /只读/

define O_WRONLY   2  /只写/

define O_RDWR    4  /读读/

define O_CREAT  0x0100 /创建文件/

define O_TRUNC  0x0200 /独占打开/

define O_EXCL  0x0400 /执行文件/

define O_APPEND 0x0800 /追加到文件尾/

define O_TEXT  0x4000 /文本文件/

define O_BINARY 0x8000 /二进制模式/

语法

int setmode(int handle, int amode)

setmode()函数的语法参数说明如下:

参数handle为要设置的文件句柄。

参数amode为要设置的方式。

setmode()函数的返回值:成功执行时返回0,否则返回-1。

示例

本示例演示用setmode()函数重新为打开的文件设置操作模式(程序运行前确保d:\a.txt存在)。其具体代码如下:

img462

img463

运行结果如图10.10所示。

img464

图10.10 使用setmode()函数设置操作模式 10.16 tell()——获取文件指针位置函数 tell()函数

实用程度:★★★★☆

tell()函数用于获取打开文件的指针位置。

语法

long tell(int handle);

tell()函数的语法参数说明如下:

参数handle为获取文件指针的文件句柄。

tell()函数的返回值:正确执行时返回给定文件的文件指针位置,否则返回-1。

示例

示例参见10.12节。 10.17 unlock()——解除共享锁函数 unlock()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\17

unlock()函数用于解除文件的共享访问锁。

语法

int unlock(int handle, long offset, long length);

unlock()函数的语法参数说明如下:

参数handle为要解除共享锁的文件句柄。

参数offset为要解除共享锁的开始位置。

参数length为要解除共享锁的长度。

unlock()函数的返回值:设置成功返回0,否则返回非0值。

示例

示例参见10.11节。 10.18 write()——写文件函数 write()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\10\18

write()函数用于将指定内容写入打开的文件。

语法

int write(int handle, void *buf, int len);

write()函数的语法参数说明如下:

参数handle为要写入的文件句柄。

参数buf为要写入的内容。

参数len为要写入文件的长度。

write()函数的返回值:写入文件内容的长度。

示例

示例参见10.4节。