荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: [合集]怎样用c写一个程序,实现copy功能??
发信站: 荔园晨风BBS站 (Thu Jul  5 23:53:05 2001), 站内信件

BelongToSZ (永远属于SZ) 于Tue Jul  3 21:15:35 2001提到:

rt


Seal (尘封往事) 于Tue Jul  3 21:26:51 2001提到:

open a source file
and write a destine file



BelongToSZ (永远属于SZ) 于Tue Jul  3 21:40:14 2001提到:

可以直接点吗?


wayman (wayman) 于Tue Jul  3 22:24:43 2001提到:

已经最直接的了,建议你看一下有关文件操作的章节



Exing (不是靓仔) 于Tue Jul  3 22:33:27 2001提到:

 老师不是讲过吗?


BelongToSZ (永远属于SZ) 于Tue Jul  3 22:50:54 2001提到:

没有啊
打开文件再写入谁都想到啦,只是实现太麻烦


lvyou (让我生命再等候) 于Tue Jul  3 23:16:15 2001提到:

#include<stdio.h>
void main(int argc,char *argv[])

{
        FILE *in,*out;
        char ch;
        if (argc!=3)
        {
                printf("\nError!");return;
        }
        if((in=fopen(argv[1],"rb"))==NULL)
        {
                printf("can't open source file/n");
                return;
        }
        if((out=fopen(argv[2],"wb"))==NULL) return;
        while(!feof(in))
        {
                ch=getc(in);
                putc(ch,out);
        }
        fclose(in);
        fclose(out);
}


outlook (不伤心) 于Tue Jul  3 23:40:01 2001提到:

不是吧,用getc()???
深大学子太神奇了,copy蜗牛版

错误逻辑上也不对,目标文件打不开直接return,不close(sr)

忍不住~~~



SDU (纳兰容若) 于Wed Jul  4 00:01:50 2001提到:


        哈哈哈......



Liulang (流浪) 于Wed Jul  4 00:04:50 2001提到:

还笑,好像你不是深大的,我看了是什么都没说



jek (转弯) 于Wed Jul  4 07:56:02 2001提到:

既然你这么有意见何不动手改改看?



tang (独孤九剑) 于Wed Jul  4 08:20:08 2001提到:

用C++可以这样(好像能简单点):
#include <iostream>
#include <fstream>?
int main(int argc, char * argv[])
{
        using namespace std;
        if (argc < 3)
        {
                cout<<"usage:"<<argv[0]<<" <dest> <src> "<<endl;
                return 0;
        }

        ifstream  src(argv[2]);
        ofstream  dest(arv[1]); //实际应该判断是否需要打开输出文件
        if ( src && dest && dest<<src.rdbuf() )
        //前面是测试文件打开情况,后面是直接把源缓冲输出,直到源文件结束
        {
                cout<<"copy "<<argv[2]<<" to "<<argv[1]<<endl;
                return 0;
        }else
        {
                cout<<"copy failed"<<endl; //错误信息提示,查手册写吧
                return 1;
        }

        return 0;
}
拷贝实际就一行,其他都是提示信息输出,如果再给出具体什么错误就更烦了。
有时候写程序主要工作是考虑各种错误,实际功能部分可以很简单。


Second (石开) 于Wed Jul  4 11:38:29 2001提到:

你试试这个吧,以前学C的时候摹仿另一个程序在TC2写的。
是对Copy的加强,交互性好了一些。不过很一般的了,小技巧。嘻嘻嘻。
见笑了。

#include<stdio.h>
#include<alloc.h>
#include<dir.h>
#include<string.h>
#include<io.h>
#include<conio.h>
#include<process.h>
#include<ctype.h>
void copy(void)
void copyaction(void);
int bufcopy(char fromname[13],char toname[MAXPATH]);

char searchstr[MAXPATH],newpath[MAXPATH],newname[MAXPATH],drive[MAXPATH],
     subdir[MAXPATH],pathname[MAXPATH],file[MAXFILE],ext[MAXEXT],
     oldname[MAXPATH];
int done,count,problem,answer;
unsigned char *buffer;

struct ffblk dta;

main(int argc,char *argv[])
{
  buffer=(unsigned char*) calloc(32767,1);
  if(buffer==NULL)
  {
    printf("\nNot enough memory to run this program.");
    printf("\nmenory resident programs and try again.\n");
    exit(1);
  }

  if (argc >2)
     {
      strcpy(searchstr,argv[1]);
      fnsplit(seachstr,drive,subdir,file,ext);
      sprintf(pathname,"%s%s",drive,subdir);
      strcpy(newpath,argv[2]);

      count=strlen(newpath);
      if(newpath[count-1] != 92)
        {
         newpath[count]=92;
         newpath[count+1]=0;
        }
      }
   else
      {
        printf("Usage:Xiucopy [filespec topath]\n");
        free(buffer);
         exit(2);
      }

   copy();
   free(buffer);
   return(0);
}

