问题
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