6

QTcpSocket を介してバイナリ データ (フロートを読み取る) を受信し、QDatastream を使用して Qfile に書き込む必要があります。しかし、QDataStream に問題があります。次のように、私はこの方法でしか達成できません:</p>

QDataStream in(socket);
in.setFloatingPointPrecision ( QDataStream::SinglePrecision);
float data;
in >> data;

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

2 つの Qdatastream を作成し、それを読み取った後に float を Qfile に書き込む必要があります。つまり、より効率的にするために、1 つの Qdatastream で直接ストリームを読み取ってファイルに書き込むことができます。

QDataStream の使用について盲点がありますか?誰でも私の問題を解決するのを手伝ってくれますか?どうもありがとう。

4

1 に答える 1

2

QDataStreamプラットフォームに依存しないデータのシリアル化を提供するように設計されています。

たとえば、float をバイナリ形式でファイルに保存したい (または tcp ストリーム経由で送信したい) とします。次に、この float は、異なる CPU と異なるバイト オーダー (エンディアン) を備えた別の PC で、そのファイルから読み取る (または tcp から受信する) 必要があります。

したがって、そのQDataStreamようなタスクに使用できます。C++ の基本的なデータ型をエンコードし、他のプラットフォームで元の値をデコードすることができます。

バイナリ データを TCP ストリームからそのままバイナリ ファイルに保存するだけの場合は、QDataStream. スレッドを同期的にブロックするか、readyRead() ソケットシグナルを使用して非同期的に直接行うことができます。

例 1. 非 GUI スレッドのソケットのブロック

QFile file("out.bin");
if (!file.open(QIODevice::WriteOnly))
    return;

char buffer[50];
forever {
    int numRead  = socket.read(buffer, 50);
    // do whatever with array
    file.write(buffer, numRead);

    if (numRead == 0 && !socket.waitForReadyRead())
        break;
}

例 2. 非同期ノンブロッキング ソケット

// This slot is connected to QAbstractSocket::readyRead()
void SocketClass::readyReadSlot()
{
    while (!socket.atEnd()) {
        QByteArray data = socket.read(100);
        file.write(data);
    }
}

これらの例は、 QAbstractSocket クラスのドキュメントに基づいています(どのように機能するかについての詳細な説明があります)。

于 2015-08-07T21:48:44.157 に答える