我正在编写一个从文本文件(c ++代码)获取输入的程序,并将其修改为文本文件(html)中的输出。该程序需要从标准输入读取并写入标准输出。它使用命令行参数-i filename作为输入,-o filename作为输出以及shell输入/输出重定向。我对Linux很新,不知道如何以高效的方式做到这一点。这是我到目前为止所得到的:
#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 :(得分:0)
好吧,到目前为止,您只处理了四个运行程序的案例中的两个:您的代码假定如果指定了 -i
和-o
,那么它会读取从输入文件和打印到输出文件,否则它从输入读取和写入输出。所以,当然,你的程序无法从文件中读取并写入标准输出(反之亦然) - 代码就是不在这里。
我建议您在单独的函数中提取处理文件的代码,该函数将istream& input
和ostream& output
作为参数来避免代码重复。您将使用不同的参数调用它,具体取决于您遇到的四种情况中的哪一种,例如:
process_file(inFile.is_open() ? inFile : cin, outFile.is_open() ? outFile : cout);
这将使您进一步纠正代码,但它仍然不理想。我建议您前往codereview网站获取更多反馈。