使用Qdatastream从套接字中读取数据并写入文件
Using Qdatastream read data from socket and write into file
我需要通过 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 it.I 意思是,我可以通过一个 Qdatastream 直接读取流并将其写入文件以提高效率吗?
我是不是对QDataStream的使用有一些盲点?谁能帮我解决我的问题?非常感谢。
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.异步非阻塞socket
// This slot is connected to QAbstractSocket::readyRead()
void SocketClass::readyReadSlot()
{
while (!socket.atEnd()) {
QByteArray data = socket.read(100);
file.write(data);
}
}
这些示例基于 QAbstractSocket Class 的文档(您可以在其中找到其工作原理的详细说明)。
我需要通过 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 it.I 意思是,我可以通过一个 Qdatastream 直接读取流并将其写入文件以提高效率吗?
我是不是对QDataStream的使用有一些盲点?谁能帮我解决我的问题?非常感谢。
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.异步非阻塞socket
// This slot is connected to QAbstractSocket::readyRead()
void SocketClass::readyReadSlot()
{
while (!socket.atEnd()) {
QByteArray data = socket.read(100);
file.write(data);
}
}
这些示例基于 QAbstractSocket Class 的文档(您可以在其中找到其工作原理的详细说明)。