我是C ++的新手,无法理解某些行为。
在下面有功能,在这种情况下它可以工作。

bool Network::doRequest(HTTPRequest& request, string path, string content) {
  HTTPResponse response;
  istream* respStreamPtr;
  session->sendRequest(request);
  respStreamPtr = &session->receiveResponse(response);
  if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
  {
    credentials->authenticate(request, response);
    session->sendRequest(request);
    respStreamPtr = &session->receiveResponse(response);
  }
  if (response.get("Content-Encoding") == "deflate") {
    Poco::InflatingInputStream inflater(*respStreamPtr);
    respStreamPtr = &std::istream(inflater.rdbuf());
    Logger::dumpStream(*respStreamPtr);
  }
  return true;
}


但是如果移动字符串Logger :: dumpStream(* respStreamPtr);在if块之外。像这样:

  if (response.get("Content-Encoding") == "deflate") {
    Poco::InflatingInputStream inflater(*respStreamPtr);
    respStreamPtr = &std::istream(inflater.rdbuf());
  }
  Logger::dumpStream(*respStreamPtr);


停止工作了!!!
条件(response.get(“ Content-Encoding”)==“ deflate”)始终为true;
因此,麻烦的是可见性块中的流内容。
但是我不明白我做错了什么。
请帮帮我。

附言在两种情况下都不例外。在第二种情况下,文件somefile.txt中没有数据。
在第一种情况下,文件somefile.txt具有来自http请求的膨胀数据。

void Logger::dumpStream(std::istream& inputStream) {
  fstream outStream("somefile.txt", ios_base::trunc | ios_base::out | ios_base::binary);
  outStream << inputStream.rdbuf();
  outStream.close();
}

最佳答案

我不熟悉您使用的类,但是问题很可能是Poco::InflatingInputStream inflater超出了范围。

在if语句中:

if (response.get("Content-Encoding") == "deflate") {
   Poco::InflatingInputStream inflater(*respStreamPtr);
   respStreamPtr = &std::istream(inflater.rdbuf());
}


respStreamPtr指向使用inflater对象中的缓冲区的流。一旦if语句关闭,该缓冲区将不再有效,因此您不能在外部使用您的respStreamPtr

10-02 05:38