调用readAll()后,再也无法从QIODevice检索数据。刷新缓冲区?

时间:2017-10-17 14:24:31

标签: c++ qt buffer flush

我在使用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

在我致电MyAppQXmlStreamReader成员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>

1 个答案:

答案 0 :(得分:0)

是。当你拨打QIODevice::readAll() 2次时,第二次没有得到任何东西是正常的。一切都已被阅读,没有什么可读的。

此行为是IO读取函数的标准:每次调用read()函数都会返回下一条数据。由于readAll()读到最后,进一步的调用什么都不返回。

但是,这并不一定意味着数据已被刷新。例如,当您读取文件时,它只会移动一个&#34;光标&#34;您可以使用QIODevice::seek(0)返回文件的开头。对于QNetworkReply,我猜测数据刚被丢弃。