Convert QFile to FILE*

回眸只為那壹抹淺笑 提交于 2019-12-19 17:45:13

问题


Is there another way to convet QFile to File? Different than this:

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

回答1:


I think you already know that you have the various open, read, etc. methods in QFile. That said, if the file is not opened, then the handle method returns an error.

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

After that, you might reopen it with:

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



回答2:


We had very strange problems with our application and finally traced it to the QFile/fdopen issue:

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 !!!
}

The problem with this code is that fclose(f) is called before the QFile object is destroyed, which is the wrong order: QTBUG-20372

...so either destroy the QFile object before calling fclose() or duplicate the file descriptor returned by 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
}

P.S.: Those strange problems with our app showed up only on very few systems by a 10 second delay between a return statement at the end of a function and the actual return from that function. It was really weird. So this is an example of an "undefined behaviour" manifested in the real world :o)




回答3:


If you have the file name, why don't you simply use

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

?

Isn't it way simpler than creating the QFile, opening it, retrieving the handle, etc.?

And it is pretty bug-free...



来源:https://stackoverflow.com/questions/9465727/convert-qfile-to-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!