这篇博文介绍使用命令行参数的编程方法,载体是用于文件复制的程序。这也是我用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;
}