void copy(void)
{
    count=0;
    done=findfirst(searchstr, &dta,47);
    if(!done)
      printf("\npress Y to copy or N to Skip.ESC quits:\n\n");

    while(!done)
     {
      strcpy(oldname,pathname);
      strcat(oldname,dta.ff_name);
      strupr(oldname);

      strcpy(newname,newpath);
      strcat(newname,dta.ff_name);
      strupr(newname);

      copyaction();
      done=findnext(&dta);
      }

   if(count>0)
       printf("\nNumber of files copied: %3d\n",count);
   else
       printf("\nNo files copied.\n");
}

void copyaction(void)
{
  printf("   Copy %-12s   ?",oldname);
  answer = toupper(getch());

  if(answer =='Y')
      {
       printf("Yes");
       problem=bufcopy(oldname,newname);
       if(!problem)
         {
          printf("- copied to %s.\n",newname);
          count++;
         }
       else
          printf("- not copied . ERROR!\n");
        }
   else
      if (answer ==27)
         {
          printf("\n");
          exit(1);
         }
      else
         printf("No\n");
}

int bufcopy ( char fromname[MAXPATH],char toname[MAXPATH])
{
  long size,numread,filepos;
  int numtoget;
  FILE *fromfile,*tofile;
  int inhandle, outhandle;

   fromfile=fopen(fromname,"r");
   tofile = fopen(toname,"w");
   if((tofile==NULL) ||(fromfile==NULL))
     return(1);
   inhandle=filelength(inhandle);

   if(size<=32767)
     numtoget =size;
   else
     numtoget =32767;

   numread=0;

  do {
     filepos=ftell(fromfile);
     fseek(tofile,filepos,0);
     _write(outhandle,buffer,numtoget);
    if((numread+numtoget)>size)
        numtoget=size-numread;
  }while(numtoget !=0);
  fclose(fromfile);
  fclose(tofile);
  return(0);
}



woodman (风潇潇兮易水寒..) 于Wed Jul  4 11:40:53 2001提到:

其实他说的又不是没有道理,我们的水平是差了点,
不信大家去清华的bbs逛逛,看看人家在说什么,
看看我们在说什么,不是我有意贬低我们自己,不如人
就是不如人,没什么不好意思的,最不好意思的是不知道
自己不如人

                      ---悲观的垃圾



Seal (尘封往事) 于Wed Jul  4 11:47:17 2001提到:

so trouble


Second (石开) 于Wed Jul  4 11:49:28 2001提到:

人家也没说什么呀,什么“不知道自己不如人?".
自己只要好好干就是了。


Second (石开) 于Wed Jul  4 12:00:51 2001提到:

easy one,copy from book.

#include <stdio.h>

main(int argc,char * argv[])
{
   if(argc!_3)
     printf("\n\nFORMAT:MYCOPY <source> <destin> \n\n");
   else
   {
      FILE *source, *destin;

      source=fopen(argv[1],"rb");
      destin=fopen(argv[2],"wb");
      if(source==NULL)
        printf("ERROR:Can't open source file %s! \n",argv[1]);
      else if (destin==NULL)
        printf("ERROR:Can't open destin file %s! \n",argv[2]);
      else
      {
          while(! feof(source))
            fputc(fgetc(source),destin);
      }
      fclose(source);
      fclose(destin);
   }
}



Trunk (Trunk) 于Wed Jul  4 12:26:06 2001提到:

  呵呵, 还是蜗牛版 ......

  当对大文件操作时, 你就会感到效率的底下,

  要尽量减少 IO 的次数, 一定要用 fgetc().....?



tang (独孤九剑) 于Wed Jul  4 12:35:19 2001提到:

fputc和fgetc都有缓存的,差不多了,有操作系统在下面撑着,你一块
拷贝跟一个一个拷贝没什么两样的,一块的话循环在操作系统或库里做,
一个一个拷的话循环你自己做,最后都是操作系统根据设备的特点是要
一块传输的还是一块传输,是要一个一个字节摆弄的还是要一个一个字
节慢慢传,所以慢不到哪里去的。

但最好还是用块操作的方法,主要考虑你的程序将来要在高性能计算机
上运行,操作系统或库函数可能直接使用这种计算机的高性能指令不做
循环。呵呵。


Second (石开) 于Wed Jul  4 13:58:26 2001提到:

前面一个长一些的程序就是用到缓冲和块读写的.
fputc和fgetc都有缓存的,差不多了,有操作系统在下面撑着,你一块
拷贝跟一个一个拷贝没什么两样的,一块的话循环在操作系统或库里做,
一个一个拷的话循环你自己做,最后都是操作系统根据设备的特点是要
一块传输的还是一块传输,是要一个一个字节摆弄的还是要一个一个字
节慢慢传,所以慢不到哪里去的。

但最好还是用块操作的方法,主要考虑你的程序将来要在高性能计算机
上运行,操作系统或库函数可能直接使用这种计算机的高性能指令不做
循环。呵呵。


