Convert QFile to FILE*

2019-02-23 06:52发布

问题:

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...



标签: c++ file qt qfile