所以我需要一些關於如何很好地解析C++中的文本文件的想法。那我解析這些文件的格式如下:C++解析複雜文件,每行指定一個命令
Command_A list of arguments
Command_B list of arguments
etc etc
現在我使用ifstream的打開該文件,然後我有這個超長系列的if-else語句來確定要對每個做命令類型。這被證明是有點笨拙的(特別是因爲一些命令是用於解析其他文件的...所以我嵌套了if-elses和不同文件的多個ifstream)。
我正在尋找另一種方式來做到這一點,但我不確定什麼是最好的方法。我正在考慮使用std :: map,其中鍵是命令字符串,值是函數指針,但我不熟悉在映射中存儲函數指針(特別是如果不同的函數具有不同的返回類型等) 。
下面是我目前正在做的事情。我遍歷該文件並使用「getline」獲取當前行。然後我使用一個stringstream來解析命令。然後,我使用很長的if-elses列表來確定要調用哪個函數。文件中的每一行還帶有參數列表,所以我使用stringstream來解析這些參數,然後將這些參數傳遞給我調用的函數。
這裏的問題是雙重的
1)我有一個非常非常多的,如果-別人的(約50)
2)某些命令要求我來解析新文件,從而我必須在目前的ifstream內開闢另一個ifstream。 (請參閱command_c)
所以我正在尋找一種更簡單/更高效/更漂亮的方式來執行此操作。
/*Open file and verify validity*/
std::ifstream parseFile(filename.c_str());
if(!parseFile.good())
{
cerr<<"ERROR: File is either corrupt or does not exist."<<endl;
exit(1); //Terminate program
}
//Loop over file line by line
std::string line;
while(!parseFile.eof())
{
std::getline(parseFile, line);
std::stringstream ss;
std::string command;
ss.str(line);
ss >> command;
if(command == "COMMAND_A")
{
float x,y,z;
ss >> x >> y >> z;
FunctionA(x,y,z);
}
else if(command == "COMMAND_B")
{
float a,b,c,d,e,f;
ss >> a >> b >> c >> d >> e >> f;
FunctionB(a,b,c,d,e,f);
}
else if(command == "Command_C")
{
string nextFile;
ss >> nextFile;
ParseFile(nextFile); //This is not recursive...this is another function
}
else if(...)
{
...
}
// etc, etc (this continues on for a long time)
}
parseFile.close();
我想'STD :: getline'和'std:istringstream'將會大大減少你的代碼庫的聲音。 – WhozCraig
這就是我正在做的。對於程序的每一行,我都會執行「getline」,然後使用stringstream從行中解析命令。然後,我通過我的if-else循環爲該命令找到正確的操作。 – user1855952
你能告訴我們你的代碼嗎?它有助於說明問題。 :) – 0x499602D2