使用QDataStream从套接字中读取数据并写入文件

6
我需要通过QTcpSocket接收二进制数据(读取浮点数),并使用QDatastream将其写入Qfile。但是我在使用QDataStream时遇到了一些问题。如下所示,我只能通过以下方式实现:
QDataStream in(socket);
in.setFloatingPointPrecision ( QDataStream::SinglePrecision);
float data;
in >> data;

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

我需要创建两个QDatastream,在读取浮点数后将其写入QFile中。我的意思是,我能否通过一个QDatastream直接读取流并将其写入文件,以获得更高的效率。

我是否对使用QDataStream有所盲点?有没有人能帮我解决这个问题?非常感谢。

1个回答

2

QDataStream旨在提供跨平台的数据序列化。

例如,您想以某种二进制格式将一些浮点数保存到文件中(或通过tcp流发送),然后在具有不同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类的文档(您可以在那里找到详细的解释)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接