在命令列中加引數的檔案複製程式
這篇博文介紹使用命令列引數的程式設計方法,載體是用於檔案複製的程式。這也是我用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;
}