代码之家  ›  专栏  ›  技术社区  ›  rbaleksandar

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

  •  0
  • rbaleksandar  · 技术社区  · 8 年前

    我刚在使用 QNetworkReply Qt documentation 对于 QIODevice::readAll() (其中 从继承此方法)。

    以下是文件说明:

    来自设备,以及 以字节形式返回 大堆 .

    此功能无法报告错误;返回 空的 QByteArray的意思可以是 没有数据 当前可用于 阅读 那是一个 发生错误

    假设我有以下联系:

    connect(this->reply, &QIODevice::readyRead, this, &MyApp::readyReadRequest);
    

    Ths公司 readyReadRequest() 插槽如下所示:

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

    在我打电话给你后,我感到惊讶 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();
    }
    

    想象一下,当我得到以下输出时,我会感到惊讶:

    2017-10-17 16:12:18591调试[默认值][作废MyApp::processReply()][…]读取下一个XML元素

    2017-10-17 16:12:18591调试[默认值][作废MyApp::processReply()][…]无效的

    2017-10-17 16:12:18591错误[默认值]在解析XML数据时遇到错误:文档过早结束

    通过调试,我得到了我的 bufferReply 此时为空。我再次查看了文档,但在阅读完之后,没有找到任何提示从设备中删除数据的内容(在我的例子中是网络回复)。

    删除打印字节数组的行,或只是将其移到后面 this->bufferReply = this->reply->readAll(); 然后打印班级成员修复问题的内容:

    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() 不报告错误或数据在给定的时间点不可用返回空字节数组是唯一提示某些内容未按预期工作的事实。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Benjamin T    8 年前

    QIODevice::readAll() 2次,第二次你什么也得不到是正常的。一切都读过了,没有更多的东西要读了。

    这种行为在IO读取函数中是标准的:每次调用read()函数都会返回下一段数据。自从 readAll() 读到最后,进一步调用将不返回任何内容。

    然而,这并不一定意味着数据已被刷新。例如,当你读取一个文件时,它只是移动一个“光标”,你可以用 QIODevice::seek(0) . 对于 QNetworkReply ,我猜数据被丢弃了。

    推荐文章