使用标准I/O库的方式和使用底层文件描述符一样。需要先打开一个文件以建立访问路径。在标准I/O库中与底层文件描述符对应的是流(stream),是指向结构体FILE的指针。
启动程序时,有3个文件流是自动打开的。它们是stdin stdout stderror,都是在stdio.h中定义的,分别代表标准输入 标准输出 标准错误输出,与底层文件描述符0 1 2相对应。
结构体FILE:(已定义在stdio.h中)
typedef struct { short level; //缓冲区满或空的状态 unsigned flags; //文件状态标志 char fdl; //文件描述符 unsigned char hold; //缓冲区无内容不读取字符 short bsize; //缓冲区的大小 unsigned char * buffer; //数据缓冲区的位置 unsigned char * curp; //指针当前的指向 unsigned istemp; //临时文件指示器 short tokens; //用于有效性检查 }FILE;
标准I/O库中常用函数:
fopen fclose
fread fwrite
fgetc fputc
通过stdio.h头文件里的函数来实现文件复制
1 逐个字符复制
#include <stdio.h> #include <stdlib.h> int main() { FILE * filein,* fileout; int num; filein = fopen("file.in","r"); fileout = fopen("file.out","w"); while((num=fgetc(filein))!=-1) { fputc(num,fileout); } return 0; }
代码比较简单,就不注释了
2 逐个数据块复制
#include <stdio.h> #include <stdlib.h> int main() { FILE * filein,* fileout; char block[1024]; int nread; filein = fopen("file.in","r"); fileout = fopen("file.out","wb"); while((nread=fread(block,sizeof(char),1024,filein))>0) { printf("write once"); fwrite(block,sizeof(char),nread,fileout); } fclose(filein); fclose(fileout); return 0; }
运行程序:
TIMEFORMAT=“” time ./copy_stdio
虽然不如底层数据块复制快,但比一般的快多了。因为stdio库在FILE结构里使用了一个内部缓冲区,只有在缓冲区满时才进行底层系统调用。