是否可以直接从用户(标准输入)接受字符串流?

时间:2010-08-08 17:36:10

标签: c++ stream io

这是一个使用stringstream的示例程序。目标是接受来自用户的行(标准输入)并在单独的行中打印每个单词。

int main()
{

    std::istringstream currentline;
    std::string eachword;
    std::string line;

    // Accept line from the standard input till EOF is reached
    while ( std::getline(std::cin,line) )
    {
        currentline.str(line); // Convert the input to stringstream
        while ( currentline >> eachword ) // Convert from the entire line to individual word
        {
            std::cout << eachword << std::endl;
        }
        currentline.clear();
    }
    return 0;
}

我想知道,有没有办法,我可以避免中间字符串变量(对象),行并直接将用户输入存储到当前行(istringstream对象)。

注意:

我知道,已有以下解决方案。

while ( std::cin >> eachword)
{
    std::cout << eachword << std::endl;
}

3 个答案:

答案 0 :(得分:1)

std::getline需要一个字符串引用参数,这就是它放置它所获得的行的位置,所以当然你不能避免传递这样的参数(并且仍然使用该函数)。如果你经常需要它,你可以优雅地封装构造 - 例如:

bool getline(std::istream& i, std::istringstream& current)
{
    std::string line;
    if ( std::getline(i, line) ) {
        current.str(line);
        return true;
    }
    return false;
}

答案 1 :(得分:0)

如果您想简化第一个解决方案,

while ( currentline(line) >> eachword )

答案 2 :(得分:0)

我假设您不想使用中间对象来防止不必要的复制?

您可以通过显式设置流缓冲区缓冲区来实现相同的效果。

int main()
{
    std::string line;
    std::istringstream currentline;
    std::string eachword;

    // Accept line from the standard input till EOF is reached
    while ( std::getline(std::cin,line) )
    {
        // Set the buffer without copying.
        currentline.clear();
        currentline.rdbuf()->pubsetbuf(&line[0], line.length() );

        while ( currentline >> eachword )
        {
            std::cout << eachword << std::endl;
        }
    }
    return 0;
}

由于破坏的顺序。您只需确保在用作缓冲区的对象之前销毁istringstream。所以你需要重新排列main()顶部的声明,以确保首先创建行,因此最后会被销毁(否则istringstream的析构函数有可能访问freeeded对象的内存)