

sample.txt  
の中身が

[code]

    apple=150
    orange=300
    grape=200
    
[/code]

のときに

  1. sample.txtを読み込んで(全読み込み)
  2. "\n"で1行ずつsplit
  3. "="でsplitしてパラメータ名が正しければcorrectを表示

したいのですが、下記コードだと、grapeがある場合でもgrapeがない場合でも `else if(key != "grape")`
に引っかかってしまいます。

grapeがある場合、 `else if(key != "grape")` に引っかからないようにするにはどのように修正すべきなのでしょうか。

grapeがない場合やgrapeの綴りが間違っている(例glape)時だけ `else if(key != "grape")`の処理に入りたいです。

[code]

    #include "MainWindow.h" 
    #include <QApplication>
    #include <QDebug>
    #include <QFile>
    #include <QTextCodec>
    
    int main(int argc, char *argv[])
    {
        //QApplication a(argc, argv);
        //MainWindow w;
        //w.show();
        QFile file("C:\\Users\\Desktop\\sample.txt");
        if (!file.open(QIODevice::ReadOnly))
            {
                qDebug() << "can not open file." ;
                return 0;
            }
            QString str;
            QTextStream in(&file);
            str = in.readAll();
            qDebug() << str ;
            QStringList list1 = str.split("\n");
            for (int i=0; i < list1.count(); i++) {
                QString txt = list1[i];
                QStringList list2 = txt.split("=");
                QString key = list2[0];
                QString value = list2[1];
                if(key == "apple"){
                    qDebug() << "correct";
                }
                if(key == "grape"){
                    qDebug() << "correct";
                }
                else if (key != "grape"){
                    qDebug() << "incorrect";
                    //break;
                }
                if(key == "orange"){
                    qDebug() << "correct";
                }
            }
    
        file.close();
        //return a.exec();
    }
    
[/code]


CC BY-SA 4.0
2020-06-25T10:24:45.743
67986
2020-06-26T01:30:12.243
2020-06-26T01:30:12.243
3060
40822
question
c++ qt qt-creator
Qtのsplitについてです


これはタイトルのような「Qtのsplitについて」ではなく、一般的なC++のプログラミング上の問題ですね。

`for`ループ内の3つの`if`文は`break`や`continue`でスキップしたり、`else
if`,`else`でまとめたりしていないため、その回の処理対象に対して全て適用されます。

例えば`apple`や`orange`に対しても、`apple`か, `grape`か`grape`で無いか, `orange`か
のチェックがすべて行われます。  
そのため、「`grape`で無い」ことになり`qDebug() << "incorrect";`が実行されます。

**何をどうチェック・処理したいのか？ を厳密に整理しましょう**

例えば「`grape`で無い」という条件は、別に`glape`,`grepe`,`grapu`等に限らず`apple`や`orange`でも(あるいは`lemon`でも)成立します。  
そういう意味で、「`grape`で無いか？」という条件による判定は適切とは言えないでしょう。

どんなデータがあった時にどのように処理を行うか(処理対象あるいは対象外のデータとは何か、対象外データがあった時にどう判定してどう処理するか)といったことを細かく厳密に整理して、それに沿ったプログラミングを行ってください。

**変更の少ないやり方としては？**  
以下のようにすれば良いでしょう。  
(上記整理で条件が増減したり変わったりしたら、それに合わせて変更します)

  * `apple`, `grape` , `orange`, **`それ以外`** の4つの場合に分ける(`grape`では無いという判定はやめる)
  * それぞれの判定を`if`,`else if`,`else`で接続して、どれかが成立したら他の判定は行われないようにする
  * `grape`が有ったかどうかのフラグ変数を用意して、`for`ループの前にfalseで初期化、`for`ループ内で見つかればtrue設定、`for`ループ終了後にフラグ変数で`grape`有無のチェックを行う


CC BY-SA 4.0
2020-06-25T15:40:56.993
68000
2020-06-25T15:49:17.580
2020-06-25T15:49:17.580
26370
26370
67986
answer