首页 > 解决方案 > c ++,从文件读取到结构然后再到向量(结构被推入向量太多次而不是一次)

问题描述

所以我们刚开始c++,我试图从一个文件中读取一个结构,然后把它推到一个向量中,但是它把同样的东西推了几倍……我做错了什么?

 void StreamToVector(vector<ChemicalForm>& Formulas, int CC, int HC, string 
Chemical){
    if (Formulas.size() == 0) {
        ChemicalForm Chem;
        Chem.C = CC;
        Chem.H = HC;
        Chem.ChemicalNames.push_back(Chemical);
        Formulas.push_back(Chem);
    }
    else {
        int count = 0;
        for (int i = 0; i < Formulas.size(); ++i) {
            if (Formulas[i].C == CC && Formulas[i].H == HC) {
                Formulas[i].ChemicalNames.push_back(Chemical);
                ++count;
            }
        if (count == 0) {
            ChemicalForm Chem;
            Chem.C = CC;
            Chem.H = HC;
            Chem.ChemicalNames.push_back(Chemical);
            Formulas.push_back(Chem);
        }

        }
    }

int main() {
    string File = OpenFile();
    ifstream ChemFile(File);
    vector<ChemicalForm> Formulas;
    string Chemical;
    int CC;
    int HC;
    char c;
    char h;
    while (ChemFile >> Chemical>> c >> CC>> h >>HC) {
        StreamToVector(Formulas, CC, HC, Chemical);
    }

我应该从这个文件中读取:

正丁烷 C4H10 丙炔 C3H3 1,3-丁二炔 C4H2 己烷 C6H14 丁烷 C4H10 异丁烷 C4H10 戊烷 C5H12

预期产量为: C3H3 丙炔 C4H2 1,3-丁二炔 C4H10 正丁烷 丁烷 异丁烷 C5H12 戊烷 C6H14 己烷

意思是,如果两种化学物质具有相同的配方,它们就会一起使用。我确定问题是最后一个 if 语句,但我不确定到底是什么。这是我得到的输出:

C3H10 正丁烷 丁烷 异丁烷 C4H3 丙炔 丙炔 C4H2 1,3-丁二炔 1,3-丁二炔 C4H2 1,3-丁二炔 1,3-丁二炔 C5H14 己烷 己烷 C5H14 己烷 己烷 C5H14 己烷 己烷 C5H14 己烷 己烷 C5H12 戊烷 戊烷 C5H12 戊烷戊烷 C5H12 戊烷 戊烷 C5H12 戊烷 戊烷 C6H12 戊烷 戊烷 C6H12 戊烷 戊烷 C6H12 戊烷 戊烷 C6H12 戊烷 戊烷

标签: c++vectorstruct

解决方案


您的代码的问题在于该else块:

else {
    int count = 0;
    for (int i = 0; i < Formulas.size(); ++i) {
        if (Formulas[i].C == CC && Formulas[i].H == HC) {
            Formulas[i].ChemicalNames.push_back(Chemical);
            ++count;
        }
    if (count == 0) {
        ChemicalForm Chem;
        Chem.C = CC;
        Chem.H = HC;
        Chem.ChemicalNames.push_back(Chemical);
        Formulas.push_back(Chem);
    }

    }
}

在 C++ 中,括号确定哪些表达式属于同一块。在您的代码中,该if (count == 0)部分实际上是for-loop 的一部分,这意味着如果尚未在向量中找到化学物质(即count == 0),那么每次执行循环时它将被推入向量中。

要解决这个问题,只需将if-statement 放在for-loop 之外:

else {
    int count = 0;
    for (int i = 0; i < Formulas.size(); ++i) {
        if (Formulas[i].C == CC && Formulas[i].H == HC) {
            Formulas[i].ChemicalNames.push_back(Chemical);
            ++count;
        }
    }
    if (count == 0) {
        ChemicalForm Chem;
        Chem.C = CC;
        Chem.H = HC;
        Chem.ChemicalNames.push_back(Chemical);
        Formulas.push_back(Chem);
    }
}

作为一种好的做法,它有助于根据嵌套级别正确缩进代码。拥有整洁的代码风格是编写好代码的第一步。


推荐阅读