从文本文件/文本流错误中读取QStrings

时间:2012-03-12 15:50:15

标签: c++ qt loops indexof qstring

我有以下内容:

ReadValuesAndWriteIntoGUI()
{
          QFile File (Directory + "/here/we/go");

          Qstring ValueAString
          Qstring ValueBString
          Qstring ValueCString
          Qstring ValueDString

        if(File.open(QIODevice::ReadOnly | QIODevice::Text))
           {
            QTextStream Stream (&File);
            QString Text;
              do
               {
              Text = Stream.readLine();
              Text = Text.simplified();

    // Vala
              QString startWith = "[1 -3 0 0 0 0 0]";
              QString endWith = ";" ;
              int start = Text.indexOf(startWith, 0, Qt::CaseInsensitive);
              int end = Text.indexOf(endWith, start + startWith.length(), Qt::CaseInsensitive);
              if(start != -1)
              ValueAString = Text.mid(start + startWith.length(), end - ( start + startWith.length() ) );
              qDebug() << ValueAString << (start + startWith.length()) << (end - (start + startWith.length()));
                 double Avalue = ValueAString.toDouble();
                 ui.AInput->setValue(Avalue);

    //Valb
                 QString startWith2 = "[1 -3 0 0 0 0 0]";
                 QString endWith2 = ";" ;
                 int start2 = Text.indexOf(startWith2, start + startWith.length(), Qt::CaseInsensitive);
                 int end2 = Text.indexOf(endWith2, start2 + startWith2.length(), Qt::CaseInsensitive);
                 if(start2 != -1)
                 ValueBString = Text.mid(start2 + startWith2.length(), end2 - ( start2 + startWith2.length() ) );
                 qDebug() << ValueBString << (start2 + startWith2.length()) << (end2 - (start2 + startWith2.length()));
                    double Bvalue = ValueBString.toDouble();
                    ui.BInput->setValue(Bvalue);

    //Valc
                    QString startWith3 = "[0 2 -1 0 0 0 0]";
                    QString endWith3 = ";" ;
                    int start3 = Text.indexOf(startWith3, 0, Qt::CaseInsensitive);
                    int end3 = Text.indexOf(endWith3, start3 + startWith3.length(), Qt::CaseInsensitive);
                    if(start3 != -1)
                    ValueCString = Text.mid(start3 + startWith3.length(), end3 - ( start3 + startWith3.length() ) );
                    qDebug() << ValueCString << (start3 + startWith3.length()) << (end3 - (start3 + startWith3.length()));
                       double CValue = ValueCString.toDouble();
                       ui.CInput->setValue(CValue);

    //Vald
                     QString startWith4 = "[0 2 -1 0 0 0 0]";
                     QString endWith4 = ";" ;
                     int start4 = Text.indexOf(startWith4, start3 + startWith3.length(), Qt::CaseInsensitive);
                     int end4 = Text.indexOf(endWith4, start4 + startWith4.length(), Qt::CaseInsensitive);
                     if(start2 != -1)
                     ValueDString = Text.mid(start4 + startWith4.length(), end4 - ( start4 + startWith4.length() ) );
                     qDebug() << ValueDString << (start4 + startWith4.length()) << (end4 - (start4 + startWith4.length()));
                     double Dvalue = ValueDString.toDouble();
                     ui.DInput->setValue(Dvalue);
                   }
                 while(!Text.isNull());
               }
}

文本文件如下:

    File 
    { vers          0; 
    form           ci; 
    ass          dict; 
    loc        "cons"; 
    ect        Proper; 
    } 
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //


    a 
    { 
    Model  New; 
    bla              bla [0 2 -1 0 0 0 0] 2;        //HERE I wanted to read ValueC=2
    bli              bli [1 -3 0 0 0 0 0] 4;        //HERE I wanted to read ValueA=4
    t           t [0 1 0 0 0 0 0] 0.003;  
}


    b 
    { 
    Model  New; 
    bla              bla [0 2 -1 0 0 0 0]  1;       //HERE I wanted to read ValueD=1
    bli              bli [1 -3 0 0 0 0 0] 3;        //HERE I wanted to read ValueB=3
    t            t [0 1 0 0 0 0 0] 0;  
} 
    . 
    . 
    .

我在GUI中得到的结果是:

ui.AInput = 3 which originally is ValueB
ui.BInput = 0 ?
ui.CInput = 0,000000003000 ?
ui.DInput = 0 ?

如您所见,我使用了QString :: indexof和QString :: mid方法来获取QStrings,但到目前为止,它并不适用于这些QStrings。 谁知道我失败了?问候

1 个答案:

答案 0 :(得分:1)

if (offset=0) =&gt; if (offset==0);)

考虑到您的意见,我不明白您认为ValueB应该是什么。您一次只读一行,因此始终只有一行startWith,因此只有ValueA。

这是(我认为)你想要实现的目标:

ReadValuesAndWriteIntoGUI()
{

    QString ValueAString;
    QString ValueBString;

    QFile File (Directory + "/here/we/go");
    if(File.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream Stream (&File);
        QString Text;
        int occ=0;

        do
        {
            Text = Stream.readLine();
            Text = Text.simplified();

            QString startWith = "[1 -3 0 0 0 0 0]";
            QString endWith = ";" ;

            int startWithPosition = Text.indexOf(startWith, 0, Qt::CaseInsensitive);
            if(startWithPosition < 0)
            {
                break;
            }

            int endWithPosition = Text.indexOf(endWith, startWithPosition + startWith.length(), Qt::CaseInsensitive);
            if(endWithPosition < 0)
            {
                break;
            }

            if (occ==0)
            {
                ValueAString = Text.mid(startWithPosition + startWith.length(), (endWithPosition - (startWithPosition + startWith.length())));
                qDebug() << ValueAString << (startWithPosition + startWith.length()) << (endWithPosition - (startWithPosition + startWith.length()));
                double ValueA = ValueAString.toDouble();
                ui.ValueAInput->setValue(ValueA);
                occ++;
            }
            else if (occ==1)
            {
                ValueBString = Text.mid(startWithPosition + startWith.length(), (endWithPosition - (startWithPosition + startWith.length())));
                qDebug() << ValueBString << (startWithPosition + startWith.length()) << (endWithPosition - (startWithPosition + startWith.length()));
                double ValueB = ValueBString.toDouble();
                ui.ValueBInput->setValue(ValueB);
            }

        }                           // close do command
        while(!Text.isNull());

    }                              //close method "ReadValuesAndWriteIntoGUI()"
}