C++ 讀寫檔,可能會使用命令列引數給予檔名,也就是 argv 變數:
什麼意思呢?
以下舉個例子。
假設我們要寫一個程式,讀入檔案並將檔案內容加上行號。
我會這樣寫:
執行方法:
將 input.txt 當作輸入,直接輸出結果在螢幕上:(假設主程式名稱為 main )
./main hex < input.txt
將 input.txt 當作輸入,將結果輸出在 output.txt 內:
./main hex < input.txt > output.txt
上述程式碼,argv 用來設定行數格式(16進位或10進位),檔案 IO 採用資料流重導向。
這種 coding style 的優點是,可用其他程式的輸出,當作我們設計的程式輸入,例如用 pipe 管線的執行方法,把程式 A 的執行結果餵給程式 B:
程式 A | 程式 B
Reference
資料流重導向
管線
int main(int argc, char **argv) { ifstream inputFile(argv[1]); ofstream outputFile(argv[2]); // processing ... outputFile.close(); inputFile.close(); return 0; }而我認為良好的習慣是:採用 cin 和 cout 來做檔案輸出入導向,命令列引數 argv 則用來給予設定。
什麼意思呢?
以下舉個例子。
假設我們要寫一個程式,讀入檔案並將檔案內容加上行號。
我會這樣寫:
// main.cpp int main(int argc, char** argv) { if(argc != 2) { cerr << " Argument error." << endl; exit(-1); } string line; int lineNum = 0; while(getline(cin, line)) { if(strcmp(argv[1], "hex") == 0) cout << std::hex << lineNum << " " << line << endl; else if(strcmp(argv[1], "dec") == 0) cout << std::dec << lineNum << " " << line << endl; else cout << line << endl; lineNum++; } return 0; }
執行方法:
將 input.txt 當作輸入,直接輸出結果在螢幕上:(假設主程式名稱為 main )
./main hex < input.txt
將 input.txt 當作輸入,將結果輸出在 output.txt 內:
./main hex < input.txt > output.txt
上述程式碼,argv 用來設定行數格式(16進位或10進位),檔案 IO 採用資料流重導向。
這種 coding style 的優點是,可用其他程式的輸出,當作我們設計的程式輸入,例如用 pipe 管線的執行方法,把程式 A 的執行結果餵給程式 B:
程式 A | 程式 B
Reference
資料流重導向
管線
留言
張貼留言