使用标准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结构里使用了一个内部缓冲区,只有在缓冲区满时才进行底层系统调用。