2

テキストファイルを1行ずつ読み取り、配列に各行を追加したいのですが、そのようなことを試しましたが、配列に問題があります。

QFile inputFile("C:\\pepoles.txt");
if (inputFile.open(QIODevice::ReadOnly))
{
    QTextStream in(&inputFile);
    QString pepoles[1000];
    while ( !in.atEnd() )
    {
        QString line = in.readLine();
        pepoles[] = line;
    }
    ui->lineEdit->setText(pepoles[0]);
}
else{
    QMessageBox::critical(this, "Ouups",
                          "Le fichier est introuvable ou vide...");
}

inputFile.close();
}

ありがとう !

4

5 に答える 5

3

読んだ行数を追跡し、それを使ってpepolesにインデックスを付けます。また、アレイの容量を超えないようにしてください。

   int lineNum = 0;
   QFile inputFile("C:\\pepoles.txt");
   if (inputFile.open(QIODevice::ReadOnly))
   {
      QTextStream in(&inputFile);
      QString pepoles[1000];
      while ( !in.atEnd() && lineNum < 1000)
      {
         QString line = in.readLine();
         pepoles[lineNum++] = line;
       }
于 2012-10-25T20:14:42.597 に答える
1

QStringListの代わりに使用する必要がありQString [1000];ます。

次に、次のコマンドで簡単に行を追加できます

peoples << line;

今、あなたの構文は正しくありません。line配列に割り当てようとしていますか、それとも何ですか?配列lineの指定された要素にのみ割り当てることができます。

peoples[i] = line;

ただし、最初のアプローチを使用することをお勧めします。

于 2012-10-25T20:12:56.227 に答える
1

文字列をコピーする位置を指定する必要があります。例えば:

pepoles[0] = line;

文字列を配列の最初の要素にコピーします。明らかに、配列を反復処理するための変数が必要になるため、各ループで新しい文字列を配列の次の位置にコピーします。

誤って配列の終わりを超えて書き込むことがないように、配列の代わりに配列を使用QStringListして、物事をより簡単かつ安全にする必要があります。たとえば、次のpepolesように定義できます。

QStringList pepoles;

次に、最後に新しい文字列を追加するたびに、次のようにします。

pepoles << line;

QStringList使用方法に関するドキュメントは次のとおりです。http: //doc.qt.digia.com/qt/qstringlist.html#details

std::vector<QString>代わりに次のものを使用することもできます。

std::vector<QString> pepoles;

その場合、最後に次の文字列を挿入します。

pepoles.push_back(line);

ここで読んでstd::vectorください:http ://www.cplusplus.com/reference/stl/vector

std::vectorQtの一部ではありません。これは、標準C++ライブラリによって提供されます。

于 2012-10-25T20:13:45.293 に答える
1

また、これは最初の行のみを表示します:

ui->lineEdit->setText(pepoles[0]);

おそらくこのようなものが必要です(pepolesがQStringListの場合)

ui->lineEdit->setText(pepoles.join());

join()メソッドは、qstringlist内のすべてのアイテムを連結するQStringを作成します

編集:そして多分LineEdit以外のものを使用してください;)

于 2012-10-25T20:17:31.293 に答える
0

この質問は本当にかなりの数に依存します。テキストファイルから抽象化する情報に対して何が計画されているか。別のテキストファイルに出力し、テキストオブジェクト機能(QTextEdit、QLineEditなど)を備えたウィジェットに表示し、データベースに送信し、ある種の用途に使用しますか(つまり、重複するエントリを削除するか、行間隔を区切る/削除する)?問題のテキストファイルは行で折り返されていますか?各行の文字数、つまりビット数。

