Stringstream未完全填充

时间:2012-12-09 12:21:10

标签: c++ sstream

为什么这段代码片段:

 if (iErr) {
    std::stringstream ss;
    string serror("error");
    ss << "lua error code " << iErr << ": " << lua_tostring(lua, -1);
    ss >> serror;

    Log *log= StandardLog::getInstance();
    log->logError("Lua error following in next line");
    log->logError(serror);

    //lua_pop(lua, 1);/* pop error message from the stack */
    return 1;
 }

打印:

Lua error following in next line
lua

而不是

Lua error following in next line
lua error code 3: lua/generator/generator_example_nodenavigator.lua:10: attempt to call global 'require' (a nil value)

Logger行看起来像这样:

void Logger::log(char message[]){
    string smessage(message);
    log(smessage);
}

void Logger::log(string smessage){
    ...
}

但似乎记录器没有故障,因为我使用cerr获得相同的输出。

2 个答案:

答案 0 :(得分:3)

输入操作符>>仅提取到下一个空格。使用std::getlinestringstream::str函数来获取字符串。

我的建议是更改为std::ostringstream并使用std::ostringstream::str

std::ostringstream oss;

oss << "lua error code " << iErr << ": " << lua_tostring(lua, -1);

Log *log= StandardLog::getInstance();
log->logError("Lua error following in next line");
log->logError(oss.str());

答案 1 :(得分:2)

您正在使用的提取运算符从输入流中读取空格分隔的字符串。因此,它会在我们输入的第一个空格中停止。

只需替换

log->logError(serror);

log->logError(ss.str());

(根本不需要serror。)