2016-06-18 11 views
1

テキストファイルを読み込み、各行を3つの変数に解析しようとしています。そのうち2つはQStringsで、そのうちの1つはintです。ファイルの各行は次のようになります。 QT C++で各行のintとQStringの両方を読み取るファイル

This is my first string : This is my second string : 2 
This is another first string : This is another second string : 18 

は、私は私のファイルを反復処理として、私は、各変数(QString1、QString2、int)を設定し、メソッドを呼び出すしたいと思い、これに基づいています。

QString1 = "This is my first string"; 
QString2 = "This is my second string"; 
int x = 2; 

callMethod(QString1, QString2, x); 

QString1 = "This is another first string"; 
QString2 = "This is another second string"; 
int x = 18; 

callMethod(QString1, QString2, x); 

どうすればよいですか?

+0

に思える(すなわち、S:秒:1)ということが正しいのですか? – Tas

+0

行はありません。各可変値はです。 3つの変数はすべて1行にあり、 ":"で区切られます。 – user3781214

+0

[彼の答えを見てください](http://stackoverflow.com/questions/14265581/parse-split-a-string-in-c-using-string- delimiter-standard-c)区切り文字に文字列を分割する方法を扱います – Roland

答えて

4

ファイルを1行ずつ読み込んで、フロースルー時に結果を解析するだけです。次に例を示します。

#include <QFile> 
#include <QTextStream> 
#include <QFileDialog> 
#include <QDebug> 

void MainWindow::parseFile() 
{ 
    QFile inputFile(QFileDialog::getOpenFileName()); 
    if (inputFile.open(QIODevice::ReadOnly)) 
    { 
     QTextStream in(&inputFile); 
     while (!in.atEnd()) 
     { 
      QString text = in.readLine(); 
      if (!text.isEmpty()) 
      { 
       QStringList line = text.split(':'); 
       callMethod(line[0], line[1], QString(line[2]).toInt()); 
      } 
     } 
     inputFile.close(); 
    } 
} 

void MainWindow::callMethod(QString first, QString second, int third) 
{ 
    qDebug() << "Variable #1: " << first; 
    qDebug() << "Variable #2: " << second; 
    qDebug() << "Variable #3: " << third; 
} 
+0

まさに私が探していたものです。ありがとうございます – user3781214

+0

@ user3781214いつでも! –

+1

.toInt()を呼び出すためにQStringから新しいQStringを作成したのはなぜですか? 'QString(line [2])。toInt()' – Harvey

1

ここでは、適切なエラーチェックを行う方法を説明します。

テキストファイルなので、QTextStreamを設定して行単位で読み上げます。コロンセパレータの行をすぐにsplitにして、3つの部分があるかどうかを確認します。 splitは空の文字列と区切り文字のない文字列を処理できるため、空の文字列lineを確認する必要はありません。

3つの部分がある場合は、最後の部分を解析して、成功したかどうかを確認します。そうであれば、メソッドを呼び出すことができます。最初の2つの部分(空白があれば)と、解析した整数を渡します。

文字列部分の動作が整数部分の動作と同じになるように、恐らく空白トリミングが必要です。toIntは結局空白を無視します。

出力:あなたの行はコロンで分割されているよう

read "a1" "b1" 10 
read "Lol" "cats" 33 
// https://github.com/KubaO/stackoverflown/tree/master/questions/simple-parse-37902620 
#include <QtCore> 

void callMethod(const QString & a, const QString & b, int c) { 
    qDebug() << "read" << a << b << c; 
} 

void parse(QIODevice * input) 
{ 
    QTextStream in(input); 
    while (!in.atEnd()) { 
     auto const line = in.readLine(); 
     auto const parts = line.split(':'); 
     if (parts.size() == 3) { 
     bool ok; 
     auto p3 = parts.at(2).toInt(&ok); 
     if (ok) 
      callMethod(parts.at(0).trimmed(), parts.at(1).trimmed(), p3); 
     } 
    } 
} 

int main(int argc, char ** argv) { 
    QCoreApplication app{argc, argv}; 
    QByteArray data{" a1 : b1 : 10 \nLol:cats: 33"}; 
    QBuffer buf(&data); 
    if (buf.open(QIODevice::ReadOnly)) 
     parse(&buf); 
} 
関連する問題