30

フォルダー内のすべてのファイルを読み取り、fileList経由で保存してからentryList()、そのフォルダー内の各ファイルを開いて、その内容をQString. これは簡単だと思いますが、何が間違っているのかわかりません。私が今得ているエラーは次のように言っています:

no matching function for call to 'QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)'

これは、私が宣言している間違った方法に関連していることを理解していますが、問題QTextStreamは、私が見つけた例がこれを行うように見えるということです。

また、ファイルのオープンが成功したかどうかを確認するテストを追加すると、読んだだけでも「アクセスが拒否されました」という警告が表示されることに気付きました。ただし、フォルダーの内容を読み取って、QListWidgetそれらのファイルを問題なく入力することもできます。

これらが *.JSON ファイルであるという事実は問題ではありませんよね?

thisthis、およびthisの例を見てきましたが、何が間違っているのかわかりません。どんな助けでも大歓迎です。

これは私のコードです:

foreach(QString fileName, fileList){

    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    QString s;

    QTextStream s1(&file, QIODevice::ReadOnly);
    s.append(s1.readAll());

    qDebug() << "string content:" << s; // empty!!!

}

更新 cmannett85 によって提案された変更により、エラーが発生しなくなりましたが、何らかの理由で文字列sが最後に空のままです。フォルダの読み取り/書き込み権限に関して、テストすると気がついた

if(!file.open(QIODevice::ReadWrite))
        {
            QMessageBox::information(0,"error",file.errorString());
        }

ループを実行する.と、2 つの警告が表示されます。..32 個の警告が生成される前に、フォルダー内に 30 個のファイルがあります。とにかく、私が読み込もうとしているファイルは *.JSON であり、Windows 7 のプロパティ ダイアログによると、読み取り専用またはhiddenとして設定されていません。同じプログラムでまったく同じフォルダーにファイルを書き込むことができます。

これの理由ではないかと思うことが 1 つあります。それは、ファイル名.の拡張子の前にID.file.16.json.

UPDATE 2.異なるファイルでテスト したファイル名とは関係なく、結果は同じです。

また、2 つの警告は実際には.とに関連していました..QDir::Filters問題を解決しました。QDir::Files不思議なことに、フィルターを適用すると、すべて問題ありません。しかし、QDir::NoDotAndDotDotフィルターを使用すると、このフィルターを使用するとこれら2つの要素のみが無視されるというQtアシスタントの説明とは対照的に、ファイルはまったく検出されません。

更新 3

ddriver の提案に従いましたが、まだ機能していません。フォルダー内のファイルの取得を含む現在のコードは次のとおりです。

QDir assetsFolder = QDir("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");

QStringList files = assetsFolder.entryList(QDir::Files);

    // for each file in the folder,
    foreach (QString file, files) {
        QFile f(file);
        if (!f.open(QFile::ReadOnly | QFile::Text)) break;
        QTextStream in(&f);
        qDebug() << f.size() << in.readAll();

        f.close();

    }
4

4 に答える 4

1

非常に大きな頭痛の種の後、本当に基本的で単純なエラーがこれを引き起こしていることがわかりました - application path

質問セクションに追加した最後のコードに、次のように追加しました。

assetsFolder.setCurrent("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");

foreachループの前で、すべてが機能しています。

これは最終的に最初に回答した人々の貢献によって得られた明確な回答になりましたが、これは私が持っていた最初の質問ではありませんでした.最初に聞いたこと。

また、ddriverさんの回答はfileList問題を具体的に対象としており、アプリケーションのパスについて考えさせられたので、正解としてマークしました。

于 2013-06-18T07:43:15.683 に答える