Stringstream没有送入添加了结尾字符的字符串

0 c++ stringstream

我基本上是在尝试将整数添加到字符串,然后在特定时间将结束符添加到字符串,然后继续添加整数。我希望将它们全部添加到一个字符串对象中。

所以我在字符串流中添加了一个整数,将字符串流馈入了一个字符串。然后在字符串中添加“ \ n”。

然后,我向stringstream添加了另一个int,然后再次将其提供给字符串。

不幸的是,stringstream对象中的第二个对象没有被添加到字符串中,我不确定为什么不能。

我尝试将两个对象添加到我的字符串流对象中,然后一次将它们添加到字符串中(中间有换行符),但是stringstream一次将字符串中的所有内容都添加到了字符串中,所以这是行不通的。

int main(){
    string h;
    stringstream ss;

    ss << 1;
    ss >> h;
    h += '\n';
    ss << 2;
    ss >> h;
    h += '\n';
    cout << h << "endline";
    cout << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然没有错误消息。我希望它输出:

1
2
endline
Run Code Online (Sandbox Code Playgroud)

相反,我得到

1

endline
Run Code Online (Sandbox Code Playgroud)

因此,很明显,该字符串会添加我的两个结尾字符,而不是我添加到stringstream的两个字符。

use*_*301 6

为了演示发生了什么,我们需要检查各种流状态位。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    string h;
    stringstream ss;

    if (ss << 1)
    {
        cout << "1 success. Fail " << ss.fail() 
             << " eof " << ss.eof() << " bad " << ss.bad() << endl;
        if (ss >> h)
        {
            cout << "2 success. Fail " << ss.fail() 
                 << " eof " << ss.eof() << " bad " << ss.bad() << endl;
            h += '\n';
            if (ss << 2)
            {
                cout << "3 success. Fail " << ss.fail() 
                     << " eof " << ss.eof() << " bad " << ss.bad() << endl;
                if (ss >> h)
                {
                    cout << "4 success. Fail " << ss.fail() 
                         << " eof " << ss.eof() << " bad " << ss.bad() << endl;
                    h += '\n';
                    cout << h << "endline";
                    cout << endl;
                }
                else
                {
                    cout << "4 Fail " << ss.fail() << " eof " << ss.eof() 
                         << " bad " << ss.bad() << endl;
                }
            }
            else
            {
                cout << "3 Fail " << ss.fail() << " eof " << ss.eof() 
                     << " bad " << ss.bad() << endl;
            }
        }
        else
        {
            cout << "2 Fail " << ss.fail() << " eof " << ss.eof() 
                 << " bad " << ss.bad() << endl;
        }
    }
    else
    {
        cout << "1 Fail " << ss.fail() << " eof " << ss.eof() 
             << " bad " << ss.bad() << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出量

1个成功。失败0 eof 0坏0
2成功。失败0 eof 1坏0
3失败1失败1失败0

因此,第一次写入成功。完美的胜利。但是第一个读取操作将读取流中的所有内容并到达文件的末尾(不是流是文件,而是名称被卡住了),将EOF位置1。将EOF位置1后,除了清除该位并祈求某人添加更多要读取的数据外,您无法对流执行其他任何操作。

更多数据已添加到流中,但由于EOF位,文件无法接受。

如果我们清除EOF

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    string h;
    stringstream ss;

    if (ss << 1)
    {
        cout << "1 success. Fail " << ss.fail() << " eof " << ss.eof() 
             << " bad " << ss.bad() << endl;
        if (ss >> h)
        {
            cout << "2 success. Fail " << ss.fail() << " eof " << ss.eof() 
                 << " bad " << ss.bad() << endl;
            h += '\n';
            ss.clear(); // added this
            if (ss << 2)
            {
                cout << "3 success. Fail " << ss.fail() << " eof " << ss.eof() 
                     << " bad " << ss.bad() << endl;
                if (ss >> h)
                {
                    cout << "4 success. Fail " << ss.fail() << " eof " << ss.eof() 
                         << " bad " << ss.bad() << endl;
                    h += '\n';
                    cout << h << "endline";
                    cout << endl;
                }
                else
                {
                    cout << "4 Fail " << ss.fail() << " eof " << ss.eof() 
                         << " bad " << ss.bad() << endl;
                }
            }
            else
            {
                cout << "3 Fail " << ss.fail() << " eof " << ss.eof() 
                     << " bad " << ss.bad() << endl;
            }
        }
        else
        {
            cout << "2 Fail " << ss.fail() << " eof " << ss.eof() 
                 << " bad " << ss.bad() << endl;
        }
    }
    else
    {
        cout << "1 Fail " << ss.fail() << " eof " << ss.eof() 
             << " bad " << ss.bad() << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在的输出

1个成功。失败0 eof 0坏0
2成功。失败0 eof 1坏0
3成功。失败0 eof 0坏0
4成功。失败0 eof 1坏0
2
终点线

如果我们忽略所有我添加的状态信息,我们真的可以

2
终点线

不是想要的

1个
2
终点线

因为ss >> h它将覆盖已经存在的所有内容h。“ 1 \ n”被“ 2”清除

获得所需内容的最简单方法是将所有内容写入其中,然后将内容作为string

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    string h;
    stringstream ss;

    if (ss << 1 << '\n' << 2 << '\n')
    {
        cout << ss.str() << "endline";
        cout << endl;
    }
    else
    {
        cout << "Fail " << ss.fail() << " eof " << ss.eof()
             << " bad " << ss.bad() << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这次的输出是

1个
2
终点线