我在使用QNetworkReply
时发现了一些我无法在QIODevice::readAll()
QNetworkReply
connect(this->reply, &QIODevice::readyRead, this, &MyApp::readyReadRequest);
找到最轻微提示的内容(readyReadRequest()
继承了此方法)。
以下是文档说明的内容:
从设备读取所有剩余数据,将其作为字节返回 的阵列
此功能无法报告错误;返回为空 QByteArray可能意味着当前可用的无数据 阅读,或 错误发生。
假设我有以下联系:
void MyApp::readyReadRequest()
{
LOG(INFO) << "Received data from \"" << this->url.toString() << "\"";
LOG(INFO) << "Data contents:\n" << QString(this->reply->readAll());
this->bufferReply = this->reply->readAll();
}
Ths this->bufferReply
插槽如下所示:
QByteArray
在我致电MyApp
(QXmlStreamReader
成员while (!reader.atEnd())
{
LOG(DEBUG) << "Reading next XML element";
reader.readNext();
LOG(DEBUG) << reader.tokenString();
}
if (reader.hasError())
{
LOG(ERROR) << "Encountered error while parsing XML data:" << reader.errorString();
}
)之后,出现了惊喜。我将它传递给了bufferReply
并做了:
this->bufferReply = this->reply->readAll();
想象一下,当我得到以下输出时我会感到惊讶:
2017-10-17 16:12:18,591 DEBUG [default] [void MyApp :: processReply()] [...]读取下一个XML元素
2017-10-17 16:12:18,591 DEBUG [default] [void MyApp :: processReply()] [...]无效
2017-10-17 16:12:18,591 ERROR [default]解析XML数据时遇到错误:文档提前结束
通过调试,我得到了void MyApp::readyReadRequest()
{
LOG(INFO) << "Received data from \"" << this->url.toString() << "\"";
this->bufferReply = this->reply->readAll();
LOG(INFO) << "Data contents:\n" << QString(this->bufferReply);
}
此时为空。我再次查看文档,但在阅读完毕后找不到任何暗示从设备中删除数据的内容(在我的情况下是网络回复)。
删除我打印字节数组的行或只是在readAll()
之后移动它然后打印类成员的内容修复了问题:
2017-10-17T13:48:52.5561597Z D:\BuildAgentWorkFolder\f00869677\Git\drop\publish_to_sharepoint.ps1 D:\Integration_20171017.2.zip Integration_20171017.2
2017-10-17T13:48:53.0241597Z Connecting to http://sharepoint_server/sites/TFS_DefaultCollection/NET as srv_promote...
2017-10-17T13:48:53.2737597Z ##[error]D:\BuildAgentWorkFolder\f00869677\Git\drop\publish_to_sharepoin
2017-10-17T13:48:53.2737597Z ##[error]t.ps1 : Cannot bind argument to parameter 'String' because it is null.
但是我想知道我做错了什么或文档确实不完整。
由于param
没有报告错误或者数据在给定时间点不可用,因此返回一个空字节数组是唯一可以暗示某些事情无法正常工作的事实。 / p>
答案 0 :(得分:0)
是。当你拨打QIODevice::readAll()
2次时,第二次没有得到任何东西是正常的。一切都已被阅读,没有什么可读的。
此行为是IO读取函数的标准:每次调用read()函数都会返回下一条数据。由于readAll()
读到最后,进一步的调用什么都不返回。
但是,这并不一定意味着数据已被刷新。例如,当您读取文件时,它只会移动一个&#34;光标&#34;您可以使用QIODevice::seek(0)
返回文件的开头。对于QNetworkReply
,我猜测数据刚被丢弃。