【问题标题】:Convert QFile to FILE*将 QFile 转换为 FILE*
【发布时间】:2012-03-16 23:13:36
【问题描述】:

还有其他方法可以将 QFile 转换为 File 吗?与此不同:

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

【问题讨论】:

  • 为什么需要这个?你不能简单地使用QFile 进行文件操作吗?
  • 你所拥有的有什么不能用的?
  • 因为我使用了这个函数:png_init_io(png_ptr, fh);其中第二个参数是文件 *。谢谢,是的,可以在那里使用代码,但我喜欢使用唯一的库 QFile。
  • 这段代码就是这样做的。所以解释一下为什么它不起作用。
  • Qt 还支持直接从 QFile 读取和写入 PNG 文件,使用 QImage::load/save 或 QImageReader/QImageWriter(或者如果每个文件只有一个 PNG 图像,则仅使用 QPixmap)。

标签: c++ file qt qfile


【解决方案1】:

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

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

【讨论】:

  • 如果在f 之前关闭qf 会发生什么?之后可以继续使用f 吗?
【解决方案2】:

我想你已经知道 QFile 中有各种openread 等方法。也就是说,如果文件没有打开,那么handle 方法会返回错误。

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

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

FILE* fh = fdopen(fileHandle, "rb");

【讨论】:

    【解决方案3】:

    如果你有文件名,为什么不直接使用

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

    ?

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

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

    【讨论】:

    • 这不会编译:“错误:初始化时无法将‘FILE* {aka _IO_FILE*}’转换为‘QFile*’”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2022-10-16
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多