荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店