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

时间:2015-08-05 03:54:55

标签: qt file sockets qdatastream

我需要通过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 个答案:

答案 0 :(得分:1)

.bottom旨在提供与平台无关的数据序列化。

例如,您希望以某种二进制格式将一些浮点数保存到文件(或通过tcp流发送)。 然后应该从另一台具有不同CPU甚至不同字节顺序(字节序)的PC上读取该文件(或从tcp接收)。

因此,QDataStream可用于此类任务。它允许您编码C ++基本数据类型并在任何其他平台上解码原始值。

如果您只想将TCP流中的二进制数据保存为二进制文件,则不需要QDataStream。 您可以直接使用readyRead()套接字信号同步阻塞线程或异步执行。

示例1.阻止非GUI线程的套接字

QDataStream

示例2.异步非阻塞套接字

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;
}

这些示例基于QAbstractSocket Class的文档(您可以在其中找到详细解释如何工作)。