|
好久没上工大后院了,最近看了看C++的书,又在此浏览了不少有关C的贴子,就想起自己写的一个小程序.所以贴出来,顺便给初学者参考参考.
会DOS的人对COPY这个复制文件的命令一定不陌生,我用C++写了个相似的程序.
先贴出代码:
/*
************************************
仿制DOS下COPY命令的程序
************************************
*/
#include<fstream>
#include<iostream>
#include<cstdlib>
using namespace std;
void print_error(const char*,const char* =" "); //出错时的函数
bool equals(char *,char *); //比较字符串是否相等
char lastIndex(char *); //取得字符串的最后字符
int main(int argc,char *argv[]){
const int LEN=1024;
char ch[LEN]; //使用数组缓存
if(3!=argc)print_error("usage:cp source dest"); //输入参数提示
if(equals(argv[1],argv[2]))print_error("usage:the source can't be the dest"); //防止复制源文件与目标文件相同
ifstream in(argv[1],ios::binary); //将文件作二进制处理
if(!in)
print_error("Can't open",argv[1]);
if(lastIndex(argv[2])=='\\'||lastIndex(argv[2])=='/'||lastIndex(argv[2])==':') //这个是为了目标输入处理如:"C:"或"C:\"
{
char *filename;
if(lastIndex(argv[2])==':'){
char *ff=argv[2];
char *f=strcat(ff,"\\"); //用strcat连接字符串成完整文件名
filename=strcat(f,argv[1]);
}
else
filename=strcat(argv[2],argv[1]);
ofstream out(filename,ios::binary);
if(!out)
print_error("Can't open ",filename);
while(in.read(ch,LEN))out.write(ch,LEN);//这个一边读一边写,看上去很自然,但我认为关键在下面的处理
char *s=ch;
int ii=in.gcount(); //in.gcount()取得最后一次读的字节数
int i=0;
for(;i<ii;i++)out.put(s);//用put函数一个一个写入
if(!in.eof())
print_error("something wrong!");
cout<<"成功复制了一个文件: "<<filename<<endl;
}
else
{
ofstream out(argv[2],ios::binary);
if(!out)
print_error("Can't open ",argv[2]);
while(in.read(ch,LEN))out.write(ch,LEN);
int ii=in.gcount();
char *s=ch;
int i=0;
for(;i<ii;i++)out.put(s);
if(!in.eof())
print_error("something wrong!");
cout<<"成功复制了一个文件: "<<argv[2]<<endl;
}
return 0;
}
void print_error(const char*p,const char *p2){
cerr<<p<<' '<<p2<<'\n';
exit(1);
}
bool equals(char *a,char *b)
{
if(strcmp(a,b)==0)return 1;
return 0;
}
char lastIndex(char *a)
{
return a[strlen(a)-1];
}
刚开始时,我只写了 while(in.read(ch,LEN))out.write(ch,LEN); 以为就可以了.其实最后一次读的字节并无写入,才有了下面的处理.
我试过这样处理:
while(in.read(ch,LEN))out.write(ch,LEN);
char* p=ch;
for(int i=0;*p!='\0';p++)out.put(p);
开始测试没问题,后来发现有时文本文件后面会出现一两个不正常字符.
当我发现有gcount()这个方法,高兴到不得了.解决了一切问题.我试过复制1K和1G的文件,很正常,包括速度和质量.
如果只用put,get就不用想这么多了,只是速度方面不好,读一个写一个是最没办法的办法啦! |
|