C語(yǔ)言程序設(shè)計(jì)(第8章輸入輸出和文件系統(tǒng))2

字號(hào):

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.");
    }