将QFile转换为FILE*

8
有没有一种将QFile转换为File的方法?除了这个之外还有其他方法吗?
QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");

3
为什么需要这个?难道不能简单地使用QFile进行文件操作吗? - Etienne de Martel
你的代码出了什么问题? - Mat
因为我使用了这个函数:png_init_io(png_ptr, fh); 其中第二个参数是File *。谢谢。是的,我在代码中使用它,但我喜欢只使用库QFile。 - Jjreina
这段代码是实现它的方式。那么请解释为什么它不起作用。 - Joe
1
Qt还支持直接从QFile读写PNG文件,使用QImage :: load / save或QImageReader / QImageWriter(如果每个文件只有一个PNG图像,则只需使用QPixmap)。 - alexisdm
谢谢,我将尝试使用QImage或QPixmap。 - Jjreina
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
}

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


1
如果在关闭 f 之前关闭 qf,会发生什么?之后还能继续使用 f 吗? - Super-intelligent Shade

7

我认为您已经知道在QFile中有各种方法,例如open, read等。但是,如果文件没有被打开,那么handle方法会返回一个错误。

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

之后,您可以使用以下方式重新打开它:
FILE* fh = fdopen(fileHandle, "rb");

-1
如果您有文件名,为什么不直接使用呢?
QFile *file = fopen(filename.toLocal8Bit().data(), "rb");

?

相比于创建QFile、打开它、检索句柄等操作,这难道不是更简单的方法吗?

而且它几乎没有bug...


这个无法编译: “错误:无法将‘FILE* {aka _IO_FILE*}’转换为‘QFile*’进行初始化” - Étienne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接