8

QFile をファイルに変換する別の方法はありますか? これとは異なります:

QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
4

3 に答える 3

13

アプリケーションで非常に奇妙な問題が発生し、最終的に QFile/fdopen の問題にたどり着きました。

void foo(QString filename)
{
    QFile qf(filename);
    qf.open(QIODevice::ReadOnly);
    int fd = qf.handle();
    FILE* f = fdopen(fd, "rb");
    // do some stuff with f
    fclose(f); // !!! undefined behaviour !!!
}

このコードの問題は、QFile オブジェクトが破棄される前に fclose(f) が呼び出されることです。これは間違った順序です: QTBUG-20372

...したがって、fclose() を呼び出す前に QFile オブジェクトを破棄するか、QFile::handle() によって返されるファイル記述子を複製します。

void foo(QString filename)
{
    QFile qf(filename);
    qf.open(QIODevice::ReadOnly);
    int fd = qf.handle();
    FILE* f = fdopen(dup(fd), "rb"); // !!! use dup()
    // do some stuff with f
    fclose(f); // correct
}

PS: 私たちのアプリのこれらの奇妙な問題は、関数の最後の return ステートメントとその関数からの実際の戻りの間に 10 秒の遅延がある非常に少数のシステムでのみ現れました。本当に奇妙でした。したがって、これは現実の世界で明らかになった「未定義の動作」の例です:o)

于 2013-06-01T19:39:28.387 に答える
7

openQFile にさまざまな、readなどのメソッドがあることは既にご存じだと思います。つまり、ファイルが開かれていない場合、handleメソッドはエラーを返します。

QFile myFile("goforward.raw");
myFile.open(QIODevice::ReadOnly);
int fileHandle = myFile.handle();

その後、次のようにして再度開くことができます。

FILE* fh = fdopen(fileHandle, "rb");
于 2012-02-27T13:30:08.247 に答える
-1

ファイル名がある場合は、単に使用してみませんか

QFile *file = fopen(filename.toLocal8Bit().data(), "rb");

?

QFile を作成して開き、ハンドルを取得するなどよりも簡単ではありませんか?

そして、それはかなりバグがありません...

于 2013-12-24T13:12:40.867 に答える