1. 程式人生 > >在命令列中加引數的檔案複製程式

在命令列中加引數的檔案複製程式

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