在文件中查找多个单词,然后提取这些单词后面的值?

时间:2014-04-24 09:48:52

标签: c++ string

注意:我问了一个类似的问题,但是这个问题被“暂停”,因为我没有提供我的代码(我猜)。现在我也编写了我的代码,但我还面临其他一些问题。

从我的.bench文件中,我必须阅读我设法做的brakects ()中写的值。但问题是我已经在INPUTOUTPUTNAND之后阅读了行车中的值。

.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)

到目前为止,我已编写代码以在INPUTOUTPUTNAND之后查找括号内的值,但可以看出我正在重复类似的行再次编码ana。 那么,我如何推广相同的代码,以便在OUTPUTNAND之后找到代码。

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 );

        }           
    }
}           


}

2 个答案:

答案 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

希望我理解正确,这可以提供帮助。