【问题标题】:Qt4: write QByteArray to file with filename?Qt4:用文件名将 QByteArray 写入文件?
【发布时间】:2012-10-10 21:17:56
【问题描述】:

我在 Qt 4 中无法写入非文本文件。我有一个 QByteArray 数据,我想将其保存到特定目录中名为“some_name.ext”的文件中:“C://MyDir”。我怎样才能做到这一点?请注意,内容不是文本。

格式为“GIF”,Qt 不支持。

QImage mainImage; 
if (!mainImage.loadFromData(aPhoto.data)) 
    return false; 
if (!mainImage.save(imageName, imageFormat.toUtf8().constData())) 
   return false; 

我想以某种方式绕过这个限制!

【问题讨论】:

  • 你为什么不展示你到目前为止所尝试的?
  • 这是我必须做的。但保存函数返回 false,因为不支持格式。所以我想如果我可以在不通过QImage的情况下保存byteArray数据,我会成功吗?!
  • 你真的确定你需要GIF格式的图片吗?使用其他格式,例如 PNG,让 Qt 的生活更轻松。
  • GIF 文件格式现在被认为是过时的。 PNG 是更好的选择。
  • 只需将“PNG”作为 save() 函数的格式。原始格式是什么并不重要。

标签: c++ image file qt bytearray


【解决方案1】:

将 QByteArray 写入文件:

QByteArray data;

// If you know the size of the data in advance, you can pre-allocate
// the needed memory with reserve() in order to avoid re-allocations
// and copying of the data as you fill it.
data.reserve(data_size_in_bytes);

// ... fill the array with data ...

// Save the data to a file.
QFile file("C:/MyDir/some_name.ext");
file.open(QIODevice::WriteOnly);
file.write(data);
file.close();

在 Qt 5(5.1 及更高版本)中,您应该在保存新的完整文件时使用QSaveFile(而不是修改现有文件中的数据)。这样可以避免写操作失败时丢失旧文件的情况:

// Save the data to a file.
QSaveFile file("C:/MyDir/some_name.ext");
file.open(QIODevice::WriteOnly);
file.write(data);
// Calling commit() is mandatory, otherwise nothing will be written.
file.commit();

当然要记得检查错误。

另请注意,即使这回答了您的问题,也可能无法解决您的问题。

【讨论】:

  • 谢谢。这就是我想做的,但现在我完成了更棘手的解决方案。我只是以不同的格式编写了 QImage,而不是这样做。
  • 只是一个问题......这不会留下写在完成之前只写数组的一部分的可能性吗?也就是说,这里不应该有while循环吗?
  • @LennartRolland 不。 write() 函数将写出整个数组。
  • @NikosC。好的,但是“写入的字节数”返回值的目的是什么?
  • @LennartRolland 对于普通文件,如果有错误,返回值为 -1。但是,对于其他 QIODevice 类型,它可能表明设备根本无法保存所有数据,在这种情况下,write() 只会返回适合的字节数,但没有错误。我不确定如果写入QFile 导致所有磁盘空间用完会发生什么。我认为在这种情况下它会返回-1。但无论哪种方式,您都不会使用循环。您只需调用一次write() 并检查返回值是否为< data.size(),在这种情况下您可以将其视为错误。
【解决方案2】:

您可以使用 QDataStream 写入二进制数据。

QFile file("outfile.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);

然后使用

QDataStream & QDataStream::writeBytes ( const char * s, uint len )

int QDataStream::writeRawData ( const char * s, int len )

【讨论】:

  • 问题不是写二进制文件,是写GIF格式的图片。
  • 我已经阅读了一个 GIF 图片,现在数据在 QByteArray 中。您是否告诉我,如果我将数据写入文件“blabla.gif”,这将是无用的(我可以打开它而不是使用 gif 文件的常规图像查看器)?
  • 是的,没用的。图像格式(如 GIF、JPG、PNG)仅在加载和保存期间使用。内部表示是不同的。仅将内部表示写入文件并为文件名提供 .gif 扩展名是行不通的。
  • 那么,那么,如何以人们可以打开并查看QByteArray中编码的美丽风景的方式保存这个'1'和'0'的大序列?
  • Qt 确实支持 GIF 图片。除非在您安装的 Qt 版本中,该支持已被禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多