C++ 如何在特定位置[C+;+;]之前/之后从文本文件读取输入?

C++ 如何在特定位置[C+;+;]之前/之后从文本文件读取输入?,c++,text-parsing,C++,Text Parsing,在我的项目中,我需要从一个文本文件中获取有关电路的数据,然后我需要解析它并生成输出数据。 下面是文本文件的示例数据 AND1加法器1-3加法器1-4//表示AND1门从 加法器的第三个输出和第四个输出的第二个输入 AND 2加法器1-4加法器1-2 OR1和1-1和2-1//OR1的两个输入来自AND1的第一个输出和 AND2的第一个输出 现在我需要先阅读组件名称,这很简单: infile>>componentName; 但对于第二部分,我想我可以用多种方式来解释 读取整个数据并将

在我的项目中,我需要从一个文本文件中获取有关电路的数据,然后我需要解析它并生成输出数据。 下面是文本文件的示例数据

AND1加法器1-3加法器1-4//表示AND1门从 加法器的第三个输出和第四个输出的第二个输入

AND 2加法器1-4加法器1-2

OR1和1-1和2-1//OR1的两个输入来自AND1的第一个输出和 AND2的第一个输出

现在我需要先阅读组件名称,这很简单:

infile>>componentName;
但对于第二部分,我想我可以用多种方式来解释

  • 读取整个数据并将其分为两部分:组件名称- 输出
  • 一直读到“-”,并将其放入字符串变量中,然后读取 在“-”之后,将其放入整数变量,并对所有变量重复此操作 台词
  • 我尝试了第一种方法,但我确实坚持把字符串转换成整数(我尝试使用Stoi,但它只适用于C++)(并且也遇到了一些问题),但是我认为第二种方式会更容易,但我不知道如何去做。 你能帮我吗? 基本上,我需要将组件名称(在“-”之前)放入字符串变量,并将整数(在“-”之后)放入整数变量。


    注意:对不起,我的英语很差,不是母语。由于项目规模很大,我没有在上面添加不必要的代码。

    这是非常基本的,但应该让您开始。我更喜欢
    scanf
    系列来完成这些任务

    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    int main() {
    FILE *fp=fopen("tmpfile", "r");
    char oper[5], dev1[10], dev2[10];
    int op1, op2;
    fscanf(fp, "%s %[^-]-%d %[^-]-%d", oper, dev1, &op1, dev2, &op2);
    cout<<oper<<endl;
    cout<<dev1<<endl;
    cout<<op1<<endl;
    cout<<dev1<<endl;
    cout<<op2<<endl;
    fclose(fp);
    
    }
    

    您可以使用Boost.Spirit进行此解析任务。它允许您将结果直接解析为结构

    #include <iostream>
    #include <sstream>
    #include <string>
    
    #include <boost/fusion/adapted.hpp>
    #include <boost/spirit/home/x3.hpp>
    
    struct Entry
    {
        std::string op;
        std::string dev1;
        int n1;
        std::string dev2;
        int n2;
    };
    
    BOOST_FUSION_ADAPT_STRUCT(
        Entry,
        op,
        dev1, n1,
        dev2, n2)
    
    Entry parse(std::string const &input)
    {
        auto iter = input.begin();
    
        using namespace boost::spirit::x3;
    
        auto op = rule<class op, std::string>{}
        = lexeme[upper >> *(upper | digit)];
        auto dev = rule<class dev, std::string>{}
            = lexeme[upper >> *alnum];
    
        Entry result;
    
        bool r = phrase_parse(iter, input.end(),
                              op > dev > lit('-') > int_ > dev > lit('-') > int_,
                              space, result);
    
        if (!r)
        {
            std::string rest(iter, input.end());
            throw std::invalid_argument("Parsing failed at " + rest);
        }
    
        return result;
    }
    
    
    int main()
    {
        // This could be a file instead with std::ifstream
        std::istringstream input;
        input.str(
    "AND1 Adder1-3 Adder1-4 // Means AND1 gate gets its first input from Adder1's 3rd output and its second input from Adder1's 4th output\n"
    "AND2 Adder1-4 Adder1-2\n"
    "OR1 AND1-1 AND2-1 //OR1's two inputs are from AND1's 1st output and AND2's 1st output\n");
    
        for (std::string line; std::getline(input, line); )
        {
            Entry e = parse(line);
    
            std::cout << "Found the following entries:\n"
                      << "  Operation: " << e.op << "\n"
                      << "  Device 1: " << e.dev1 << "-" << e.n1 << "\n"
                      << "  Device 2: " << e.dev2 << "-" << e.n2 << "\n";
        }
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    结构条目
    {
    std::字符串op;
    std::字符串dev1;
    int-n1;
    std::stringdev2;
    int n2;
    };
    增强融合适应结构(
    进入
    op,
    dev1,n1,
    dev2,n2)
    条目解析(标准::字符串常量和输入)
    {
    auto iter=input.begin();
    使用名称空间boost::spirit::x3;
    自动操作=规则{}
    =词素[上>>*(上|位)];
    自动开发=规则{}
    =词素[上>>*alnum];
    报名结果;
    bool r=短语解析(iter,input.end(),
    op>dev>lit('-')>int_>dev>lit('-')>int,
    空间、结果);
    if(!r)
    {
    stringrest(iter,input.end());
    throw std::无效的_参数(“在“+rest”时解析失败);
    }
    返回结果;
    }
    int main()
    {
    //这可能是一个包含std::ifstream的文件
    std::istringstream输入;
    input.str(
    “AND1 ADER1-3 ADER1-4//表示AND1门从ADER1的第三个输出获取其第一个输入,从ADER1的第四个输出获取其第二个输入\n”
    “AND 2 ADER1-4 ADER1-2\n”
    “OR1和1-1和2-1//OR1的两个输入来自AND1的第一个输出和AND2的第一个输出\n”);
    for(std::string行;std::getline(输入,行);)
    {
    条目e=解析(行);
    
    std::cout@O'Neil嘿,我能问一下为什么要投否决票,这样我才能更好地编辑我的问题吗?你会被否决,因为你没有展示你尝试过的任何东西。特别是你说你尝试了一些不起作用的东西,但你没有展示你尝试过的东西。可能会被否决,因为那里没有真正的代码,也没有对错误的良好描述/您存在的问题。您可以通过包含重新创建错误/问题所需的最少代码来改进您的问题,并展示您正在做的事情。请展示您的问题。您应该至少包含一个大纲(但最好是一个大纲)对于您遇到问题的代码,我们可以尝试帮助您解决具体问题。您不需要插入为程序编写的所有内容—只需简单的
    main()。
    
    #include <iostream>
    #include <sstream>
    #include <string>
    
    #include <boost/fusion/adapted.hpp>
    #include <boost/spirit/home/x3.hpp>
    
    struct Entry
    {
        std::string op;
        std::string dev1;
        int n1;
        std::string dev2;
        int n2;
    };
    
    BOOST_FUSION_ADAPT_STRUCT(
        Entry,
        op,
        dev1, n1,
        dev2, n2)
    
    Entry parse(std::string const &input)
    {
        auto iter = input.begin();
    
        using namespace boost::spirit::x3;
    
        auto op = rule<class op, std::string>{}
        = lexeme[upper >> *(upper | digit)];
        auto dev = rule<class dev, std::string>{}
            = lexeme[upper >> *alnum];
    
        Entry result;
    
        bool r = phrase_parse(iter, input.end(),
                              op > dev > lit('-') > int_ > dev > lit('-') > int_,
                              space, result);
    
        if (!r)
        {
            std::string rest(iter, input.end());
            throw std::invalid_argument("Parsing failed at " + rest);
        }
    
        return result;
    }
    
    
    int main()
    {
        // This could be a file instead with std::ifstream
        std::istringstream input;
        input.str(
    "AND1 Adder1-3 Adder1-4 // Means AND1 gate gets its first input from Adder1's 3rd output and its second input from Adder1's 4th output\n"
    "AND2 Adder1-4 Adder1-2\n"
    "OR1 AND1-1 AND2-1 //OR1's two inputs are from AND1's 1st output and AND2's 1st output\n");
    
        for (std::string line; std::getline(input, line); )
        {
            Entry e = parse(line);
    
            std::cout << "Found the following entries:\n"
                      << "  Operation: " << e.op << "\n"
                      << "  Device 1: " << e.dev1 << "-" << e.n1 << "\n"
                      << "  Device 2: " << e.dev2 << "-" << e.n2 << "\n";
        }
    }