一、相关函数
文件IO 标准IO
read() fgets() fgetc() fread()
write() fputs() fputc() fwrite()
行缓存 有缓存, 但 全缓存
不是行缓存
二、比较read()、write() 和 fgetc()、fputc()的效率
① read()、write()代码示例:

/*
实现cp命令:
用文件IO中的read()、write()实现文件拷贝,
并与fgetc、fputc做效率比较
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int rd_fd, wr_fd;
char buf[128]={0};
int rd_ret = 0;
if(argc < 3)
{
printf("please input src file and des file!
");
return -1;
}
//打开要拷贝的文件
rd_fd = open(argv[1], O_RDONLY);
if(rd_fd < 0)
{
printf("open src file %s failure
", argv[1]);
return -2;
}
printf("open src file %s succ, rd_fd = %d
", argv[1], rd_fd);
//打开目标文件,文件不存在则创建新的目标文件
wr_fd = open(argv[2], O_WRONLY|O_CREAT, 0777);
if(wr_fd < 0)
{
printf("open des file %s failure
", argv[2]);
return -3;
}
while(1)
{
rd_ret = read(rd_fd, buf, 128);
if(rd_ret < 128)//判断数据是否读取完毕
{
break;
}
write(wr_fd, buf, rd_ret);
memset(buf, 0, 128);//清理缓存
}
write(wr_fd, buf, rd_ret);
//关闭文件描述符
close(wr_fd);
close(rd_fd);
return 0;
}
② fgetc()、fputc()代码示例

/*
用fgetc、fputc实现文件拷贝
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *src_fp, *des_fp;
int read_ret;
if(argc < 3)
{
printf("please input src and des file
");
return -1;
}
//打开原文件
src_fp = fopen(argv[1],"r");
if(src_fp == NULL)
{
printf("open src %s file failed!
", argv[1]);
return -2;
}
//打开目标文件
des_fp = fopen(argv[2], "w");
if(des_fp == NULL)
{
printf("open des %s file failed!
",argv[2]);
return -3;
}
while(1)
{
read_ret = fgetc(src_fp);//读取原文件
if(feof(src_fp))//判断文件是否读取完毕
{
printf("read file %s endl!
", argv[1]);
break;
}
fputc(read_ret, des_fp);//写入原文件
}
fclose(des_fp);
fclose(src_fp);
return 0;
}
三、结果展示
四、fgets()、fread()函数比较
① 用fgets、fputs代码示例:

/*
用fgets、fputs实现文件拷贝
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *src_fp, *des_fp;
char buf[128]={0};
if(argc < 3)
{
printf("please input src and des file
");
return -1;
}
//打开原文件
src_fp = fopen(argv[1],"r");
if(src_fp == NULL)
{
printf("open src %s file failed!
", argv[1]);
return -2;
}
//打开目标文件
des_fp = fopen(argv[2], "w");
if(des_fp == NULL)
{
printf("open des %s file failed!
",argv[2]);
return -3;
}
while(1)
{
fgets(buf, 128, src_fp);
if(feof(src_fp))
{
printf("read file %s endl!
",argv[1]);
break;
}
fputs(buf, des_fp);
}
fclose(des_fp);
fclose(src_fp);
return 0;
}
② 用fread()、fwrite()代码示例:

/*
用fread、fwrite实现文件拷贝
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *src_fp, *des_fp;
char buf[128]={0};
int read_ret;
if(argc < 3)
{
printf("please input src and des file
");
return -1;
}
//打开原文件
src_fp = fopen(argv[1],"r");
if(src_fp == NULL)
{
printf("open src %s file failed!
", argv[1]);
return -2;
}
//打开目标文件
des_fp = fopen(argv[2], "w");
if(des_fp == NULL)
{
printf("open des %s file failed!
",argv[2]);
return -3;
}
while(1)
{
read_ret = fread(buf, 1, 128, src_fp);
fwrite(buf, 1, read_ret, des_fp);
if(read_ret < 128)
{
printf("read file %s endl!
",argv[1]);
break;
}
}
fclose(des_fp);
fclose(src_fp);
return 0;
}