superkamiu 发表于 2005-12-26 11:47

求用C写一个拷贝命令,版主看你的了!

 版主老大啊,麻烦您用C写一个文件拷贝程序给小弟看一下啊!我是学C的,C++我看不懂啊1谢谢了!

hjack 发表于 2005-12-26 14:06

简单写了一个.大家别见笑.有什么好的方法也可以讨论一下.呵呵
对于文件存在与否没有作判断,目的是为了程序简洁.
在VC.NET里编译通过.但使用的是C函数.
/*copy.cpp file */
#include <stdio.h>
#define BUFFER 4096

int main(int argc, _TCHAR* argv[])
        FILE *in,*out;
        if( (in=fopen(argv,"rb"))==NULL ){
                printf("in error");
                exit(1);
        }
        if( (out=fopen(argv,"wb"))==NULL ){
                printf("out error");
                if( in!=NULL ){
                        fclose(in);
                }
                exit(1);
        }

        unsigned char buffer;
        long size;
        do{
                size = fread(buffer,1,BUFFER,in);
                fwrite(buffer,1,size,out);
        }while( size==BUFFER );
        printf("copy finish");
        fclose(in);
        fclose(out);
        return 0;
}

[ Last edited by hjack on 2005-12-26 at 14:11 ]

hjack 发表于 2005-12-26 14:09

在命令行进入copy.exe所在目录,
输入
copy.exe sourcefile targetfile

就可以了.
复制完成后会输出copy finish

注意,命令是copy.exe,不能是copy,
因为copy是系统的复制命令.

powerwind 发表于 2005-12-26 16:18

版主老大,你写的是VC.NET下编译通过.可能楼主不太中意哦!

我稍作改改,你不会介意的!
在TC下编译通过


/*cp.c file */
#include <stdio.h>
int main(int argc,char* argv[])
{   
    FILE *src,*dest;
    char ch;
        if(argc!=3){printf("usage:cp sour dest");return 1;}
        if ((src=fopen(argv,"rb"))==NULL)
        {
       printf("error");
       return 1;
    }
    if ((dest=fopen(argv,"wb"))==NULL)
        {
       printf("error");
       return 1;
    }
        while((ch=getc(src))!=-1)putc(ch,dest);
        printf("ok");
        return 0;

}

hjack 发表于 2005-12-26 17:57

呵呵.

不知楼上的程序对于二进制文件的复制行不行??

我那个我试过复试300M的rmvb文件.还有图片,mp3等.没有出错..

powerwind 发表于 2005-12-26 18:30

哦,不行

superkamiu 发表于 2005-12-26 21:12

哇塞!高手就是高手啊,有效率啊!可是版主啊,还有powerwind啊,我想做一个带格式的命令啊,其格式为:filecopy filename1 filename2   (用TC实现)
我是一个菜鸟,我还有一个问题说是,像filename这样的命令,要想它有一个固定要格式,怎么做呢,请各位可以详细说明一下吗,最后是各位的亲身体会!再一次谢谢!

superkamiu 发表于 2005-12-26 21:53

版主啊,不好意思啊,我很菜的,小弟用的是TC,我把您的代码复制进去运行时出错,我是怎么调试也不行,能不能像powerwind大哥一样,用TC写一个啊,呵呵,谢谢了!

powerwind 发表于 2005-12-26 22:20

盗版版主的给你

#include <stdio.h>
#define BUFFER 4096

int main(int argc,char* argv[])
{   
    FILE *src,*dest;
    unsigned char buffer;
      long size;
      if(argc!=3){printf("usage:cp sour dest");return 1;}
      if ((src=fopen(argv,"rb"))==NULL)
      {
       printf("error");
       return 1;
    }
    if ((dest=fopen(argv,"wb"))==NULL)
      {
       printf("error");
       return 1;
    }
      
      do{
                size = fread(buffer,1,BUFFER,src);
                fwrite(buffer,1,size,dest);
      }while( size==BUFFER );
      printf("copy finish");
      fclose(src);
      fclose(dest);
      printf("ok");
      return 0;

}

[ Last edited by powerwind on 2005-12-26 at 23:24 ]

hjack 发表于 2005-12-26 22:20

把你的错误说说.

最好把你的调试过程也说说.

我想了解一下你是怎样调试的.

hjack 发表于 2005-12-26 22:58

我知道 你是什么错了.

因为在c里,变量的定义要放在函数的头部,

哎...

superkamiu 发表于 2005-12-27 11:57

呵呵,谢谢两位啊,经过昨天一天的努力,已经有很多的收获了,程序也看得懂了(呵呵,准确地说是似懂非懂的那种),可还是有两个白痴问题想问:
1 BUFFER的值为什么是4096,它是怎么确定的,可以是其它值吗?
2 return时的值1和0有什么不同吗?都是1或者都是0可以吗?如果不可以,会有什么不同的效果啊?
    小弟真的不懂,但我是真的想把它弄清楚!请各位高手发言,鼓掌..............

powerwind 发表于 2005-12-27 12:29

BUFFER值是数组长度,也就是缓冲区大小.可大可小.
return 0在main函数中是正常退出,其它值就不是正常退出了。
这样做是为了告诉系统,这个程序是不是正常退出的。

你在命令提示符下输入
echo%ErrorLevel%应该可以看到一个0
有兴趣可到百度找找,看看相关知识。
页: [1]
查看完整版本: 求用C写一个拷贝命令,版主看你的了!