2017-02-07 88 views
-2

我正在寫一個程序,它從文本文件(C++代碼)中獲取輸入並將其修改爲在文本文件(html)中輸出。該程序需要從標準輸入讀取並寫入標準輸出。它使用命令行參數-i文件名輸入和-o文件名輸出以及shell輸入/輸出重定向。我對Linux相當陌生,不確定如何以有效的方式做到這一點。這是我到目前爲止:打開文件的I/O和使用命令行重定向

#include <fstream> 
#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <string.h> 
#include <string> 

using namespace std; 

int main(int argc, char * argv[]) { 
    vector<string> mod; 
    int modNum = 0; 
    int i = 1; 
    string input = ""; 
    string inFilename = ""; 
    string outFilename = ""; 
    ifstream inFile; 
    ofstream outFile; 

    while(i < argc){ 
     if (strcmp(argv[i],"-i") == 0) { 
       i++; 
       if (i<argc){ 
        inFilename = argv[i]; 
       } else { 
        cout << "\t-i require a filename for input" << endl; 
       } 
       i++;     
     } else if (strcmp(argv[i],"-o") == 0) { 
       i++; 
       if (i<argc){ 
        outFilename = argv[i]; 
       } else { 
        cout << "\t-i require a filename for output" << endl; 
       } 
       i++; 
     } 
    } 
    if (inFilename != "") { 
     inFile.open(inFilename.c_str()); 
    }  
    if (outFilename != "") { 
     outFile.open(outFilename.c_str()); 
    }  
    if (inFile.is_open() and outFile.is_open()) { 
     outFile << "<script src=\"https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js\"></script>" << endl; 
     outFile << "<pre class=\"prettyprint\">" << endl; 
     while (!inFile.eof()) { 
      getline(inFile, input); 
      outFile << input << endl;    
     } 
     outFile << "</pre>"; 
    } else { 
     cout << "<script src=\"https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js\"></script>" << endl; 
     cout << "<pre class=\"prettyprint\">" << endl; 
     while (cin) { 
      if (getline(cin,input)) { 
       cout << input << endl; 
      } 
     } 
     cout << "</pre>"; 
    } 
    inFile.close(); 
    outFile.close(); 
} 

我遇到的問題是沒有這種方法的多功能性。如果我得到

./c < code.cpp -o page.html 

./c -i code.cpp > page.html 

程序將無法正常執行。我道歉,如果有任何小錯誤,我複製並粘貼代碼塊只顯示必需品。該程序將做更多,但現在我只是想讓輸入/輸出正常工作。

回答

0

好,到目前爲止,你已經處理只有兩個四例運行的程序:你的代碼假定如果-i-o指定的,那麼它從輸入文件和打印輸出文件讀取,否則讀取從輸入和寫入到輸出。所以,當然,你的程序不能讀取文件並寫入標準輸出(反之亦然) - 代碼只是不在這裏。

我建議你在一個單獨的函數中提取處理文件的代碼,它需要istream& inputostream& output作爲參數以避免代碼重複。你會用不同的參數來調用它,這取決於你所遇到的四種情況,是這樣的:

process_file(inFile.is_open() ? inFile : cin, outFile.is_open() ? outFile : cout); 

這將讓你進一步糾正代碼,但它仍然不理想。我建議去codereview網站獲得更多的反饋。

+0

感謝您的回覆。我沒有把代碼放在每一個案例中,因爲它會非常草率,我知道我應該使用一個函數來處理,但即使在研究並試圖找到類似的程序之後,我也找不到一個有效的方法去處理它。你的回答更清晰,對我來說很合理,我會試試看。 – andyb

相關問題