Конвертировать QFile в FILE * - PullRequest
       18

Конвертировать QFile в FILE *

6 голосов
/ 27 февраля 2012

Есть ли другой способ преобразовать QFile в файл?Отличается от этого:

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

Ответы [ 3 ]

12 голосов
/ 01 июня 2013

У нас были очень странные проблемы с нашим приложением, и мы, наконец, отследили его до проблемы 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 !!!
}

Проблема с этим кодом заключается в том, что fclose (f) вызывается до уничтожения объекта QFile, это неправильный порядок: QTBUG-20372

... так что либо уничтожьте объект QFile перед вызовом fclose (), либо продублируйте дескриптор файла, возвращаемый 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: эти странные проблемы с нашим приложением обнаружились только в очень немногих системах с 10-секундной задержкой между оператором возврата в конце функции и фактическим возвратом из этой функции.Это было действительно странно.Итак, это пример «неопределенного поведения», проявляющегося в реальном мире: о)

7 голосов
/ 27 февраля 2012

Я думаю, вы уже знаете, что у вас есть различные методы open, read и т. Д. В QFile. Тем не менее, если файл не открыт, метод handle возвращает ошибку.

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

После этого вы можете открыть его с помощью:

FILE* fh = fdopen(fileHandle, "rb");
0 голосов
/ 24 декабря 2013

Если у вас есть имя файла, почему бы вам просто не использовать

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

Разве это не проще, чем создать QFile, открыть его, получить дескриптор и т. Д .?

И это довольно без ошибок ...

...