注意:我问了一个类似的问题,但是这个问题被“暂停”,因为我没有提供我的代码(我猜)。现在我也编写了我的代码,但我还面临其他一些问题。
从我的.bench
文件中,我必须阅读我设法做的brakects ()
中写的值。但问题是我已经在INPUT
,OUTPUT
,NAND
之后阅读了行车中的值。
.bench file
INPUT(1)
INPUT(2)
INPUT(3)
INPUT(6)
INPUT(7)
OUTPUT(22)
OUTPUT(23)
10 = NAND(1, 3)
11 = NAND(3, 6)
16 = NAND(2, 11)
19 = NAND(11, 7)
22 = NAND(10, 16)
23 = NAND(16, 19)
到目前为止,我已编写代码以在INPUT
,OUTPUT
和NAND
之后查找括号内的值,但可以看出我正在重复类似的行再次编码ana。 那么,我如何推广相同的代码,以便在OUTPUT
,NAND
之后找到代码。
int Circuit::readBenchFile(string filename) //read the benchfile and generate inputs, outputs and gates accordingly
{
//Reading the .bench file
ifstream input_file;
char * S = new char[filename.length() + 1];
std::strcpy(S,filename.c_str());
input_file.open(S);
if(input_file.fail())
{
cout << "Failed to open Bench file.\n";
return 1;
}
///////
string line;
string guard_str("#");
string input_str ("INPUT"), output_str ("OUTPUT"), nand_str("NAND");
while (getline( input_file, line ))
{
std::size_t guard_found = line.find(guard_str);
if (guard_found ==std::string::npos)
{
///Input
std::size_t found = line.find(input_str);
if (found!=std::string::npos)
{
found = line.find_first_of('(', found + 1);
//Getting our input name and printing it.
string out = line.substr( found + 1, ( line.find_first_of(')', found) - found - 1) );
std::cout << out << std::endl;
}
///Output
std::size_t found1 = line.find(output_str);
if (found1!=std::string::npos)
{
found1 = line.find_first_of('(', found1 + 1);
//Getting our input name and printing it.
string out = line.substr( found1 + 1, ( line.find_first_of(')', found1) - found1 - 1) );
std::cout << out << std::endl;
}
///NAND
std::size_t found_2 = line.find(nand_str);
if (found_2!=std::string::npos)
{
found_2 = line.find_first_of('(', found_2 + 1);
//find first input
string first_input = line.substr( found_2 + 1, ( line.find_first_of(',', found_2) - found_2 - 1) );
//Second input
found_2 = line.find_first_of(',', found_2 + 2);
string second_input = line.substr( found_2 + 1, ( line.find_first_of(')', found_2) - found_2 - 1) );
cout<<"\nInputs to NAND gate are: "<<( first_input + string(" & ") + second_input );
}
}
}
}
答案 0 :(得分:0)
我想最好的方法是使用正则表达式。好的选择是使用Boost Regex库:http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/index.html。
如果您不熟悉正则表达式,这里有一个很棒的页面,可以让您快速入门:http://www.regular-expressions.info/。主页上的第一段将为您提供想法。
简而言之:正则表达式可以快速查找文本中的模式。您可以根据它快速构建正则表达式和函数,如果找到您要查找的任何单词,则返回true。
答案 1 :(得分:0)
如果您正在寻找通用性,我建议使用boost :: split。
vector<string> result;
vector<string> value2;
vector<string> nand_case;
boost::split(result , myline, boost::is_any_of("("));
boost::split(value2, result[1], boost::is_any_of(")"));
if (result[0].find("NAND") != string::pos)
boost::split(nand_case, value2[0], boost::is_any_of(",");
将为您提供INPUT(23):
result[0] : INPUT
result[1] : 23)
value2[0] : 23
将为您提供OUTPUT(18):
result[0] : OUTPUT
result[1] : 18)
value2[0] : 18
会给你23 = NAND(16,19):
result[0] : 23 = NAND
result[1] : 16, 19)
value2[0] : 16, 19
nand_case[0] : 16
nand_case[1] : 19
希望我理解正确,这可以提供帮助。