C++ 变量可见范围和流
C++ variable visable scopes and strems
我是 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") 始终为真;
因此,在块中可见性流内容会遇到麻烦。
但我不明白我做错了什么。
请帮助我。
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();
}
我不熟悉您正在使用的 类,但问题很可能是 Poco::InflatingInputStream inflater
超出了范围。
if 语句内部:
if (response.get("Content-Encoding") == "deflate") {
Poco::InflatingInputStream inflater(*respStreamPtr);
respStreamPtr = &std::istream(inflater.rdbuf());
}
respStreamPtr
指向一个流,该流使用来自您的 inflater
对象的缓冲区。一旦 if 语句关闭,该缓冲区将不再有效,因此您不能在外部使用 respStreamPtr
。
我是 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") 始终为真; 因此,在块中可见性流内容会遇到麻烦。 但我不明白我做错了什么。 请帮助我。
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();
}
我不熟悉您正在使用的 类,但问题很可能是 Poco::InflatingInputStream inflater
超出了范围。
if 语句内部:
if (response.get("Content-Encoding") == "deflate") {
Poco::InflatingInputStream inflater(*respStreamPtr);
respStreamPtr = &std::istream(inflater.rdbuf());
}
respStreamPtr
指向一个流,该流使用来自您的 inflater
对象的缓冲区。一旦 if 语句关闭,该缓冲区将不再有效,因此您不能在外部使用 respStreamPtr
。