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