将QFile转换为FILE*

Jjr*_*ina 6 c++ qt file qfile

还有另一种方法可以将QFile传递给File吗?与此不同:

QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
Run Code Online (Sandbox Code Playgroud)

Mic*_*pso 12

我们的应用程序遇到了非常奇怪的问题,最后将其追溯到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 !!!
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是在销毁QFile对象之前调用fclose(f),这是错误的顺序:QTBUG-20372

...所以要么在调用fclose()之前销毁QFile对象,要么复制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
}
Run Code Online (Sandbox Code Playgroud)

PS:我们的应用程序的那些奇怪的问题只出现在很少的系统上,在函数结束的return语句和该函数的实际返回之间延迟10秒.这真的很奇怪.所以这是现实世界中表现出的"未定义行为"的一个例子:o)


vul*_*ino 7

我想你已经知道你有不同的open,read在一个QFile等方法.也就是说,如果文件未打开,则该handle方法返回错误.

QFile myFile("goforward.raw");
myFile.open(QIODevice::ReadOnly);
int fileHandle = myFile.handle();
Run Code Online (Sandbox Code Playgroud)

之后,您可以重新打开它:

FILE* fh = fdopen(fileHandle, "rb");
Run Code Online (Sandbox Code Playgroud)