Convert QFile to FILE*

2019-02-23 06:56发布

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");

标签: c++ file qt qfile
3条回答
Juvenile、少年°
2楼-- · 2019-02-23 07:28

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楼-- · 2019-02-23 07:31

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");
查看更多
爱情/是我丢掉的垃圾
4楼-- · 2019-02-23 07:35

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

查看更多
登录 后发表回答