Stringstream 没有输入添加了结束符的字符串

Stringstream is not feeding into a string that has a endline character added to it

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

所以我向stringstream 添加了一个int,将stringstream 提供给一个字符串。然后在字符串中添加'\n'。

然后我在stringstream中添加了另一个int,并再次将其提供给string。

不幸的是,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;
}

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

1
2
endline

相反我得到

1

endline

很明显,该字符串添加了我的两个结束字符,但没有添加我添加到字符串流中的 2 个字符。

使用stringstream建立你想要的输出,然后提取字符串。

ss << 1 << '\n';
ss << 2 << '\n';
h = ss.str();

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

#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;
}

输出

1 success. Fail 0 eof 0 bad 0
2 success. Fail 0 eof 1 bad 0
3 Fail 1 eof 1 bad 0

所以第一次写成功了。无懈可击的胜利。但是第一次读取读取了流中的所有内容并到达文件末尾(不是流是文件,而是名称卡住了),设置了 EOF 位。一旦设置了 EOF 位,除了清除该位并祈祷有人添加更多数据以供读取之外,您对流无能为力。

流中添加了更多数据,但由于 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;
}

现在输出

1 success. Fail 0 eof 0 bad 0
2 success. Fail 0 eof 1 bad 0
3 success. Fail 0 eof 0 bad 0
4 success. Fail 0 eof 1 bad 0
2
endline

如果我们忽略我添加的所有状态信息,我们真的得到了

2
endline

不是想要的

1
2
endline

因为 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;
}

这次的输出是

1
2
endline