我基本上是在尝试将整数添加到字符串,然后在特定时间将结束符添加到字符串,然后继续添加整数。我希望将它们全部添加到一个字符串对象中。
所以我在字符串流中添加了一个整数,将字符串流馈入了一个字符串。然后在字符串中添加“ \ 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的两个字符。
为了演示发生了什么,我们需要检查各种流状态位。
#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 终点线