C ++变量可见范围和strems

时间:2017-05-08 23:47:10

标签: c++ pointers inputstream poco-libraries

我是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; 因此,可见性在块中传输内容的麻烦。 但我无法理解我做错了什么。 请帮帮我。

P.S。在这两种情况下都不例外。在第二种情况下,文件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();
}

1 个答案:

答案 0 :(得分:2)

我不熟悉您正在使用的课程,但问题很可能<div id="home"> <div class="header"></div> <div class="landing"></div> </div>超出了范围。

在if语句中:

Poco::InflatingInputStream inflater

if (response.get("Content-Encoding") == "deflate") { Poco::InflatingInputStream inflater(*respStreamPtr); respStreamPtr = &std::istream(inflater.rdbuf()); } 指向使用respStreamPtr对象缓冲区的流。 if语句关闭后,该缓冲区不再有效,因此您无法在外部使用inflater