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

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

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

3 ответа

Решение

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

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

После этого вы можете снова открыть его:

FILE* fh = fdopen(fileHandle, "rb");

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

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

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

?

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

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

Другие вопросы по тегам