n掌握Linux系統(tǒng)調(diào)用對文件操作
n掌握linux系統(tǒng)調(diào)用的常用函數(shù)文件訪問用法
1.2實驗內(nèi)容
n使用系統(tǒng)調(diào)用方式實現(xiàn)文件拷貝功能
n編寫程序掌眠,從待拷貝的文件中逐步讀出數(shù)據(jù)到緩沖區(qū)卡啰,再把緩沖區(qū)的數(shù)據(jù)逐個寫入到新創(chuàng)建的文件中碌上,完成對原文件的拷貝工作
n對應代碼流程圖。
n進入實驗代碼目錄lab9窖式,根據(jù)下圖參考代碼編寫filecp.c程序
$vim filecp.c
1、編寫好后如下圖所示:
2想括、用gcc編譯filecp.c文件忠寻,輸入命令:$gcc filecp.c –o filecp
生成可執(zhí)行文件filecp
3、運行應用程序百揭,如下圖所示爽哎,將filecp.c文件復制為test.c,然后用diff命令比
較兩個文件的內(nèi)容是否一樣器一,一樣則說明拷貝正確课锌。
//功能描述:該程序采用系統(tǒng)調(diào)用方式通過從待拷貝的文件中逐步讀出數(shù)據(jù)到緩沖區(qū),再把緩沖區(qū)的數(shù)據(jù)逐個寫入到新創(chuàng)建的文件中祈秕,完成對原文件的拷貝
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
intmain(intargc,char**argv)
{
intfrom_fd,to_fd;//保存文件描述符
longfile_len=0;//保存文件的總大小
intret=1;
charbuffer[BUFFER_SIZE];//定義緩存區(qū)
//判斷入口參數(shù)
if(argc!=3)
{
printf("Usage:%sfromfile
tofile\n",argv[0]);
exit(1);
}
//打開源文件
if((from_fd=open(argv[1],O_RDONLY|O_CREAT))==-1)
{
printf("Open %s
Error\n",argv[1]);
exit(1);
}
//創(chuàng)建目的文件
if((to_fd=open(argv[2],O_WRONLY|O_CREAT))==-1)
{
printf("Open %s Error\n",argv[2]);
exit(1);
}
//獲取文件大小
file_len=lseek(from_fd,0L,SEEK_END);
lseek(from_fd,0L,SEEK_SET);
printf("form file
size is %d\n",file_len);
//文件拷貝
while(ret)
{
ret=read(from_fd,buffer,BUFFER_SIZE);
if(ret==-1)
{
printf("read
Error\n");
exit(1);
}
write(to_fd,buffer,ret);//寫入文件
file_len-=ret;
bzero(buffer,BUFFER_SIZE);//清空緩存區(qū)
}
printf("there are
%d byte(s)data left without copy\n",file_len);
close(from_fd);
close(to_fd);
exit(0);
}