首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于文件拷贝的实现,有一段不懂。请问一下

2012-03-23 
关于文件拷贝的实现,有一段不懂。。请教一下据说这是很经典的拷贝文件代码while(bytes_readread(from_fd,bu

关于文件拷贝的实现,有一段不懂。。请教一下
据说这是很经典的拷贝文件代码

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
  if((bytes_read)==-1)&&(errno!=EINTR)) break;
  else if(bytes_read>0)
  {
  ptr=buffer;  
  while(bytes_write=write(to_fd,ptr,bytes_read))
  {
  if((bytes_write)==-1)&&(errno!=EINTR)) break;
  else if(bytes_write==bytes_read) break;//写完了所有字节
  else if(bytes_write>0)//只写了一部分,继续写。
  {
  ptr+=bytes_write;
  bytes_read-=bytes_write;
  }
  }
  if(bytes_write==-1) break;
 
  }
}
之前大概定义了 from_fd是拷贝的源文件, to_fd是拷贝的目标文件
buff是存放读取字节的地方 BUFFER_SIZE 是1024
我的问题是在那句“只写了一部分,继续写”这个地方
写函数不是一次就将参数里指定数量的字符写入目标文件吗
怎么会发生只写了一部分的情况
什么情况下会发生这样的事情


[解决办法]
write不能保证全部写入。

请man 2 write
[解决办法]
write应该是不带缓冲的I/O函数,所以它一次能写多少应该是有个数量限制的。
[解决办法]
wirte返回实际写入的字节数
[解决办法]
因为写操作不是直接写到设备上,而是先写到缓冲区,然后由操作系统写到设备上。如果你写的时候,缓冲区快满了,就只能写一部分数据到缓冲区了,所以是先写一部分,继续写

热点排行