将stringstream作为ostream&传递,不读取任何内容

时间:2016-02-17 12:11:33

标签: c++ stringstream ostream

我正在编写一个分配,基本上,我有一个客户端和服务器进行通信。为此,我在服务器端使用字符串流处理请求(以字符串形式出现)并帮助构建字符串响应。服务器端拥有一个对象(FileManager),该对象包含多个MultimediaFile对象,每个对象都有自己的信息。该信息可以通过一种方法打印,其中一个参数是ostream&。

要从客户端获取请求,stringstream工作正常,但是当我将它传递给方法时,由于某种原因它不会读取内容(而如果我传递std :: cout它工作得很好) 。我认为它与stringstream使用<<的方式有关。操作员阅读信息,但我不确定如何纠正这一点。

我知道我可以简单地将关于对象的信息存储在字符串或类似的东西中(而不是使用ostream&),但教授希望方法直接打印到传递的ostream,而不是返回字符串

以下是代码:

bool processRequest(TCPServer::Cnx& cnx, const string& request, string& response)
{
bool changeData = false;
if (request == "delMedias" || request == "delGroups") changeData = true;

TCPServer::Lock lock(cnx, changeData);

cerr << "request: '" << request << "'" << endl;
string operation = "";
string filename = "";
stringstream iss;

iss.str(request); //next few lines get request info, works just fine!

if (iss.rdbuf()->in_avail() != 0)
    iss >> operation;
if (iss.rdbuf()->in_avail() != 0)
    iss.get();
if (iss.rdbuf()->in_avail() != 0)
    getline(iss, filename);
iss.str("");


if (operation.size() == 0 || filename.size() == 0) return false;

response = "";

if (operation.compare("print") == 0)
{
        filem.showFile(filename, iss); //Problem here!!!!
        if (iss.rdbuf()->in_avail() != 0) //iss is always empty
        {
            response = iss.str();
            response = "Print info: " + response;
        }
        else
            response = "No info received!";
}
else if (operation.compare("play") == 0)
{
        filem.playFile(filename);
        response = "File played!";
}
else
    response = "Operation not valid";

cerr << response << endl;

return true;
}

TCPServer 是教授为了让事情变得简单而提供的一个类,但基本上客户端发送一个字符串 request ,并在此函数的末尾接收一个字符串来自服务器的响应 filem 是FileManager类对象,这是 showFile 方法的代码:

void FileManager::showFile(string name, ostream& s)
{
    if (mfiles.find(name) != mfiles.end())
        mfiles[name]->printFile(s);
}

mfiles 是一个字符串到MultimediaFile *的地图(特别是MultimediaFile的std :: shared_ptr,但无论如何)。基本上,此代码检查是否存在名为 name 的文件,如果是,则调用 printFile(s)方法,其中 s 将在此处stringstream。这是方法的代码:

void MultimediaFile::printFile(ostream& s) const
{
    s << "File name: " << name << "\tFilepath: " << filepath << "\n";
}

name filepath 是MultimediaFile类的实例变量。所以,是的,我希望我的stringstream能够接收到这些信息,然后在方法调用之后用于在代码的主要部分构建响应字符串。然而,这不是发生的事情,并且stringstream总是空的(因为这适用于std :: cout,那么问题不是MultimediaFile对象中的数据)。

同样,我会说当通过&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;运营商,但在这种情况下我找不到任何可以帮助我的信息......有没有人有想法?

如果您需要任何其他信息,请告诉我们。并提前感谢!

1 个答案:

答案 0 :(得分:0)

所以,显然我找到了解决方案。

为了测试一些东西,我尝试创建一个单独的代码来检查方法对stringstream的行为方式。而且......它奏效了。我的单独测试与问题本身之间的唯一区别在于,在我的程序中,字符串流用于从请求字符串中获取数据,然后传递给方法以从中获取数据。所以,我所做的是,我创建了第二个传递给方法的字符串流......并且它有效。

基本上,这是我改变的(其余代码与原始帖子相同):

response = "";
stringstream iss2; //create another stringstream

if (operation == "print")
{
        filem.showFile(filename, iss2); //use it instead of the first one
        if (iss2.rdbuf()->in_avail() != 0)
        {
            response = iss2.str();
            response = "Print info: " + response;
        }
        else
            response = "No info received!";
}

我不知道为什么第一个字符串流不起作用;也许我用来获取请求信息的方法之一( str() get() getline()&gt;&gt; 运算符)更改stringstream的状态,以便它不接受新信息?我不知道,只是随意的想法。

但无论如何,这是有效的,所以我现在很高兴......

P.S。:我还将operation.compare("print")更改为operation == "print"。我不记得我使用比较的原因,我在编辑过程中没有像我想的那样得到任何警告,所以,是的......是的。