以Linux为例,用C代码操作文件一般有两种方法,一种是使用POSIX的函数操作文件(使用fd句柄,称为句柄法),另外则是使用LIBC提供的函数(使用FILE,称为指针法)。
句柄法的例程如下:
int main(void) { int fd; int numbytes; char path[] = "file"; char buf[256]; fd = open(path, O_CREAT | O_RDONLY, 0644); memset(buf, 0x00, 256); while((numbytes = read(fd, buf, 255)) > 0) { // ... memset(buf, 0x00, 256); } close(fd); }
第二种指针法的例程如下:
int main(void) { FILE *fr; int n; long elapsed_seconds; char line[80]; fr = fopen ("elapsed.dta", "rt"); /* open the file for reading */ while(fgets(line, 80, fr) != NULL) { // ... } fclose(fr); }
两者的区别在于:
(1)句柄法没有buffer,所有的读写操作都是直接操作IO,因为IO速度慢,所以导致整体读取效率不高;而指针法默认提供了buffer,读取文件读取使用缓存后,可以减少IO操纵次数,提高IO效率,从而提高了性能。用户可以使用void setbuf ( FILE * stream, char * buffer )来改变buffer大小,或者将buffer设为NULL从而禁止buffer。
(2)采用指针法,C提供了大量要求FILE的函数,如从文件中读一行数据等。
BTW,对于FILE的指针法,一般读写文本文件使用fgetc/fputc/fgets/fputs/fscanf/fprintf,对于二进制文件则使用fread/fwrite