Конвертировать 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, открыть его, получить дескриптор и т. Д.?
И это довольно без ошибок...