outlook (不伤心) 于Wed Jul  4 19:26:12 2001提到:

这个更依赖操作系统喏:
include windows.h
use CopyFile() function

不要小气吗,我只是忍不住写两句,学生吗,受点小气才好长大~~~

呵呵



Seal (尘封往事) 于Wed Jul  4 19:31:57 2001提到:

hehe,都没事干


woodman (风潇潇兮易水寒..) 于Wed Jul  4 20:16:53 2001提到:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
outlook,说吧,我支持你,我希望这里有高手来指导我们


tang (独孤九剑) 于Wed Jul  4 23:19:30 2001提到:

????呵呵,我都老得不行了,已经不是学生了!

只是无所事事,灌点水而已。写着玩,Windows下用CopyFile的确方便,
别人都写好了自己还写来干吗?不过,我有个原则:不到迫不得已的时
候不用操作系统相关的东西,所以我通常只用ANSI C++的东西,偶尔用
一下ANSI C(现在该叫ISO C++/ISO C了吧,呵呵),最后用POSIX标准
(或Spec 1170标准)操作系统规范的东西,再不行了就只好用UNIX或
Windows相关的东西了。

反正是灌水,正常情况下都不会自己去写文件拷贝的,就玩玩用C++写拷贝,
用我所以为的STL的精髓可以这样玩:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>
int main(int argc, char** argv)
{
    using namespace std;
    if (argc < 3)
    {
        cout<<"usage:"<<argv[0]<<" <src> <dest> "<<endl;
        return 1;
    }

    ofstream dest(argv[2]);
    ifstream src(argv[1]);
    istreambuf_iterator<char> in(src);   //输入流缓冲iterator
    istreambuf_iterator<char> eof;       //缺省构造一个end iterator
    ostreambuf_iterator<char> out(dest); //输出流缓冲iterator
    copy(in, eof, out);                  //这是使用通用算法文件对文件拷贝

    //copy是标准类库中把区间[in, eof)拷贝到从out开始的区间里。

    return 0;
}
//用来玩的,正常文件拷到文件也没必要这么费劲,不过stream_iterator
//常常能把STL中用在容器的通用算法应用到文件中,copy是一个例子,还
//有大把现成的算法可以用,如要找文件中出现了几次program(program是
//指前后都用空格分隔的英文单词),只要:
istream_iterator<string> in(src);
count(in, eof, "program");

不灌了,写这么多有点费时间。呵呵……


Begin (一穷二白) 于Wed Jul  4 23:44:08 2001提到:

stl还刚了解一点,看不懂怎么办?


georgehill (有事要通知我) 于Thu Jul  5 00:28:18 2001提到:

     去死吧,你!


outlook (不伤心) 于Thu Jul  5 01:46:34 2001提到:


我不是说你,免于灌水才一并回。

我不是高手,
我现实主义,
我不会指点别人,
我不针对lovingyou,
我只是一时忍不住,
最多不出声喏......



tang (独孤九剑) 于Thu Jul  5 07:38:22 2001提到:

看书,练习去,练好了再教我,这段时间看来我又不会有多少时间弄这个了!呵呵。


tang (独孤九剑) 于Thu Jul  5 08:04:41 2001提到:

还说不是高手,现在各大BBS上高手都懒得说话。呵呵……


Chair (银发之walk straight) 于Thu Jul  5 12:49:47 2001提到:

 不对吧,APUE里写得很清楚,块操作明显比字节操作快,系统才不会
帮你做呢。看看以前的LINUX和BSD的FS测试就知道,区别太大了。
而且还有一个系统调用的问题,用FOR+字节操作的系统调用远多于
块操作。APUE有很详细的说明,建议大家去看看



tang (独孤九剑) 于Thu Jul  5 13:07:23 2001提到:

我是指当块操作时,操作系统可能会一个一个拷贝到它的文件缓冲区(
当然也可能用块内存拷贝指令),最后才根据设备特性把文件缓冲区写
到实际的介质。是指自己不做循环,下面还是要做的。
                                              ^^^^^^^^他用的不是系统调用吧?
他用的是C的流函数,C的库里对流都有缓冲(除非你打开文件的时候说明
不用缓冲),不会那么容易调用系统调用的,有时候为了让它调系统还要
特意使用flush函数。至于linux和BSD操作系统细节就不知道了,系统调
用那种环境切换带来的性能问题我没考虑到,也许这方面我搞错了,可能
跟我多用C++/C提供的库少用系统调用有关。呵呵……


lvyou (让我生命再等候) 于Thu Jul  5 13:12:00 2001提到:

         ~~~~~~~~~~~声明一下,我的ID Lvyou不是lovingyou的意思,
          而是根据我国古代伟大诗人陆游的谐音修改而来,用于激励
          自己时刻不忘报效祖国!Hoho!


matrix (Ich liebe dich 于Thu Jul  5 22:30:44 2001提到:

  这么伟大。你行呀你,呵呵


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店