【问题标题】:Using Qdatastream read data from socket and write into file使用 Qdatastream 从套接字读取数据并写入文件
【发布时间】:2015-10-27 16:18:07
【问题描述】:

我需要通过 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并在读取后将float写入Qfile。我的意思是,我可以通过一个Qdatastream将其读取流并将其直接写入文件以提高效率。

我对QDataStream的使用有什么盲点吗?谁能帮我解决我的问题?非常感谢。

【问题讨论】:

    标签: qt file sockets qdatastream


    【解决方案1】:

    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 Class 的文档(在那里你可以找到它如何工作的详细说明)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 2014-11-04
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2021-01-01
      相关资源
      最近更新 更多