8.2 非緩沖文件系統(tǒng)
前面介紹的緩沖文件系統(tǒng)是借助文件結(jié)構(gòu)體指針來(lái)對(duì)文件進(jìn)行管理,通過(guò)文件指針來(lái)對(duì)文件進(jìn)行訪問(wèn),既可以讀寫字符、字符串、格式化數(shù)據(jù),也可以讀寫二進(jìn)制數(shù)據(jù)。非緩沖文件系統(tǒng)依賴于操作系統(tǒng),通過(guò)操作系統(tǒng)的功能對(duì)文件進(jìn)行讀寫,是系統(tǒng)級(jí)的輸入輸出,它不設(shè)文件結(jié)構(gòu)體指針,只能讀寫二進(jìn)制文件,但效率高、速度快,由于ANSI標(biāo)準(zhǔn)不再包括非緩沖文件系統(tǒng),因此建議大家不要選擇它。本書只作簡(jiǎn)單介紹。
1. 文件的打開(kāi)與關(guān)閉
非緩沖文件系統(tǒng)不是ANSI標(biāo)準(zhǔn)定義的,是UNIX型I/O系統(tǒng)的一員,所以,其原型位于io.h文件中。
打開(kāi)文件:
int open(char *fname,int access);
打開(kāi)文件名為fname,以access方式訪問(wèn):
access的值為:O_RDONLY 只讀
O_WRONLY 只寫
O_RDWR 讀寫
關(guān)閉文件:
close(int fd);
下述程序用UNIX系統(tǒng)打開(kāi)和關(guān)閉一個(gè)文件:
#include "io.h"
#include "fcntl.h"
#include "sys\stat.h"
main(argc, argv)
int argc;
char *argv[]
{
int fd;
if((fd=open(argv[1],O_RDONLY))==-1) /* 以只讀方式打開(kāi)文件*/
{
printf("cannt open file!");
exit(0);
}
printf("file existent!");
if(close(fd)) printf("error in closing file\n");
}
2. 文件的讀寫
對(duì)非緩沖文件系統(tǒng)的讀寫函數(shù)的原型在io.h頭文件中,其調(diào)用形式為:
int read(int fd,void *buf,int count)
read( )函數(shù)從fd說(shuō)明的文件中讀取count個(gè)字節(jié)到buf所指向的緩沖區(qū)。函數(shù)的返回值是實(shí)際讀寫的字節(jié)數(shù)。
int write(int fd,void *buf,int count)
write( )函數(shù)把count個(gè)字節(jié)從buf寫入到fd說(shuō)明的文件中。函數(shù)的返回值是實(shí)際寫入的字節(jié)數(shù)。
下面例子從文件TEST.TST中讀取它的前半100個(gè)字節(jié)并放到數(shù)組buffer中。
#include "io.h"
#include "stdio.h"
#include "fcntl.h"
main( )
{
int fd;
char buffer[100];
if ((fd=open("TEST.TST",O_RDONLY))==-1) /* 打開(kāi)文件* /
{
printf("cannot open file !\n");
exit(0);
}
if(read(fd,buffer,100)!=100) /*判斷讀寫的字節(jié)數(shù)是否正確*/
printf("Possible read error.");
}
前面介紹的緩沖文件系統(tǒng)是借助文件結(jié)構(gòu)體指針來(lái)對(duì)文件進(jìn)行管理,通過(guò)文件指針來(lái)對(duì)文件進(jìn)行訪問(wèn),既可以讀寫字符、字符串、格式化數(shù)據(jù),也可以讀寫二進(jìn)制數(shù)據(jù)。非緩沖文件系統(tǒng)依賴于操作系統(tǒng),通過(guò)操作系統(tǒng)的功能對(duì)文件進(jìn)行讀寫,是系統(tǒng)級(jí)的輸入輸出,它不設(shè)文件結(jié)構(gòu)體指針,只能讀寫二進(jìn)制文件,但效率高、速度快,由于ANSI標(biāo)準(zhǔn)不再包括非緩沖文件系統(tǒng),因此建議大家不要選擇它。本書只作簡(jiǎn)單介紹。
1. 文件的打開(kāi)與關(guān)閉
非緩沖文件系統(tǒng)不是ANSI標(biāo)準(zhǔn)定義的,是UNIX型I/O系統(tǒng)的一員,所以,其原型位于io.h文件中。
打開(kāi)文件:
int open(char *fname,int access);
打開(kāi)文件名為fname,以access方式訪問(wèn):
access的值為:O_RDONLY 只讀
O_WRONLY 只寫
O_RDWR 讀寫
關(guān)閉文件:
close(int fd);
下述程序用UNIX系統(tǒng)打開(kāi)和關(guān)閉一個(gè)文件:
#include "io.h"
#include "fcntl.h"
#include "sys\stat.h"
main(argc, argv)
int argc;
char *argv[]
{
int fd;
if((fd=open(argv[1],O_RDONLY))==-1) /* 以只讀方式打開(kāi)文件*/
{
printf("cannt open file!");
exit(0);
}
printf("file existent!");
if(close(fd)) printf("error in closing file\n");
}
2. 文件的讀寫
對(duì)非緩沖文件系統(tǒng)的讀寫函數(shù)的原型在io.h頭文件中,其調(diào)用形式為:
int read(int fd,void *buf,int count)
read( )函數(shù)從fd說(shuō)明的文件中讀取count個(gè)字節(jié)到buf所指向的緩沖區(qū)。函數(shù)的返回值是實(shí)際讀寫的字節(jié)數(shù)。
int write(int fd,void *buf,int count)
write( )函數(shù)把count個(gè)字節(jié)從buf寫入到fd說(shuō)明的文件中。函數(shù)的返回值是實(shí)際寫入的字節(jié)數(shù)。
下面例子從文件TEST.TST中讀取它的前半100個(gè)字節(jié)并放到數(shù)組buffer中。
#include "io.h"
#include "stdio.h"
#include "fcntl.h"
main( )
{
int fd;
char buffer[100];
if ((fd=open("TEST.TST",O_RDONLY))==-1) /* 打開(kāi)文件* /
{
printf("cannot open file !\n");
exit(0);
}
if(read(fd,buffer,100)!=100) /*判斷讀寫的字節(jié)數(shù)是否正確*/
printf("Possible read error.");
}