私は多くの理由でこれを言います。ご存知のとおり、QtはMeta-Object-Compilerと広範なマクロでC++言語を強化します。マクロがプログラムテキストをコンパイラが実際に見る前に再配置するという点で、C++プログラミングの基本に戻ります。Qtでは、これはテキストオブジェクトとテキストオブジェクトに送信するファイルI/Oで何よりも真実であることがわかりました。繰り返しますが、アプリケーションをどのように設計したかによって異なります。Bjarneのアドバイスに従い、「必要なクラスを決定し、各クラスの操作の完全なセットを提供し、継承を使用して共通性を明示します。そのような共通性がない場合は、データの抽象化で十分です。」

これを述べたので、実行時エラーが発生したか、コンパイル中またはコンパイル後にアプリケーションが予期せずクラッシュ/終了した可能性があります。つまり、プログラム/アプリケーションをデータフローのカウントに書き直す必要があります。

テキストファイルからのデータが必要な場合は、バイナリ検索アルゴリズムのようにテキストを検索/並べ替えて、そのような1つの配列を使用して比較することはできません。テキストオブジェクトにすべての名前を表示してそれらを検索する場合は、以下に示すように、QScrollAreaとQTextEditを作成し、QTextEditをQScrollAreaに追加することをお勧めします。

scrollArea = new QScrollArea(this);
textEdit = new QTextEdit("",this);
textEdit -> setGeometry(QRect(QPoint(150, 50), QSize(400,20000)));
scrollArea -> setGeometry(QRect(QPoint(150, 50), QSize(400,300)));
scrollArea -> setWidget(textEdit);

*注:テキスト編集のサイズは、ウィンドウのサイズをはるかに超えて設定できます。12フォントで少なくとも1000行??。20000で、ラインマージンを含めるために南北に4ポイントあります。

scrollareaとtexteditの両方が親オブジェクトクラスで作成されている場合は、ファイルを読み取り、readLineの代わりにreadAllを使用して、textEditに表示します。1000行の行編集は大規模です!! 繰り返す必要はありません。QFile::ReadOnlyを使用して説明しているような場合は十分です。親オブジェクトのクラス(つまりメインウィンドウ)で説明されていることを実行すると、行の編集によってファイルを読み取るvoid関数が作成され、次のように表示されます。

textEdit->setPlainText(line);

次に、mainWindow関数の下部にある関数を呼び出すだけです。説明されているように、文字列を結合する配列を作成しても意味がありません。私が説明したものを使用して、小さな3〜5行の関数を使用して、それらをはるかに簡単に編集できる場合。

このアプリケーションが使用できず、公開したい場合:これには、関数による計算とデータの抽象化、および配列入力後のテキストオブジェクトとの間の入力が必要になる可能性があります。この場合、コンテナQStringListを作成し、ファイルを閉じた後、以下に示すようにqFillアルゴリズムを使用します。

QList<QString> Lstring(lineNumbers); //line numbers is the size of strings per line

qFill(Lstring, peoples.size());

foreach(QString item, Lstring){
    textObjectOfChoice -> setText();
}

私は個人的にQStringListを使用し、メインウィンドウのクラスでfalse(off)に設定されたブール関数を作成し、アプリの実行が開始されるとすぐにint main {}で作成します。もちろん、メインウィンドウまたはダイアログオブジェクトは作成されたオブジェクトでドットセパレーターを呼び出し、パラメーターにtrueを渡して、ファイルのロードを1回オンにします。次に、w.show();を呼び出した後。再帰的にapp.exec()を返す前に、同じドット区切り関数を呼び出してから、値をfalseに渡します。注:スプラッシュ画面はこれに役立ちます。私は個人的には、スプラッシュクリーンなしで50万語、250万文字にすぎません。アプリケーションで個人的に作成したクラスの数によっては、さらに長くなる可能性があります。以下は、呼び出される関数の例です。

void WordGame::fileStart(bool load){

    start = load;

    if (start){
        QFile myfile(":/WordGame/WordGame/TheHundredGrand.txt");

        if(myfile.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QString line;
            QTextStream stream(&myfile);
            int index = 0;
            int length = 0;
            do
            {
                line = stream.readLine();
                arryOne[index] = line;
                listOne << arryOne[index];
                index++;
                length++;
            }while(index<109582);

            stream.flush();
            myfile.close();
        }
    }
}

