阿信ocean 2016-03-22 01:13 采纳率: 100%
浏览 1352
已采纳

关于复制文件的C程序,write写入的在文件中找不到

#include
#include
#include /* for memcpy */
#include
#include
#include
#include
#include
#include

#define PERMS 0600

int main ( int argc, char * argv[] )
{
int src, dst;
void * sm, * dm;
struct stat statbuf;

 if  ( argc  !=   3  )
{
    fprintf( stderr,  "  Usage: %s  \n " , argv[ 0 ] );
    exit( EXIT_FAILURE );
}
 if  ( ( src  =  open( argv[ 1 ], O_RDONLY ) )  <   0  )
{
    perror(  " open source "  );
    exit( EXIT_FAILURE );
}
 /*  为了完成复制,必须包含读打开,否则mmap()失败  */ 
 if  ( ( dst  =  open( argv[ 2 ], O_RDWR  |  O_CREAT  |  O_TRUNC, PERMS ) )  <   0  )
{
    perror(  " open target "  );
    exit( EXIT_FAILURE );
}
 if  ( fstat( src,  & statbuf )  <   0  )
{
    perror(  " fstat source "  );
    exit( EXIT_FAILURE );
}
 /* 
 * 参看前面man手册中的说明,mmap()不能用于扩展文件长度。所以这里必须事
 * 先扩大目标文件长度,准备一个空架子等待复制。
  */ 
 if  ( lseek( dst, statbuf.st_size  -   1 , SEEK_SET )  <   0  )
{
    perror(  " lseek target "  );
    exit( EXIT_FAILURE ); 
} 
 if  ( write( dst,  "a",  1  )  !=   1  )
{
    perror(  " write target "  );
    exit( EXIT_FAILURE );
} 

 /*  读的时候指定 MAP_PRIVATE 即可  */ 
sm  =  mmap(  0 , ( size_t )statbuf.st_size, PROT_READ,
           MAP_PRIVATE  |  MAP_NORESERVE, src,  0  );
 if  ( MAP_FAILED  ==  sm )
{
    perror(  " mmap source "  );
    exit( EXIT_FAILURE );
}
 /*  这里必须指定 MAP_SHARED 才可能真正改变静态文件  */ 
dm  =  mmap(  0 , ( size_t )statbuf.st_size, PROT_WRITE,
           MAP_SHARED, dst,  0  );
 if  ( MAP_FAILED  ==  dm )
{
    perror(  " mmap target "  );
    exit( EXIT_FAILURE );
}
memcpy( dm, sm, ( size_t )statbuf.st_size );
 /* 
 * 可以不要这行代码
 *
 * msync( dm, ( size_t )statbuf.st_size, MS_SYNC );
  */ 
 return ( EXIT_SUCCESS );

}
上面是一个复制文件的C程序,请问其中的代码
if ( write( dst, "a", 1 ) != 1 )
{
perror( " write target " );
exit( EXIT_FAILURE );
}
写入的a为什么在复制的的文件里找不到???

  • 写回答

3条回答 默认 最新

  • 老愚叟 2016-03-24 08:34
    关注

    A之前是加到文件最后了,放在 (statbuf.st_size - 1) 的位置上, 之后你不是用map copy了吗?就把这个位置的内容覆盖了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 把分全给哥 2016-03-22 02:00
    关注

    是不是被覆盖了

    评论
  • 阿信ocean 2016-03-22 14:54
    关注

    没有吧,a加到文件的最后了

    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 python 3des pyDes库
  • ¥15 关于#mysql#安装失败的问题。MySQL
  • ¥15 想问一下for循环计算表达式的方法,第一次接触
  • ¥15 如何在VA框架上面加功能,去读取框架内任何app数据功能
  • ¥15 关于#c语言#的问题:用c或c++写一个计算下列问题有关软件工程的代码并加上分析
  • ¥15 Zeppelin0.10.0版本升级lib包下的shiro-web
  • ¥15 链表入队的指针内存问题
  • ¥20 vba如何写本地html文件执行js
  • ¥15 VS2022的C#如何创建
  • ¥20 关于#用户注册#的问题,如何解决?