易码技术论坛

 找回密码
 加入易码
搜索
查看: 756533|回复: 24

怎么写文件复制的程序

[复制链接]
发表于 2006-11-12 15:54:14 | 显示全部楼层
char data[1024];
void main(){
   char fp1,fp2;
   long len,tmp;
   fp1=fopen("/LAVA/a.lav","r");
   fp2=fopen("/b.lav","w");
   len=fseek(fp1,0,2);
   rewind(fp1);
   while(len){
      tmp=fread(data,1,1024,fp1);
      fwrite(data,1,tmp,fp2);
      len=len-tmp;
   }
   fclose(fp1);
   fclose(fp2);
}
现写的,不知道有没有错~~
 楼主| 发表于 2006-11-16 08:35:35 | 显示全部楼层
果然有错:
char data[1024];
void main(){
  char fp1,fp2;
  long len,tmp;
  fp1=fopem("/LAVA/a.lav","r");
  fp2=fopen("/b.lav","w");
  len=fseek(fp1,0,2);
  while(len){
     tmp=fread(data,1,1024,fp1);
     fwrite(data,1,tmp,fp2);
     len=len-tmp;
  }
  fclose(fp1);
  fclose(fp2);
}


不过非常感谢,我主要是想把sysdir里的文件复制出来...
发表于 2006-11-16 11:26:22 | 显示全部楼层
笔误啊
发表于 2006-11-16 11:43:09 | 显示全部楼层
是手误!
发表于 2006-11-16 11:47:28 | 显示全部楼层
咬文嚼字
发表于 2006-11-16 12:23:05 | 显示全部楼层
原来Lee的四千贴是这样灌出来的
发表于 2006-11-16 19:43:21 | 显示全部楼层
呵呵,抱歉啊~ *^-^*
就是fopen嘛,说实在的,还得感谢GG大哥,我原来写代码还没有那么简练的~~
发表于 2006-11-16 20:47:38 | 显示全部楼层
严肃点
俺可从来不知道啥是灌水
大家还是谈正事吧
发表于 2006-11-17 01:00:54 | 显示全部楼层
正事?什么正事啊?
发表于 2006-11-17 08:17:00 | 显示全部楼层
所谓正事,就是1楼提出的问题
不要离这个话题太远了
发表于 2006-11-18 15:47:13 | 显示全部楼层
引用第7楼starwing2006-11-16 19:43发表的“”:
就是fopen嘛,说实在的,还得感谢GG大哥,我原来写代码还没有那么简练的~~
哦?是说我么?
那个len是哪来的?
直接像下面这样就行了~~
for( tmp = 0; tmp != 1024; )
{
   tmp = fread( data, 1, 1024, fp1);
   fwrite( data, 1, tmp, fp2);
}
发表于 2006-11-18 17:17:57 | 显示全部楼层
……居然更强……
更崇拜GG大哥了……
收下了,今天又学到了一点~~~~强烈要求大哥发帖介绍一下代码优化的经验!!!

对了,没有len怎么显示进度啊?
发表于 2006-11-18 17:20:47 | 显示全部楼层
starwing:别坏了形象啊!
当tmp!=1024时文件就已经读完了你看不懂吗?
发表于 2006-11-18 17:24:48 | 显示全部楼层
知道啊,不过要是文件是1024的整数倍呢?多循环一遍还不知道fread是否会返回正常的值~~
我问的是,如果我还要显示一个进度条呢?还不是要一个len变量?
发表于 2006-11-18 17:33:19 | 显示全部楼层
返回所读的字节数,如遇文件结束或出错返回0
根据Lee的LavaX3。5。1的帮助文件里写的,这样的代码的确的最高效的,就是当文件是1024的整数倍时会多循环一遍~
还有,当显示进度条时,这样为了省一个变量的方法有一点得不偿失~
发表于 2006-11-18 17:46:53 | 显示全部楼层
就是fopen嘛,说实在的,还得感谢GG大哥,我原来写代码还没有那么简练的~~

哦?是说我么?
那个len是哪来的?
直接像下面这样就行了~~
for( tmp = 0; tmp != 1024; )
{
  tmp = fread( data, 1, 1024, fp1);
  fwrite( data, 1, tmp, fp2);
}
那个,GG怎么跟我一样粗心?应该是tmp==1024吧?
  1. char data[1024];
  2. void main(){
  3.   char fp1,fp2;
  4.   long tmp;
  5.   
  6.   fp1=fopen("a.bin","rb+");
  7.   fwrite(data,1,2048,fp1);
  8.   rewind(fp1);
  9.   fp2=fopen("b.bin","w");
  10.   
  11.   for( tmp = 0; tmp == 1024; ){
  12.     tmp = fread( data, 1, 1024, fp1);
  13.     fwrite( data, 1, tmp, fp2);
  14.     printf("%d\n",tmp);
  15.   }
  16.   fclose(fp1);
  17.   fclose(fp2);
  18.   printf("ok!");
  19.   getchar();
  20. }
复制代码
在LavaXIde 3.5.1上编译不通过啊
发表于 2006-11-18 17:48:25 | 显示全部楼层
嗯,看我怎么说话的,编译通过了,就是无法建立a.bin文件。只是生成了一个0b大小的b.bin文件~
发表于 2006-11-18 17:53:06 | 显示全部楼层
fwrite(data,1,2048,fp1);这句没问题吗?
发表于 2006-11-18 17:54:22 | 显示全部楼层
又改了程序
  1. char data[1024];
  2. void main(){
  3.   char fp1,fp2;
  4.   long tmp;
  5.   
  6.   fp1=fopen("a.bin","w");
  7.   fwrite(data,1,2048,fp1);
  8.   fclose(fp1);
  9.   
  10.   fp1=fopen("a.bin","r");
  11.   fp2=fopen("b.bin","w");
  12.   
  13.   for( tmp = 0; tmp != 1024; ){
  14.     tmp = fread( data, 1, 1024, fp1);
  15.     fwrite( data, 1, tmp, fp2);
  16.     printf("%d\n",tmp);
  17.   }
  18.   fclose(fp1);
  19.   fclose(fp2);
  20.   printf("ok!");
  21.   getchar();
  22. }
  23.   
复制代码
现在程序正常了,的确是tmp!=1024.Sorry~~~
但是复制时少复制了一块~~生成的a.bin有2KB,但是b.bin只有1KB~~
发表于 2006-11-18 17:58:07 | 显示全部楼层
不止一块,而是只复制了一块~~看来这个代码没有用~~还是用我的有Len那个版本吧
改了程序
  1. char data[1024];
  2. void main(){
  3.   char fp1,fp2;
  4.   long tmp;
  5.   
  6.   fp1=fopen("a.bin","w");
  7.   fwrite(data,1,4096,fp1);
  8.   fclose(fp1);
  9.   
  10.   fp1=fopen("a.bin","r");
  11.   fp2=fopen("b.bin","w");
  12.   
  13.   for( tmp = 0; tmp != 1024; ){
  14.     tmp = fread( data, 1, 1024, fp1);
  15.     fwrite( data, 1, tmp, fp2);
  16.     printf("%d\n",tmp);
  17.   }
  18.   fclose(fp1);
  19.   fclose(fp2);
  20.   printf("ok!");
  21.   getchar();
  22. }
  23.   
  24.   
复制代码
现在a.bin为4KB大,而b.bin只有1KB大
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-28 03:31 , Processed in 0.011116 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表