gpt4 book ai didi

c++ - 从文件中读取字符串格式的信息

转载 作者:行者123 更新时间:2023-11-28 06:52:44 24 4
gpt4 key购买 nike

我正在尝试从文件中读取逻辑门名称及其输入。我得到了一个 .bench 文件,其中提供了有关门名称及其输入的信息。我在下面写了一段代码,如果信息以下列格式给出,它会给我完美的结果:

firstGate = NAND(inpA, inpB, inpC)
secGate = NAND(1, 2)
30 = NAND(A, B)

问题:但是,如果在 = 符号之前、, 之后或其他地方的“空白”发生变化,那么我的代码不起作用。为了例如,如果文件以下列格式给出,那么我将无法正确读取它

first=NAND(inpA, inpB, inpC) //no space before and after "="
sec = NAND(1,2) //no space after ","

我的第一种情况的代码如下:

int main(int argc, char* argv[])
{
//Reading the .bench file
ifstream input_file;
input_file.open("circuit.bench");
if(input_file.fail())
{
cout << "Failed to open Bench file.\n";
return 1;
}
///////

string line;
while (getline( input_file, line ))
{
///For NAND
size_t first_index_nand, second_index_nand;
string gate_name;

const string nand_str = "NAND(";
if ((first_index_nand = line.find(nand_str)) != string::npos)
{
gate_name = line.substr(0, first_index_nand - 3);
cout<<"\nGate name: "<<gate_name;

first_index_nand += nand_str.length() - 1;
cout<<"\nInput to this gate: ";
for (; first_index_nand != string::npos; first_index_nand = second_index_nand)
{
if ((second_index_nand = line.find_first_of(",)", first_index_nand)) != string::npos)
{
string input_name = line.substr(first_index_nand + 1, second_index_nand++ - first_index_nand - 1);
cout<<" "<<input_name;
}
}
}
cout<<"\n";
}

return 0;

}

查询:我应该如何修改我的代码,使其能够读取门的名称及其输入,而不管它们的位置 w.r.t 空格?

注意:我只能使用 C++ 代码及其库来处理这个问题。

最佳答案

第一个答案:永远不要自己编写手工解析器:-)

1) 为 lex、yacc、bison(还有很多……)等解析器使用代码生成器

2) 你可以获得对 expect 或 regexp 解析的支持

3) 查找序列化,例如升压::序列化。如果您修改写入器/读取器,则可以序列化为更复杂的格式,其中包含类似您的配置文件的内容。

如果你真的想写你自己的解析器,它大多建议写一个或多或少复杂的状态机。但这可以通过工具比手工更容易完成。

抱歉,我不会深入研究您的代码,但我的个人经验是,它以大量代码行结尾以获得真正的工作解析器。而且大部分代码不再可维护。所以我想建议您使用我提供的三个选项之一(或任何其他选项):-)

关于c++ - 从文件中读取字符串格式的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23609574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com