#if 0
目的:将一个文件中的内容复制到另一个文件中
设计思路:利用open函数分别打开两个文件;
利用read 函数读取文件中的内容到缓冲区;
利用write函数将缓冲区中的内容写入到另一个文件中;
注意事项:1.在main函数填写参数,open,read,write的使用时要排除可能的错误,若出错,显示错误.
2.考虑一次性读写完毕,和多次读写完毕两种情况
3.文件的读取和写入可能要进行多次,利用循环
4.在从缓冲区向文件中写内容时,在需要多次写入的情况下,要注意将指向缓冲区的指针更新.
在从文件读数据到缓冲区时,并不存在这一问题,因为系统自动会更新文件中的指针
5.在“读写”操作过程中,注意出错的条件要加上 errno!=EINTR
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define buffer_size 1024
int main(int argc,char *argv[])
{
int from_open,to_open; /*句柄*/
int read_size,write_size;
char buffle[buffer_size]; /*一次性读数据的大小*/
char *ptr; /*用于从缓冲区写数据到文件,指向缓冲区的指针*/
if(argc!=3)
{
printf("please try to input two files!\n");
exit(1);
}
if((from_open=open(argv[1],O_RDONLY | O_CREAT,S_IRUSR | S_IWUSR))==-1)
{
fprintf(stderr,"open %s failure as %s\n",argv[1],strerror(errno));
exit(1);
}
else
{
printf("open the file %s succefully\n",argv[1]);
}
if((to_open=open(argv[2],O_WRONLY | O_CREAT,S_IRUSR | S_IWUSR))==-1)
{
fprintf(stderr,"open %s failure as %s\n",argv[2],strerror(errno));
exit(1);
}
else
{
printf("open the file %s succefully\n",argv[2]);
}
while(read_size=read(from_open,buffle,buffer_size))
{
if((read_size==-1)&&(errno!=EINTR)) /*加上errno!=EINTR*/
{
fprintf(stderr,"read file %s failure as %s",argv[1],strerror(errno));
exit(1);
}
ptr=buffle;
while(write_size=write(to_open,ptr,read_size))
{
if((write_size==-1)&&(errno!=EINTR)) /*加上errno!=EINTR*/
{
fprintf(stderr,"write file %s failure as %s",argv[2],strerror(errno));
exit(1);
}
if(write_size==read_size) /*循环终止条件 技巧:一次性写完*/
break;
ptr+=write_size; /*非一次性写完*/
read_size-=write_size;
}
}
close(from_open);
close(to_open);
exit(0);
}
小结:在编译执行过程中出错 :write_size==-1 原因是 在open该文件时 其属性为只读了,改为可写后
错误消失。