在命令行中加参数的文件复制程序

这篇博文介绍使用命令行参数的编程方法,载体是用于文件复制的程序。这也是我用Markdown编辑器写的第一篇博文。Markdown在写《逆袭大学》时用过,写博文是第一次。

本文正文:

引子

下面的程序,可以完成由a.txt到b.txt的复制。

#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
    char ch;
    ifstream infile("a.txt",ios::in);
    ofstream outfile("b.txt.dat");
    while(infile.get(ch))
        outfile.put(ch);
    infile.close( );
    outfile.close();
}

这个程序美中不足的是,要复制别的文件,只能告诉用户:“你自己改一改程序去吧。”天,小程同学,你真想失业了。
可以采取的做法,程序运行中让用户输入文件名。如运行中,提示:“请输入源文件:”输入a.txt或别的,再提示:“请输入目标文件:”,输入b.txt或别的,一个能满足需求的“文件复制器”完工了。

使用命令行

下面介绍一种在命令行世界中广泛使用的加参数的做法,这是一直想为弟子们见空就要介绍的内容。
我们的目标是:

运行:D:\CB\cpy>cpy source.c temp.c
结果:复制source.c,产生新文件temp.c

做法

建项目 cpy(你也可以建立其他的项目名,最后要生成对应的.exe可执行文件)
程序用中带参数的main函数:int main(int argc, char *argv[]);

其中:

  • int argc; //命令行由几部分构成
  • char *argv[]; //指针数组,指向各部分的字符串

如运行

cpy source.c temp.c

参数argc和argv分别如下图:
在命令行中加参数的文件复制程序

这样,可以编出如下的程序:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
    char ch;
    if( argc < 3)
    {
        cerr<<"you must provide the source and target file.\n";
        exit(1);
    }
    ifstream infile(argv[1],ios::in);
    ofstream outfile(argv[2], ios::out);
    while(infile.get(ch))
        outfile.put(ch);
    infile.close( );
    outfile.close();
}

在编译、连接之后,找到产生的.exe文件,就可以用命令行的形式,完成文件的复制了。

拓展

提一个问题,如果用

cpy a.txt b.txt …. x.txt

形式,要将将多个文件的内容合并到x.txt中,该如何去做?
发现这里要合并的文件数目不确定,这是解决问题中最关键的问题。
实际上,只要输入了命令行,文件数目是确定的。
命令行一共给了argc个参数,源文件一共有argc-2个,分别是argv[1]到argv[argc-2],目标文件是argv[argc-1],构造一个循环就可以完成这项目任务。
得到的程序是:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
    char ch;
    if( argc < 3)
    {
        cerr<<"至少要提供2个文件名.\n";
        exit(1);
    }
    ofstream outfile(argv[argc-1], ios::out);
    ifstream infile;
    int i;
    for(i=1; i<=argc-2; ++i)
    {
        infile.open(argv[i],ios::in);  //打开源文件
        while(infile.get(ch))          //完成复制
            outfile.put(ch);
        infile.close( );               //关闭文件,循环回去后再打开另一个
    }
    outfile.close();
    return 0;
}
上一篇:SQLServer 2008以上误操作数据库恢复方法——日志尾部备份


下一篇:框计算:你所不知道的三件事 推荐