2016-09-10 4 views
0

큰 QStringList에서 목록을 작성하는 프로그램에서 작업하고 있습니다. 따라서 기본적으로 문자열 일치 후 while 루프는 다음 문자열을 목록에 추가하기 시작합니다. 이 부분은 잘 작동합니다. 내가 가진 유일한 문제는 EOF 메커니즘을 어떻게 추가해야할지 모르므로 프로그램이 예기치 않게 종료된다는 것입니다. 더 자세한 코드EOF (Qt)까지 while 루프 계속

업데이트 내 코드에 대한 충분한 세부 사항을 제공하지 않는

죄송합니다. 이것이 내 코드가 지금 보이는 모습입니다. 따라서 처음으로 "PACKAGE TYPE"문자열이 감지 된 후 함수 storeLines()을 사용하여 다음 문자열을 세 가지 목록 중 하나에 저장합니다. 그리고 이것은 다음 "패키지 유형"일치 또는 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()); 
     } 
    } 
} 

감사 것을 감지하지 않습니다!

+0

'for' 루프는 정지 조건을 쓰는 방법을 알고 있지만 while 루프는 쓰지 않는 것을 알고 있습니까? 물론 두 곳에서 같은 수표를 사용해야합니다. –

+0

@IgorTandetnik 코드를 단순화했습니다. 실제로 'while'루프는 다른 함수에서 수행됩니다. 'inputline.end()'를 매개 변수로 추가하려고 시도했지만 작동하지 않았습니다. – Mrchacha

+0

글쎄, 당신은 그것을 작동시켜야 할 것입니다. end iterator *를 비교하는 것은 범위의 끝을 감지하는 방법입니다. 'NULL '과 비교하려는 시도는 말도 안됩니다. –

답변

0

명백한 의도는 기존 목록에서 "PACKAGE TYPE"문자열을 찾은 다음 목록의 나머지 요소를 새 목록으로 복사하는 것입니다.

그런 경우라면 정확히하지 않으시겠습니까?

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; 
    } 
} 
+0

문제에 대해 명확히 알 수 없어 죄송합니다. 더 자세한 설명으로 코드를 업데이트했습니다. 문제는 EOF와 그 다음의 "패키지 유형"일치를 추적해야한다는 것입니다. – Mrchacha

+0

"EOF"라는 것은 없습니다. "EOF"는 내용을 읽을 때 "파일 끝"을 의미합니다.여기에 파일이 없습니다. 아직도 당신이 원하는 것을 정당하게 설명 할 수는 없습니다. –

+0

좋아요, 그래서'current_line'이 QStringList의 마지막 문자열에 있는지 확인할 방법을 알고 싶습니다. QStringList가 있는데 여기에는 여러 섹션이 있으며 각 섹션은 "PACKAGE TYPE"문자열로 시작합니다. 다음 문자열은 패키지가 속한 부서를 정의합니다. mda, sda 또는 혼합 부서에있을 수 있습니다. 그리고 다음 "PACKAGE TYPE"섹션 또는 QStringList의 끝까지 부서리스트에 다음 문자열을 저장하고 싶습니다. – Mrchacha

1

당신은 파서를 쓰고있어 - 그건 자주 쓰는 간단한 당신이 보통 국가가 명시 적으로 만들고 입력 스트림의 모든 요소를 ​​통해 순차적으로 반복하여 하나를 쓸 것 같은. 이런 방식으로 off-by-one 반복자 오류를 만들지는 않을 것입니다.

이 코드는 질문의 의도와 일치하며 사례를 놓친 것이 분명합니다. 부서가있을 때 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(...) 랩퍼를 제거한 경우에도 피할 수없는 조기 페이지 화로 인해 비용이 많이 들게됩니다.