8

还有另一种方法可以将 QFile 转换为 File 吗?与此不同:

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

3 回答 3

13

我们的应用程序遇到了非常奇怪的问题,最后追踪到 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 !!!
}

这段代码的问题是在 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
}

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

于 2013-06-01T19:39:28.387 回答
7

我想你已经知道 QFile 中有各种open,read等方法。也就是说,如果文件未打开,则该handle方法将返回错误。

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

之后,您可以使用以下命令重新打开它:

FILE* fh = fdopen(fileHandle, "rb");
于 2012-02-27T13:30:08.247 回答
-1

如果你有文件名,为什么不简单地使用

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

?

它不是比创建 QFile、打开它、检索句柄等更简单吗?

而且它几乎没有错误...

于 2013-12-24T13:12:40.867 回答