1

ファイルに書き込もうとしていますが、書き込みシステム コールを使用して高速化したいと考えています。基本的に 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);
4

2 に答える 2

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より良い解決策として、代わりにa を使用することを検討してください。

template<typename T>
void writeVectorBetter(QDataStream& stream, const QVector<T>& vec)
{
    stream << vec;
}

これにより、一貫した方法でファイルから情報を読み取ることもできます。

于 2016-12-24T22:04:04.150 に答える
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;
}

その他の問題:

  1. このファイルはテキスト ファイルではないため、.txt拡張子を付けないでください。

  2. の代わりにuint16_tまたはなど、明示的なサイズの型を使用します。quint16unsigned short

于 2016-12-27T18:42:06.153 に答える