我尝试写入文件并希望使用“写入系统调用”来加快速度。基本上我有一个QVector,我想将结果存储在一个文件中。最初我只是在数组中进行迭代,但速度太慢了。所以我做了一些研究,找到了一个名为Write System Call的东西,但我无法弄清楚如何设置代码。
这是我到目前为止所尝试的:
/*Header File*/
QVector<unsigned short> rawData;
/*Implementation File*/
int fd = open("output.txt", O_WRONLY)L
write(fd, &rawData, rawData.size());
close(fd);
虽然上面的代码没有崩溃,但它实际上并没有向输出文件写入任何东西。我有什么想法我做错了吗?
编辑:
使用fwrite
我能够写入文件,但文件中的数据是一些奇怪的Unicode。基本上它不是我想要获得的数字。这就是我正在做的事情:
FILE * pFile;
pfile = fopen("pixelValues.txt", "wb");
fwrite(&rawData, sizeof(unsigned short), sizeof(rawData), pFile);
fclose(pFile);
答案 0 :(得分:3)
对象及其中的元素QVector
之间存在差异。您可能想要编写QVector
元素,所以为了做到这一点,您需要这样的东西:
template<typename T>
int writeVector(const QVector<T>& vec, int fd)
{
// note: the size argument to write() is about the number of bytes
// which is: (size of each element) * (number of elements to write)
return write(fd, vec.constData(), (sizeof(T)) * vec.size());
}
要获得更好的解决方案,请考虑改为使用QDataStream
:
template<typename T>
void writeVectorBetter(QDataStream& stream, const QVector<T>& vec)
{
stream << vec;
}
这也将确保您能够以一致的方式从文件中读回信息。
答案 1 :(得分:1)
您假设需要使用系统调用直接编写数据。没有看到你的代码,我认为可能并非如此。很可能你做的事情非常低效。
你可以做得更好:在Qt中,最简单的方法是利用QDataStream
。当您稍后读取数据时,它将尽一切可能为您提供相同的向量。它表现得相当充分:
bool write(const QString &filename, const QVector<uint16_t> &data)
{
QSaveFile f(filename);
if (!f.open(QIODevice::WriteOnly))
return false;
QDataStream s(&f);
s.setVersion(QDataStream::Qt_5_6);
s << data;
return f.commit();
}
QVector<uint16_t> read(const QString &filename)
{
QVector<uint16_t> data;
QFile f(filename);
if (!f.open(QIODevice::ReadOnly))
return data;
QDataStream s(&f);
s.setVersion(QDataStream::Qt_5_6);
s >> data;
if (s.status() != QDataStream::Ok)
data.clear();
return data;
}
其他问题:
该文件不是文本文件,因此请勿为其提供.txt
分机。
使用具有明确尺寸的类型,例如uint16_t
或quint16
而不是unsigned short
。