メインでは、WordGameのメインウィンドウクラスは次のように呼び出されます。boolload = true; WordGame w; w.fileStart(load);

w.show();

w.fileStart(!load);

return app.exec();

これはもちろん、qrcソースファイルで参照していた単語リストがあります。アプリの最初のインスタンスが呼び出された後に終了するアルゴリズムのファイルロード部分を作成しない場合、リストはそれ自体を繰り返して拡張し続けます(標準の入出力を持つすべてのc / c ++アプリケーションはそれ自体が再帰的であるため、 app.exec)。最初のリスト作成の機能外の別のリストにデータを抽象化して(元のリストが解析されることを意味します)、元のリストと比較できるようにします。たとえば、すでに回答済み、以前に回答済み、以前に検索されたなどは、テキストオブジェクトの量に基づいた最も賢い動き。ユーザー入力の別のリストを作成してから、最初のリストとユーザー入力のリストを繰り返すのが最善です。私はこのようなものを使用します:

QStringList::iterator i3 = qFind(userInputList.begin(), userInputList.end(), word);
QStringList::iterator i2 = qFind(listOne.begin(), listOne.end(), word);

上記のイテレータでは、ユーザーエントリが初期データセットと一致するかどうかを確認し、他のイテレータはユーザーの以前の入力に対して検索します。

注:C ++またはJavaの関数またはメソッドは、30行以下のデータ(空でない行)である必要があります。テキストオブジェクト機能(つまりlineEdit)を備えたウィジェットからデータを繰り返し抽象化して入力し、それらに対して計算を実行すると、説明されているようにファイルを頻繁に開くと、後で問題が発生する可能性があります。また、file.closed()操作が別の関数に対して完了した後、connectステートメントが正しいように見えます。または、ブール関数の使用done = true; 率直に言って、Qt / Cpp(またはそのことについては任意の言語)で大規模で堅牢なソフトウェアを開発するための最良の方法は、バイナリ(0または1)のtrueまたはfalseの関数/メソッドの完了です。使用法によっては、qrcファイルを作成してテキストファイルをファイルとして追加することも重要な場合があります。データコンテナを埋めるために一度だけ開いたり閉じたりすることは、メインイベントループから抜け出す方法です。Qstringlistを使用すると、メモリダンプが実行されるまでリストが継続的にいっぱいになり、アプリケーションが失敗する可能性があります。これを回避するには、リストの各インデックス位置に対して「」をnullとして逆反復するように、追加の「list-reset」関数を使用します。ユーザーがEnterボタンなどを押すと、開発中のものは何でも、TextStreamオブジェクトを含む関数を自動的に呼び出しますか?リストの各インデックス位置に対してnullとして「」を使用する逆反復のようなものです。ユーザーがEnterボタンなどを押すと、開発中のものは何でも、TextStreamオブジェクトを含む関数を自動的に呼び出しますか?リストの各インデックス位置に対してnullとして「」を使用する逆反復のようなものです。ユーザーがEnterボタンなどを押すと、開発中のものは何でも、TextStreamオブジェクトを含む関数を自動的に呼び出しますか?

PS本当にそれについて正義になりたいのなら、8ビットスタイルのような本当に古い学校でそれを行うことができます。*テキストファイルがどうなるかを永続的に知っていて、不変だった場合。そして、(それは何ですか?)int array [97]を作成します。これは、すべてのアルプラヌメリック、大文字、特殊文字/句読点が配列の1つのインデックス位置に等しいことです。たとえば、1つの整数は1つの文字に等しく、たとえば[0] = a、[1] = b、[26] = Aであり、各行の各文字の位置をカウント/グラフ化する文字オカレンスプログラムを作成します。その特定の単語ファイルまたはテキストファイルの統計があります。

于 2014-05-08T10:25:17.617 に答える