继续一个循环直到EOF(Qt)

时间:2016-09-10 22:40:48

标签: c++ qt while-loop iterator eof

我正在开发一个程序来从大型QStringList创建一个列表。所以基本上在字符串匹配之后,while循环将开始将下一个字符串添加到列表中。这部分工作正常。我唯一的问题是该程序意外退出,因为我不知道应该如何添加EOF机制。

使用更详细的代码进行更新

很抱歉没有提供有关我的代码的足够详细信息。这就是我的代码现在的样子。因此,在第一次检测到字符串“PACKAGE TYPE”之后,我使用函数storeLines()函数将下一个字符串存储到依赖的三个列表中的一个中。这将持续到下一个“PACKAGE TYPE”匹配或EOF。现在唯一不能正常工作的是迭代器在QStringList的最后一个字符串上。它以某种方式检测不到下一个是inputline.end()

void storeLines(QString department, QStringList::iterator current_line, QStringList::iterator endline){
while(QString::compare(*(current_line + 1),"PACKAGE TYPE") && (++current_line != endline)){ //this is not working
    if(!QString::compare(department, "MDA")) mda_list.push_back(*current_line);
    else if(!QString::compare(department, "SDA")) sda_list.push_back(*current_line);
    else mix_list.push_back(*current_line);
    }
}

void void MainWindow::on_pushButton_clicked(){
   QString input = ui->listinput->toPlainText().toLatin1();
   QStringList inputline = input.split("\n", QString::SkipEmptyParts );

   for(QStringList::iterator pkg_header(inputline.begin()); pkg_header != inputline.end(); ++pkg_header){
       if(!QString::compare(*pkg_header,"PACKAGE TYPE")){
           ++pkg_header;
           if(!QString::compare(*pkg_header,"Department-mda:")) storeLines("MDA", pkg_header, inputline.end());
           else if(!QString::compare(*pkg_header,"Department-sda:")) storeLines("SDA", pkg_header, inputline.end());
           else storeLines("MIX", pkg_header, inputline.end());
       }
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

你正在编写一个解析器 - 编写它通常最简单,就像你通常写一个,通过使状态显式并按顺序迭代输入流的每个元素。你不会以这种方式做出任何一个迭代迭代器错误。

此代码与您问题中的意图相符,并且很明显您错过了一个案例:当您期望某个部门时,您不会对出现的PACKAGE TYPE做出反应。您可以发出错误信号,或者保持DEPARTMENT状态,但我认为您应该处理它而不是忽略它。

QStringList mda_list, sda_list, mix_list;

void parse(const QString & input) {
    enum {
        TYPE,
        DEPARTMENT,
        ITEMS
    } state = TYPE;
    auto list = &mix_list;
    auto const kPackageType = QStringLiteral("PACKAGE TYPE");

    for (auto const element : input.split("\n", QString::SkipEmptyParts)) {
        switch (state) {
        case TYPE:
            if (element == kPackageType)
                state = DEPARTMENT;
            break;
        case DEPARTMENT:
            if (element == QStringLiteral("Department-mda:"))
                list = &mda_list;
            else if (element == QStringLiteral("Department-sda:"))
                list = &sda_list;
            state = ITEMS;
            break;
        case ITEMS:
            if (element == kPackageType)
                state = DEPARTMENT;
            else
                *list << element;
            break;
        }
    }
}

使用QStringLiteral为您提供编译时构建的字符串实例以进行比较。如果您删除了QStringLiteral(...)包装器,代码也可以正常工作,但由于不可避免的过早悲观化而付出代价。

答案 1 :(得分:0)

你明显的意图是找到字符串&#34; PACKAGE TYPE&#34;在现有列表中,然后将列表中的其余元素复制到新列表中。

如果是这样,为什么不这样做?

for(QStringList::iterator current_line(inputline.begin()); current_line != inputline.end(); ++current_line){
    if(!QString::compare(*current_line,"PACKAGE TYPE"){
        list.insert(list.end(), ++current_line, inputline.end());
        break;
    }
}