程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c語言-關於復制文件的C程序,write寫入的在文件中找不到

c語言-關於復制文件的C程序,write寫入的在文件中找不到

編輯:編程解疑
關於復制文件的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為什麼在復制的的文件裡找不到???

最佳回答:


A之前是加到文件最後了,放在 (statbuf.st_size - 1) 的位置上, 之後你不是用map copy了嗎?就把這個位置的內容覆蓋了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved